forked from Upstream/CommandPanels
Compare commits
134 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
690ac0e6bf | ||
|
86aecb856a | ||
|
e58adfa9f5 | ||
|
5473206adf | ||
|
aced7b6243 | ||
|
98a02f2408 | ||
|
5f5db64255 | ||
|
9975b2f76a | ||
|
768b2a6de9 | ||
|
8b518e3cb7 | ||
|
372a9c0e86 | ||
|
3034ecd8f3 | ||
|
15766dca58 | ||
|
42e61009db | ||
|
f068a61596 | ||
|
a27360f8ff | ||
|
6f2a39d613 | ||
|
6c390a98f2 | ||
|
9aa6a64f1e | ||
|
a8663e41a7 | ||
|
843ba8b393 | ||
|
2bc6259e41 | ||
|
44e4c5831e | ||
|
724d5039c0 | ||
|
558ab7d7b5 | ||
|
d35517af76 | ||
|
2b354a62f7 | ||
|
64bc5f8f60 | ||
|
d1645d6bbb | ||
|
ad25df283f | ||
|
43d1b221b5 | ||
|
43dbaafc94 | ||
|
47aabb03b2 | ||
|
f3e9e023e6 | ||
|
df03148d84 | ||
|
b8ee48a384 | ||
|
016d67f7c8 | ||
|
66944ab903 | ||
|
fe32486b0b | ||
|
ed1b30c6f6 | ||
|
3e9c40c160 | ||
|
e163347f7d | ||
|
abafd085aa | ||
|
53dafd8f69 | ||
|
1ae3b62463 | ||
|
e5cef06194 | ||
|
24a72b82dd | ||
|
68591c7a11 | ||
|
6c558177ec | ||
|
10dc42ac3c | ||
|
6138ef1e2d | ||
|
1830c900db | ||
|
6551246c7a | ||
|
deab494c45 | ||
|
41383140b5 | ||
|
7dadce2fd7 | ||
|
388c7d7a4b | ||
|
c48779291d | ||
|
b88a5d62a9 | ||
|
21737bb99c | ||
|
b47857cb14 | ||
|
1cf7d0a4e0 | ||
|
614a9c77d5 | ||
|
7525db4bf2 | ||
|
d842ddff30 | ||
|
6bfbe3338a | ||
|
569a8172b9 | ||
|
b512d94624 | ||
|
1b71947d13 | ||
|
acca60a4fa | ||
|
0b5b776eb0 | ||
|
b1e91b7616 | ||
|
b9ca25eed6 | ||
|
056c547605 | ||
|
4da33349a5 | ||
|
31cea874c0 | ||
|
41ba7f31e7 | ||
|
1f71e26b4d | ||
|
5d0dd09e5b | ||
|
d210e016b0 | ||
|
2236f07eec | ||
|
67019348bb | ||
|
06c30c018d | ||
|
912d79c9de | ||
|
819ebc4592 | ||
|
336190f071 | ||
|
39ee2a6b21 | ||
|
2aced6e917 | ||
|
60e24fd45f | ||
|
c10919da43 | ||
|
74d9aa1d8a | ||
|
fad0e1fa39 | ||
|
b2b04906b8 | ||
|
5dee0f8a93 | ||
|
0f0d5dca84 | ||
|
277fe46859 | ||
|
02b2422de0 | ||
|
e8a5dbc1cd | ||
|
0de82db750 | ||
|
13ceeb43a1 | ||
|
f384bec035 | ||
|
27648b7642 | ||
|
d9fb7080f4 | ||
|
b5d3a9b5c6 | ||
|
ac721b0770 | ||
|
81f1f611dd | ||
|
3d24f93d84 | ||
|
d43fcfa1b1 | ||
|
7961db8520 | ||
|
8e022869af | ||
|
b4109fa071 | ||
|
02dc119a65 | ||
|
a1fbb3aca4 | ||
|
ec32f96c2a | ||
|
605d332e78 | ||
|
228ccec717 | ||
|
394b27604c | ||
|
8d7c1cd6e8 | ||
|
351bd14053 | ||
|
3f2c6187bb | ||
|
f93e126260 | ||
|
8a176ed18b | ||
|
840bd53d66 | ||
|
69b650bc41 | ||
|
ff61588559 | ||
|
a9919eb705 | ||
|
48367ae177 | ||
|
a13717234d | ||
|
ca27f9bd07 | ||
|
b91ba6403e | ||
|
04d344eef2 | ||
|
e4c2adc822 | ||
|
fff7fd4226 | ||
|
824a091fb0 |
30
.gitea/workflows/build.yml
Normal file
30
.gitea/workflows/build.yml
Normal file
@ -0,0 +1,30 @@
|
||||
name: Build CommandPanels plugin
|
||||
run-name: Build CommandPanels plugin
|
||||
on: [push]
|
||||
jobs:
|
||||
Build-latest-jar:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Build | Prepare packages
|
||||
run: |
|
||||
apt update; apt-get install software-properties-common -y
|
||||
wget -O- https://apt.corretto.aws/corretto.key | apt-key add -
|
||||
add-apt-repository 'deb https://apt.corretto.aws stable main'
|
||||
apt-get update; apt-get install -y maven java-21-amazon-corretto-jdk
|
||||
- name: Setup git
|
||||
run: |
|
||||
git config --global user.name "Radim Lipovčan"
|
||||
git config --global user.email "radim@lipovcan.cz"
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
- name: Build | Maven clean build
|
||||
run: |
|
||||
mvn clean install && ls -lah && ls */ -lah && ls */* -lah&& ls */*/* -lah
|
||||
- name: Push | Create release
|
||||
uses: https://git.lipovcan.cz/Upstream/gitea-release-action.git@v1
|
||||
with:
|
||||
files: |-
|
||||
target/CommandPanels-DEV.jar
|
||||
- name: Push | Old FTP way to gitea.lipovcan.cz:8081
|
||||
run: |
|
||||
curl --insecure --user username:mypass -T ./target/CommandPanels-DEV.jar ftp://192.168.10.133:/
|
26
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
26
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -33,6 +33,7 @@ body:
|
||||
- 1.17
|
||||
- 1.18
|
||||
- 1.19
|
||||
- 1.20
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
@ -40,6 +41,21 @@ body:
|
||||
attributes:
|
||||
label: What CommandPanels version are you using?
|
||||
options:
|
||||
- latest
|
||||
- 3.20.0.3
|
||||
- 3.20.0.2
|
||||
- 3.20.0.1
|
||||
- 3.19.0.3
|
||||
- 3.19.0.2
|
||||
- 3.19.0.1
|
||||
- 3.19.0.0
|
||||
- 3.18.6.2
|
||||
- 3.18.6.1
|
||||
- 3.18.6.0
|
||||
- 3.18.5.1
|
||||
- 3.18.5.0
|
||||
- 3.18.4.1
|
||||
- 3.18.4.0
|
||||
- 3.18.3.0
|
||||
- 3.18.2.0
|
||||
- 3.18.1.4
|
||||
@ -54,16 +70,6 @@ body:
|
||||
- 3.17.4.1
|
||||
- 3.17.4.0
|
||||
- 3.17.3.1
|
||||
- 3.17.3.0
|
||||
- 3.17.2.2
|
||||
- 3.17.2.1
|
||||
- 3.17.2.0
|
||||
- 3.17.1.5
|
||||
- 3.17.1.4
|
||||
- 3.17.1.3
|
||||
- 3.17.1.2
|
||||
- 3.17.1.1
|
||||
- 3.17.1.0
|
||||
- Any other version
|
||||
validations:
|
||||
required: true
|
||||
|
34
.github/ISSUE_TEMPLATE/need-help.yml
vendored
34
.github/ISSUE_TEMPLATE/need-help.yml
vendored
@ -1,6 +1,6 @@
|
||||
name: Need help
|
||||
description: Create an issue for a problem you are having.
|
||||
labels: ["help wanted"]
|
||||
labels: [ "help wanted" ]
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: searched
|
||||
@ -31,13 +31,29 @@ body:
|
||||
- 1.17
|
||||
- 1.18
|
||||
- 1.19
|
||||
- 1.20
|
||||
validations:
|
||||
required: true
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: commandpanels_version
|
||||
attributes:
|
||||
label: What CommandPanels version are you using?
|
||||
options:
|
||||
- latest
|
||||
- 3.20.0.3
|
||||
- 3.20.0.2
|
||||
- 3.20.0.1
|
||||
- 3.19.0.3
|
||||
- 3.19.0.2
|
||||
- 3.19.0.1
|
||||
- 3.19.0.0
|
||||
- 3.18.6.2
|
||||
- 3.18.6.1
|
||||
- 3.18.6.0
|
||||
- 3.18.5.1
|
||||
- 3.18.5.0
|
||||
- 3.18.4.1
|
||||
- 3.18.4.0
|
||||
- 3.18.3.0
|
||||
- 3.18.2.0
|
||||
- 3.18.1.4
|
||||
@ -52,19 +68,9 @@ body:
|
||||
- 3.17.4.1
|
||||
- 3.17.4.0
|
||||
- 3.17.3.1
|
||||
- 3.17.3.0
|
||||
- 3.17.2.2
|
||||
- 3.17.2.1
|
||||
- 3.17.2.0
|
||||
- 3.17.1.5
|
||||
- 3.17.1.4
|
||||
- 3.17.1.3
|
||||
- 3.17.1.2
|
||||
- 3.17.1.1
|
||||
- 3.17.1.0
|
||||
- Any other version
|
||||
validations:
|
||||
required: true
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: server_software
|
||||
attributes:
|
||||
@ -82,7 +88,7 @@ body:
|
||||
- Velocity
|
||||
- Travertine
|
||||
validations:
|
||||
required: true
|
||||
required: true
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,2 +1,5 @@
|
||||
# Project exclude paths
|
||||
/out/
|
||||
/out/
|
||||
/target/
|
||||
.idea/
|
||||
.github
|
@ -9,8 +9,5 @@
|
||||
<module name="CommandPanels" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
<bytecodeTargetLevel>
|
||||
<module name="CommandPanels" target="1.8" />
|
||||
</bytecodeTargetLevel>
|
||||
</component>
|
||||
</project>
|
@ -5,10 +5,5 @@
|
||||
<file url="file://$PROJECT_DIR$/resource_editor" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/resource_example" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resource" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resource_editor" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resource_example" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/me/rockyhawk/commandpanels" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
@ -6,21 +6,41 @@
|
||||
<option name="name" value="Central Repository" />
|
||||
<option name="url" value="https://repo.maven.apache.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jeff-media-public" />
|
||||
<option name="name" value="jeff-media-public" />
|
||||
<option name="url" value="https://hub.jeff-media.com/nexus/repository/jeff-media-public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jitpack.io" />
|
||||
<option name="name" value="jitpack.io" />
|
||||
<option name="url" value="https://jitpack.io" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jeff-media-public" />
|
||||
<option name="name" value="jeff-media-public" />
|
||||
<option name="url" value="https://hub.jeff-media.com/nexus/repository/jeff-media-public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="io.papermc" />
|
||||
<option name="name" value="io.papermc" />
|
||||
<option name="url" value="https://papermc.io/repo/repository/maven-releases/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="sonatype" />
|
||||
<option name="name" value="sonatype" />
|
||||
<option name="url" value="https://oss.sonatype.org/content/groups/public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="io.papermc" />
|
||||
<option name="name" value="io.papermc" />
|
||||
<option name="url" value="https://repo.papermc.io/repository/maven-public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="codemc-repo" />
|
||||
<option name="name" value="codemc-repo" />
|
||||
<option name="url" value="https://repo.codemc.io/repository/maven-public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="opencollab-snapshot" />
|
||||
<option name="name" value="opencollab-snapshot" />
|
||||
<option name="url" value="https://repo.opencollab.dev/main/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="placeholderapi" />
|
||||
<option name="name" value="placeholderapi" />
|
||||
@ -32,14 +52,9 @@
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="ess-repo" />
|
||||
<option name="name" value="ess-repo" />
|
||||
<option name="url" value="http://repo.ess3.net/content/groups/essentials" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="BenCodez Repo" />
|
||||
<option name="name" value="BenCodez Repo" />
|
||||
<option name="url" value="https://nexus.bencodez.com/repository/maven-public/" />
|
||||
<option name="id" value="oraxen" />
|
||||
<option name="name" value="Oraxen Repository" />
|
||||
<option name="url" value="https://repo.oraxen.com/#/releases" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="phoenix" />
|
||||
@ -47,9 +62,24 @@
|
||||
<option name="url" value="https://nexus.phoenixdevt.fr/repository/maven-public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="papermc" />
|
||||
<option name="name" value="papermc" />
|
||||
<option name="url" value="https://repo.papermc.io/repository/maven-public/" />
|
||||
<option name="id" value="BenCodez Repo" />
|
||||
<option name="name" value="BenCodez Repo" />
|
||||
<option name="url" value="https://nexus.bencodez.com/repository/maven-public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="central" />
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="oraxen" />
|
||||
<option name="name" value="Oraxen Repository" />
|
||||
<option name="url" value="https://repo.oraxen.com/releases" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="github" />
|
||||
<option name="name" value="github" />
|
||||
<option name="url" value="https://maven.pkg.github.com/xap3y/skullcreator" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jitpack-repo" />
|
||||
@ -67,14 +97,9 @@
|
||||
<option name="url" value="https://hub.spigotmc.org/nexus/content/repositories/snapshots/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="vault" />
|
||||
<option name="name" value="vault" />
|
||||
<option name="url" value="https://dev.bukkit.org/projects/vault" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="ess-repo" />
|
||||
<option name="name" value="ess-repo" />
|
||||
<option name="url" value="https://repo.ess3.net/content/groups/essentials" />
|
||||
<option name="id" value="jeff-media-public" />
|
||||
<option name="name" value="jeff-media-public" />
|
||||
<option name="url" value="https://repo.jeff-media.com/public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jboss.community" />
|
||||
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.arcaniax:HeadDatabase-API:1.3.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/arcaniax/HeadDatabase-API/1.3.1/HeadDatabase-API-1.3.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/arcaniax/HeadDatabase-API/1.3.1/HeadDatabase-API-1.3.1-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/arcaniax/HeadDatabase-API/1.3.1/HeadDatabase-API-1.3.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.bencodez:advancedcore:3.6.4">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/bencodez/advancedcore/3.6.4/advancedcore-3.6.4.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/bencodez/advancedcore/3.6.4/advancedcore-3.6.4-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/bencodez/advancedcore/3.6.4/advancedcore-3.6.4-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.bencodez:votingplugin:6.11.3">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/bencodez/votingplugin/6.11.3/votingplugin-6.11.3.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/bencodez/votingplugin/6.11.3/votingplugin-6.11.3-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/bencodez/votingplugin/6.11.3/votingplugin-6.11.3-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.github.MilkBowl:VaultAPI:1.7">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/MilkBowl/VaultAPI/1.7/VaultAPI-1.7.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/MilkBowl/VaultAPI/1.7/VaultAPI-1.7-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/MilkBowl/VaultAPI/1.7/VaultAPI-1.7-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.github.Realizedd:TokenManager:3.2.4">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/Realizedd/TokenManager/3.2.4/TokenManager-3.2.4.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/Realizedd/TokenManager/3.2.4/TokenManager-3.2.4-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/Realizedd/TokenManager/3.2.4/TokenManager-3.2.4-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.github.Ssomar-Developement:SCore:3.9.43">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/Ssomar-Developement/SCore/3.9.43/SCore-3.9.43.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/Ssomar-Developement/SCore/3.9.43/SCore-3.9.43-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/github/Ssomar-Developement/SCore/3.9.43/SCore-3.9.43-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.code.findbugs:jsr305:2.0.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/2.0.1/jsr305-2.0.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/2.0.1/jsr305-2.0.1-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/2.0.1/jsr305-2.0.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.code.gson:gson:2.10">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.10/gson-2.10.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.10/gson-2.10-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.10/gson-2.10-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.errorprone:error_prone_annotations:2.11.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.guava:failureaccess:1.0.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.guava:guava:31.1-jre">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/guava/31.1-jre/guava-31.1-jre-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/guava/31.1-jre/guava-31.1-jre-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.j2objc:j2objc-annotations:1.3">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<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>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.mojang:authlib:1.5.21">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/mojang/authlib/1.5.21/authlib-1.5.21.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/mojang/authlib/1.5.21/authlib-1.5.21-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/mojang/authlib/1.5.21/authlib-1.5.21-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.zaxxer:HikariCP:3.4.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/zaxxer/HikariCP/3.4.1/HikariCP-3.4.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/zaxxer/HikariCP/3.4.1/HikariCP-3.4.1-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/zaxxer/HikariCP/3.4.1/HikariCP-3.4.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: commons-codec:commons-codec:1.9">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.9/commons-codec-1.9.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.9/commons-codec-1.9-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.9/commons-codec-1.9-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: commons-io:commons-io:2.11.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<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>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: de.jeff_media:ChestSortAPI:13.0.0-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/de/jeff_media/ChestSortAPI/13.0.0-SNAPSHOT/ChestSortAPI-13.0.0-20220205.090010-5.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/de/jeff_media/ChestSortAPI/13.0.0-SNAPSHOT/ChestSortAPI-13.0.0-20220205.090010-5-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/de/jeff_media/ChestSortAPI/13.0.0-SNAPSHOT/ChestSortAPI-13.0.0-20220205.090010-5-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: io.leangen.geantyref:geantyref:1.3.11">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/leangen/geantyref/geantyref/1.3.11/geantyref-1.3.11.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/leangen/geantyref/geantyref/1.3.11/geantyref-1.3.11-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/leangen/geantyref/geantyref/1.3.11/geantyref-1.3.11-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: io.lumine:MythicLib-dist:1.5.1-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/lumine/MythicLib-dist/1.5.1-SNAPSHOT/MythicLib-dist-1.5.1-20230324.231231-6.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/lumine/MythicLib-dist/1.5.1-SNAPSHOT/MythicLib-dist-1.5.1-20230324.231231-6-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/lumine/MythicLib-dist/1.5.1-SNAPSHOT/MythicLib-dist-1.5.1-20230324.231231-6-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: io.papermc:paperlib:1.0.6">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/papermc/paperlib/1.0.6/paperlib-1.0.6.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/papermc/paperlib/1.0.6/paperlib-1.0.6-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/io/papermc/paperlib/1.0.6/paperlib-1.0.6-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<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>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: me.clip:placeholderapi:2.11.3">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/me/clip/placeholderapi/2.11.3/placeholderapi-2.11.3.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/me/clip/placeholderapi/2.11.3/placeholderapi-2.11.3-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/me/clip/placeholderapi/2.11.3/placeholderapi-2.11.3-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.Indyuce:MMOItems-API:6.9.2-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/Indyuce/MMOItems-API/6.9.2-SNAPSHOT/MMOItems-API-6.9.2-20230324.230733-5.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/Indyuce/MMOItems-API/6.9.2-SNAPSHOT/MMOItems-API-6.9.2-20230324.230733-5-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/Indyuce/MMOItems-API/6.9.2-SNAPSHOT/MMOItems-API-6.9.2-20230324.230733-5-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.essentialsx:1_12Provider:2.19.7">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/1_12Provider/2.19.7/1_12Provider-2.19.7.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/1_12Provider/2.19.7/1_12Provider-2.19.7-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/1_12Provider/2.19.7/1_12Provider-2.19.7-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.essentialsx:1_8Provider:2.19.7">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/1_8Provider/2.19.7/1_8Provider-2.19.7.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/1_8Provider/2.19.7/1_8Provider-2.19.7-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/1_8Provider/2.19.7/1_8Provider-2.19.7-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.essentialsx:BaseProviders:2.19.7">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/BaseProviders/2.19.7/BaseProviders-2.19.7.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/BaseProviders/2.19.7/BaseProviders-2.19.7-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/BaseProviders/2.19.7/BaseProviders-2.19.7-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.essentialsx:EssentialsX:2.19.7">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/EssentialsX/2.19.7/EssentialsX-2.19.7.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/EssentialsX/2.19.7/EssentialsX-2.19.7-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/EssentialsX/2.19.7/EssentialsX-2.19.7-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.essentialsx:NMSReflectionProvider:2.19.7">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/NMSReflectionProvider/2.19.7/NMSReflectionProvider-2.19.7.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/NMSReflectionProvider/2.19.7/NMSReflectionProvider-2.19.7-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/NMSReflectionProvider/2.19.7/NMSReflectionProvider-2.19.7-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.essentialsx:PaperProvider:2.19.7">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/PaperProvider/2.19.7/PaperProvider-2.19.7.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/PaperProvider/2.19.7/PaperProvider-2.19.7-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/essentialsx/PaperProvider/2.19.7/PaperProvider-2.19.7-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-nbt:4.13.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-nbt/4.13.0/adventure-nbt-4.13.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-nbt/4.13.0/adventure-nbt-4.13.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-nbt/4.13.0/adventure-nbt-4.13.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-platform-api:4.3.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-api/4.3.0/adventure-platform-api-4.3.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-api/4.3.0/adventure-platform-api-4.3.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-api/4.3.0/adventure-platform-api-4.3.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-platform-bukkit:4.3.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-bukkit/4.3.0/adventure-platform-bukkit-4.3.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-bukkit/4.3.0/adventure-platform-bukkit-4.3.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-bukkit/4.3.0/adventure-platform-bukkit-4.3.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-platform-facet:4.3.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-facet/4.3.0/adventure-platform-facet-4.3.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-facet/4.3.0/adventure-platform-facet-4.3.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-facet/4.3.0/adventure-platform-facet-4.3.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-platform-viaversion:4.3.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-viaversion/4.3.0/adventure-platform-viaversion-4.3.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-viaversion/4.3.0/adventure-platform-viaversion-4.3.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-platform-viaversion/4.3.0/adventure-platform-viaversion-4.3.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-text-serializer-bungeecord:4.3.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-bungeecord/4.3.0/adventure-text-serializer-bungeecord-4.3.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-bungeecord/4.3.0/adventure-text-serializer-bungeecord-4.3.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-bungeecord/4.3.0/adventure-text-serializer-bungeecord-4.3.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-text-serializer-gson:4.13.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-gson/4.13.0/adventure-text-serializer-gson-4.13.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-gson/4.13.0/adventure-text-serializer-gson-4.13.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-gson/4.13.0/adventure-text-serializer-gson-4.13.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-text-serializer-gson-legacy-impl:4.13.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-gson-legacy-impl/4.13.0/adventure-text-serializer-gson-legacy-impl-4.13.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-gson-legacy-impl/4.13.0/adventure-text-serializer-gson-legacy-impl-4.13.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-gson-legacy-impl/4.13.0/adventure-text-serializer-gson-legacy-impl-4.13.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:adventure-text-serializer-legacy:4.13.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-legacy/4.13.0/adventure-text-serializer-legacy-4.13.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-legacy/4.13.0/adventure-text-serializer-legacy-4.13.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/adventure-text-serializer-legacy/4.13.0/adventure-text-serializer-legacy-4.13.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:examination-api:1.3.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/examination-api/1.3.0/examination-api-1.3.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/examination-api/1.3.0/examination-api-1.3.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/examination-api/1.3.0/examination-api-1.3.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.kyori:examination-string:1.3.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/examination-string/1.3.0/examination-string-1.3.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/examination-string/1.3.0/examination-string-1.3.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/kyori/examination-string/1.3.0/examination-string-1.3.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: net.md-5:bungeecord-chat:1.16-R0.4">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/md-5/bungeecord-chat/1.16-R0.4/bungeecord-chat-1.16-R0.4.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/md-5/bungeecord-chat/1.16-R0.4/bungeecord-chat-1.16-R0.4-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/net/md-5/bungeecord-chat/1.16-R0.4/bungeecord-chat-1.16-R0.4-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.apache.commons:commons-lang3:3.3.2">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.apache.logging.log4j:log4j-api:2.0-beta9">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.apache.logging.log4j:log4j-core:2.0-beta9">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.bstats:bstats-base:2.2.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-base/2.2.1/bstats-base-2.2.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-base/2.2.1/bstats-base-2.2.1-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-base/2.2.1/bstats-base-2.2.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.bstats:bstats-bukkit:3.0.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-bukkit/3.0.1/bstats-bukkit-3.0.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-bukkit/3.0.1/bstats-bukkit-3.0.1-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-bukkit/3.0.1/bstats-bukkit-3.0.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.bstats:bstats-velocity:2.2.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-velocity/2.2.1/bstats-velocity-2.2.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-velocity/2.2.1/bstats-velocity-2.2.1-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bstats/bstats-velocity/2.2.1/bstats-velocity-2.2.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.bukkit:bukkit:1.13.1-R0.1-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bukkit/bukkit/1.13.1-R0.1-SNAPSHOT/bukkit-1.13.1-R0.1-20181022.190036-99.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bukkit/bukkit/1.13.1-R0.1-SNAPSHOT/bukkit-1.13.1-R0.1-20181022.190036-99-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/bukkit/bukkit/1.13.1-R0.1-SNAPSHOT/bukkit-1.13.1-R0.1-20181022.190036-99-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.checkerframework:checker-qual:3.14.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.14.0/checker-qual-3.14.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.14.0/checker-qual-3.14.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.14.0/checker-qual-3.14.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<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>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.jetbrains:annotations:19.0.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/19.0.0/annotations-19.0.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/19.0.0/annotations-19.0.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/19.0.0/annotations-19.0.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.slf4j:slf4j-api:1.7.25">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.slf4j:slf4j-simple:1.7.5">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-simple/1.7.5/slf4j-simple-1.7.5.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-simple/1.7.5/slf4j-simple-1.7.5-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-simple/1.7.5/slf4j-simple-1.7.5-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spigotmc/spigot-api/1.19.3-R0.1-SNAPSHOT/spigot-api-1.19.3-R0.1-20230314.163538-56.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spigotmc/spigot-api/1.19.3-R0.1-SNAPSHOT/spigot-api-1.19.3-R0.1-20230314.163538-56-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spigotmc/spigot-api/1.19.3-R0.1-SNAPSHOT/spigot-api-1.19.3-R0.1-20230314.163538-56-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.spongepowered:configurate-core:4.1.2">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spongepowered/configurate-core/4.1.2/configurate-core-4.1.2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spongepowered/configurate-core/4.1.2/configurate-core-4.1.2-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spongepowered/configurate-core/4.1.2/configurate-core-4.1.2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.spongepowered:configurate-yaml:4.1.2">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spongepowered/configurate-yaml/4.1.2/configurate-yaml-4.1.2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spongepowered/configurate-yaml/4.1.2/configurate-yaml-4.1.2-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/spongepowered/configurate-yaml/4.1.2/configurate-yaml-4.1.2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.yaml:snakeyaml:1.33">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.33/snakeyaml-1.33.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.33/snakeyaml-1.33-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.33/snakeyaml-1.33-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +0,0 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: xyz.upperlevel.spigot.book:spigot-book-api:1.6">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/xyz/upperlevel/spigot/book/spigot-book-api/1.6/spigot-book-api-1.6.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/xyz/upperlevel/spigot/book/spigot-book-api/1.6/spigot-book-api-1.6-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/xyz/upperlevel/spigot/book/spigot-book-api/1.6/spigot-book-api-1.6-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -1,13 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="workspaceImportForciblyTurnedOn" value="true" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17 (2)" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="17" project-jdk-type="JavaSDK" />
|
||||
</project>
|
@ -1,81 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||
<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" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/resource" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/resource_editor" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/resource_example" type="java-resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="spigot" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-minimessage:4.11.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-api:4.11.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-key:4.11.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-api:1.3.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-string:1.3.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: de.jeff_media:ChestSortAPI:13.0.0-SNAPSHOT" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jetbrains:annotations:19.0.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.gson:gson:2.10" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.16-R0.4" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.33" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.mojang:authlib:1.5.21" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-lang3:3.3.2" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.logging.log4j:log4j-core:2.0-beta9" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-codec:commons-codec:1.9" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.logging.log4j:log4j-api:2.0-beta9" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:jsr305:2.0.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.bencodez:votingplugin:6.11.3" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bstats:bstats-velocity:2.2.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bstats:bstats-base:2.2.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.bencodez:advancedcore:3.6.4" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.zaxxer:HikariCP:3.4.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-simple:1.7.5" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: xyz.upperlevel.spigot.book:spigot-book-api:1.6" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: me.clip:placeholderapi:2.11.3" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bstats:bstats-bukkit:3.0.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-bukkit:4.3.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-api:4.3.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-bungeecord:4.3.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-legacy:4.13.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-nbt:4.13.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-gson:4.13.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-gson-legacy-impl:4.13.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-facet:4.3.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-viaversion:4.3.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.MilkBowl:VaultAPI:1.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:bukkit:1.13.1-R0.1-SNAPSHOT" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: junit:junit:4.10" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.Indyuce:MMOItems-API:6.9.2-SNAPSHOT" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: io.lumine:MythicLib-dist:1.5.1-SNAPSHOT" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.Realizedd:TokenManager:3.2.4" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.arcaniax:HeadDatabase-API:1.3.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.Ssomar-Developement:SCore:3.9.43" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.essentialsx:EssentialsX:2.19.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: io.papermc:paperlib:1.0.6" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.essentialsx:BaseProviders:2.19.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.essentialsx:PaperProvider:2.19.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.essentialsx:NMSReflectionProvider:2.19.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.essentialsx:1_8Provider:2.19.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.essentialsx:1_12Provider:2.19.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spongepowered:configurate-yaml:4.1.2" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spongepowered:configurate-core:4.1.2" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: io.leangen.geantyref:geantyref:1.3.11" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.checkerframework:checker-qual:3.14.0" level="project" />
|
||||
<module version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="minecraft" name="Minecraft">
|
||||
<configuration>
|
||||
<autoDetectTypes>
|
||||
<platformType>ADVENTURE</platformType>
|
||||
<platformType>SPIGOT</platformType>
|
||||
<platformType>BUKKIT</platformType>
|
||||
</autoDetectTypes>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
</module>
|
@ -11,8 +11,6 @@
|
||||
## Partner
|
||||
ReviveNode is a leading Minecraft hosting provider that offers affordable and high-quality server hosting solutions. Their focus on performance, reliability, and customer support makes them the perfect partner for CommandPanels.
|
||||
|
||||

|
||||
|
||||
We have proudly partnered with [ReviveNode](http://billing.revivenode.com/aff.php?aff=379)!
|
||||
CommandPanels users have been offered 15% off on the first month by using the Promocode: **PANELS**
|
||||
|
||||
|
2
jitpack.yml
Normal file
2
jitpack.yml
Normal file
@ -0,0 +1,2 @@
|
||||
jdk:
|
||||
- openjdk17
|
106
pom.xml
106
pom.xml
@ -4,7 +4,7 @@
|
||||
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>
|
||||
|
||||
<groupId>groupId</groupId>
|
||||
<groupId>me.rockyhawk.commandpanels</groupId>
|
||||
<artifactId>CommandPanels</artifactId>
|
||||
<version>DEV</version>
|
||||
|
||||
@ -43,6 +43,14 @@
|
||||
<pattern>org.bukkit.craftbukkit.libs.org.apache.commons.io</pattern>
|
||||
<shadedPattern>org.apache.commons.io</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>org.bstats</pattern>
|
||||
<shadedPattern>me.rockyhawk.commandpanels.bstats</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>de.tr7zw.changeme.nbtapi</pattern>
|
||||
<shadedPattern>me.rockyhawk.commandpanels.nbtapi</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
</configuration>
|
||||
</execution>
|
||||
@ -64,8 +72,12 @@
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>io.papermc</id>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>minecraft-repo</id>
|
||||
@ -77,11 +89,7 @@
|
||||
</repository>
|
||||
<repository>
|
||||
<id>jeff-media-public</id>
|
||||
<url>https://hub.jeff-media.com/nexus/repository/jeff-media-public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>BenCodez Repo</id>
|
||||
<url>https://nexus.bencodez.com/repository/maven-public/</url>
|
||||
<url>https://repo.jeff-media.com/public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>ess-repo</id>
|
||||
@ -91,21 +99,42 @@
|
||||
<id>placeholderapi</id>
|
||||
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>phoenix</id>
|
||||
<url>https://nexus.phoenixdevt.fr/repository/maven-public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>codemc-repo</id>
|
||||
<url>https://repo.codemc.io/repository/maven-public/</url>
|
||||
<layout>default</layout>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>opencollab-snapshot</id>
|
||||
<url>https://repo.opencollab.dev/main/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>de.tr7zw</groupId>
|
||||
<artifactId>item-nbt-api</artifactId>
|
||||
<version>2.14.1-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>3.0.2</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-text-minimessage</artifactId>
|
||||
<version>4.11.0</version>
|
||||
<version>4.17.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -117,60 +146,42 @@
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.19.3-R0.1-SNAPSHOT</version>
|
||||
<version>1.20.5-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.mojang</groupId>
|
||||
<artifactId>authlib</artifactId>
|
||||
<version>1.5.21</version>
|
||||
<version>3.11.50</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.bencodez</groupId>
|
||||
<artifactId>votingplugin</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>provided</scope>
|
||||
<version>2.14.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.clip</groupId>
|
||||
<artifactId>placeholderapi</artifactId>
|
||||
<version>2.11.3</version>
|
||||
<version>2.11.6</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.MilkBowl</groupId>
|
||||
<artifactId>VaultAPI</artifactId>
|
||||
<version>1.7</version>
|
||||
<version>1.7.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.Indyuce</groupId>
|
||||
<artifactId>MMOItems-API</artifactId>
|
||||
<version>LATEST</version>
|
||||
<version>6.10-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.lumine</groupId>
|
||||
<artifactId>MythicLib-dist</artifactId>
|
||||
<version>1.5.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.Realizedd</groupId>
|
||||
<artifactId>TokenManager</artifactId>
|
||||
<version>LATEST</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>*</groupId>
|
||||
<artifactId>*</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
<version>1.6.2-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -180,15 +191,26 @@
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.Ssomar-Developement</groupId>
|
||||
<artifactId>SCore</artifactId>
|
||||
<version>LATEST</version>
|
||||
<groupId>com.github.LoneDev6</groupId>
|
||||
<artifactId>api-itemsadder</artifactId>
|
||||
<version>3.6.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.papermc</groupId>
|
||||
<artifactId>paperlib</artifactId>
|
||||
<version>1.0.8</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.essentialsx</groupId>
|
||||
<artifactId>EssentialsX</artifactId>
|
||||
<version>2.19.7</version>
|
||||
<version>2.20.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.geysermc.floodgate</groupId>
|
||||
<artifactId>api</artifactId>
|
||||
<version>2.2.2-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
@ -8,7 +8,6 @@ config:
|
||||
refresh-panels: true
|
||||
refresh-delay: 20
|
||||
panel-blocks: true
|
||||
ingame-editor: true
|
||||
hotbar-items: true
|
||||
custom-commands: true
|
||||
auto-register-commands: false
|
||||
@ -17,7 +16,7 @@ config:
|
||||
stop-sound: true
|
||||
disabled-world-message: true
|
||||
panel-snooper: false
|
||||
allow-unsafe-mini-message: false
|
||||
enable-import-command: false
|
||||
format:
|
||||
tag: '&6[&bCommandPanels&6] '
|
||||
perms: '&cNo permission.'
|
||||
@ -29,6 +28,7 @@ config:
|
||||
offline: 'Offline'
|
||||
offlineHeadValue: 'eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmU1Mjg2YzQ3MGY2NmZmYTFhMTgzMzFjYmZmYjlhM2MyYTQ0MjRhOGM3MjU5YzQ0MzZmZDJlMzU1ODJhNTIyIn19fQ=='
|
||||
input: '&cYour Input is too long!'
|
||||
disabled: '&cThis feature is disabled in your plugin config.'
|
||||
input:
|
||||
input-cancel: cancel
|
||||
input-cancelled: '&cCancelled!'
|
||||
@ -37,7 +37,7 @@ input:
|
||||
- '&aEnter Input for Command'
|
||||
- '&cType &4%cp-args% &cto Cancel the command'
|
||||
hexcodes:
|
||||
start_tag: '#'
|
||||
start_tag: '&#'
|
||||
end_tag: ''
|
||||
placeholders:
|
||||
primary:
|
||||
@ -48,7 +48,6 @@ placeholders:
|
||||
end: '}'
|
||||
updater:
|
||||
auto-update: false
|
||||
minor-updates-only: true
|
||||
update-checks: true
|
||||
purchase:
|
||||
currency:
|
||||
@ -75,3 +74,7 @@ purchase:
|
||||
enable: true
|
||||
success: '&aSuccessfully Bought For %cp-args% Experience.'
|
||||
failure: '&cInsufficient Experience!'
|
||||
permission:
|
||||
enable: true
|
||||
success: '&aYou have successfully passed the permission check for "%cp-args%".'
|
||||
failure: '&cInefficient Permissions'
|
@ -1,10 +1,10 @@
|
||||
version: 3.19.0.2
|
||||
version: 3.21.4.4
|
||||
main: me.rockyhawk.commandpanels.CommandPanels
|
||||
name: CommandPanels
|
||||
author: RockyHawk
|
||||
api-version: '1.13'
|
||||
description: Fully Custom GUIs. Make your Server Professional.
|
||||
softdepend: [Essentials, PlaceholderAPI, Vault, HeadDatabase, TokenManager, VotingPlugin, MMOItems, ChestSort]
|
||||
softdepend: [Essentials, PlaceholderAPI, Vault, HeadDatabase, TokenManager, VotingPlugin, MMOItems, ChestSort, floodgate]
|
||||
commands:
|
||||
commandpanel:
|
||||
description: Open a command panel.
|
||||
@ -18,6 +18,10 @@ commands:
|
||||
description: Change data values for players
|
||||
usage: /commandpaneldata
|
||||
aliases: [cpdata]
|
||||
commandpanelupdate:
|
||||
description: Refresh/update panel/s for player
|
||||
usage: /commandpanelupdate
|
||||
aliases: [ cpu, cpanelu ]
|
||||
commandpaneldebug:
|
||||
description: Enable and Disable debug mode globally
|
||||
usage: /commandpaneldebug
|
||||
@ -73,6 +77,8 @@ permissions:
|
||||
default: op
|
||||
commandpanel.data:
|
||||
default: op
|
||||
commandpanel.refresh:
|
||||
default: op
|
||||
commandpanel.edit:
|
||||
default: op
|
||||
commandpanel.list:
|
||||
|
@ -1,39 +0,0 @@
|
||||
panels:
|
||||
BottomSettings:
|
||||
perm: default
|
||||
rows: 3
|
||||
title: '&8Bottom Settings'
|
||||
panelType:
|
||||
- static
|
||||
pre-load-commands:
|
||||
- event= CommandPanels_EditorOpened
|
||||
commands-on-close:
|
||||
- event= CommandPanels_EditorClosed
|
||||
item:
|
||||
'0':
|
||||
material: BARRIER
|
||||
stack: 1
|
||||
name: '&cExit'
|
||||
commands:
|
||||
- event= CommandPanels_EditorClosed
|
||||
- cpc
|
||||
'4':
|
||||
material: CHEST
|
||||
stack: 1
|
||||
name: '&fPanel Settings'
|
||||
commands:
|
||||
- "event= CommandPanels_OpenPanelSettings"
|
||||
'6':
|
||||
material: COOKIE
|
||||
stack: 1
|
||||
name: '&fItem Settings'
|
||||
commands:
|
||||
- "event= CommandPanels_OpenItemSettings"
|
||||
#'8':
|
||||
# material: COMPASS
|
||||
# stack: 1
|
||||
# name: '&fItem Sections'
|
||||
# lore:
|
||||
# - "&cIN PROGRESS"
|
||||
# commands:
|
||||
# - "event= CommandPanels_OpenItemSections"
|
@ -1,227 +0,0 @@
|
||||
panels:
|
||||
ItemEditMenu:
|
||||
perm: default
|
||||
rows: 3
|
||||
title: '&8Item Settings'
|
||||
panelType:
|
||||
- static
|
||||
custom-messages:
|
||||
input-message:
|
||||
- "&e[&bCommand Panels Editor&e]"
|
||||
- "&fEnter your value in the chat bar below."
|
||||
item:
|
||||
'4':
|
||||
material: FLINT_AND_STEEL
|
||||
name: '&fPlayer Input'
|
||||
lore:
|
||||
- "&7Add a player input to your item."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [command]"
|
||||
- "&7- edit [line number] [command]"
|
||||
- "&7- insert [line number] [command]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorItem_player-input
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_iteminput %cp-player-input%"
|
||||
'5':
|
||||
material: NAME_TAG
|
||||
name: '&fItem Name'
|
||||
lore:
|
||||
- "&7Choose a name for your item."
|
||||
commands:
|
||||
- event= CPEditorItem_name
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemname %cp-player-input%"
|
||||
'6':
|
||||
material: ITEM_FRAME
|
||||
name: '&fItem Stack'
|
||||
lore:
|
||||
- "&7Choose a number from 1 to 64."
|
||||
commands:
|
||||
- event= CPEditorItem_stack
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemstack %cp-player-input%"
|
||||
'7':
|
||||
material: ENCHANTED_BOOK
|
||||
name: '&fEnchantments'
|
||||
lore:
|
||||
- "&7Add enchantments to your item."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [type] [level]"
|
||||
- "&7- edit [line number] [type] [level]"
|
||||
- "&7- insert [line number] [type] [level]"
|
||||
- "&7- remove [line number]"
|
||||
- ""
|
||||
- "&7For example: add KNOCKBACK 3"
|
||||
commands:
|
||||
- event= CPEditorItem_enchanted
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemenchantment %cp-player-input%"
|
||||
'8':
|
||||
material: PAPER
|
||||
name: '&fItem NBT Data'
|
||||
lore:
|
||||
- "&7You can create custom NBT for your item."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [name] [value]"
|
||||
- "&7- remove [name]"
|
||||
- ""
|
||||
- "&7For example: add example_data this is the value"
|
||||
commands:
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemnbt %cp-player-input%"
|
||||
'18':
|
||||
material: LAVA_BUCKET
|
||||
name: '&cDelete Item'
|
||||
lore:
|
||||
- "&7Enter 'confirm' to delete the item."
|
||||
commands:
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemdelete %cp-player-input%"
|
||||
'9':
|
||||
material: REDSTONE_BLOCK
|
||||
name: '&fEditing Item: %cp-item-slot%'
|
||||
lore:
|
||||
- "&7Click here to change the"
|
||||
- "&7slot number you are editing."
|
||||
commands:
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemslot %cp-player-input%"
|
||||
'0':
|
||||
material: ENDER_CHEST
|
||||
name: '&fMove Item'
|
||||
lore:
|
||||
- "&7Enter a slot to move this item to."
|
||||
commands:
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemmove %cp-player-input%"
|
||||
'1':
|
||||
material: STONE
|
||||
name: '&fItem Material'
|
||||
lore:
|
||||
- "&7Choose a material for your item."
|
||||
commands:
|
||||
- event= CPEditorItem_material
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemmaterial %cp-player-input%"
|
||||
'13':
|
||||
material: COBBLESTONE
|
||||
name: '&fItem ID'
|
||||
lore:
|
||||
- "&7Material ID for Minecraft 1.12 and below."
|
||||
commands:
|
||||
- event= CPEditorItem_id
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemid %cp-player-input%"
|
||||
'14':
|
||||
material: PAINTING
|
||||
name: '&fCustom Model Data'
|
||||
lore:
|
||||
- "&7Enter Custom Model Data for your item."
|
||||
commands:
|
||||
- event= CPEditorItem_customdata
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemmodeldata %cp-player-input%"
|
||||
'15':
|
||||
material: ANVIL
|
||||
name: '&fItem Durability'
|
||||
lore:
|
||||
- "&7Enter a number if you want the item to be damaged."
|
||||
commands:
|
||||
- event= CPEditorItem_damage
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemdurability %cp-player-input%"
|
||||
'16':
|
||||
material: LEATHER_HELMET
|
||||
name: '&fArmour Colour'
|
||||
lore:
|
||||
- "&7Enter a value for your armour to be coloured."
|
||||
commands:
|
||||
- event= CPEditorItem_leatherarmor
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemarmour %cp-player-input%"
|
||||
'17':
|
||||
material: POTION
|
||||
name: '&fPotion Effect'
|
||||
lore:
|
||||
- "&7Choose a potion effect to be applied."
|
||||
commands:
|
||||
- event= CPEditorItem_potion
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itempotion %cp-player-input%"
|
||||
'23':
|
||||
material: FEATHER
|
||||
name: '&fItem Lore'
|
||||
lore:
|
||||
- "&7Add a lore to your item."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [text]"
|
||||
- "&7- edit [line number] [text]"
|
||||
- "&7- insert [line number] [text]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorItem_lore
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemlore %cp-player-input%"
|
||||
'24':
|
||||
material: MAGMA_CREAM
|
||||
name: '&fItem Commands'
|
||||
lore:
|
||||
- "&7Add commands to your item."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [command]"
|
||||
- "&7- edit [line number] [command]"
|
||||
- "&7- insert [line number] [command]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorItem_commands
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemcommands %cp-player-input%"
|
||||
'25':
|
||||
material: MELON_SEEDS
|
||||
name: '&fItem Duplicates'
|
||||
lore:
|
||||
- "&7Enter slots to duplicate this item to."
|
||||
commands:
|
||||
- event= CPEditorItem_duplicate
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemduplicate %cp-player-input%"
|
||||
'26':
|
||||
material: SLIME_BALL
|
||||
name: '&fItem Types'
|
||||
lore:
|
||||
- "&7Add item types to your item."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [text]"
|
||||
- "&7- edit [line number] [text]"
|
||||
- "&7- insert [line number] [text]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorItem_itemType
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_itemtypes %cp-player-input%"
|
@ -1,271 +0,0 @@
|
||||
panels:
|
||||
PanelEditMenu:
|
||||
perm: default
|
||||
rows: 3
|
||||
title: '&8Panel Settings'
|
||||
panelType:
|
||||
- static
|
||||
custom-messages:
|
||||
input-message:
|
||||
- "&e[&bCommand Panels Editor&e]"
|
||||
- "&fEnter your value in the chat bar below."
|
||||
item:
|
||||
'3':
|
||||
material: PUMPKIN_SEEDS
|
||||
name: '&fEmpty Slot Item ID'
|
||||
lore:
|
||||
- "&7Material ID for Minecraft 1.12 and below."
|
||||
commands:
|
||||
- event= CPEditorPanel_emptyID
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelemptyid %cp-player-input%"
|
||||
'4':
|
||||
material: MELON_SEEDS
|
||||
name: '&fEmpty Slot Item'
|
||||
lore:
|
||||
- "&7This item will replace all"
|
||||
- "&7of the empty slots."
|
||||
commands:
|
||||
- event= CPEditorPanel_empty
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelempty %cp-player-input%"
|
||||
'5':
|
||||
material: COBBLESTONE
|
||||
name: '&fEnabled Worlds'
|
||||
lore:
|
||||
- "&7Add Enabled Worlds."
|
||||
- "&7The panel will only open in them."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [world]"
|
||||
- "&7- edit [line number] [world]"
|
||||
- "&7- insert [line number] [world]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_enabled-worlds
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelenabledworlds %cp-player-input%"
|
||||
'6':
|
||||
material: REDSTONE_BLOCK
|
||||
name: '&fDisabled Worlds'
|
||||
lore:
|
||||
- "&7Add Disabled Worlds."
|
||||
- "&7The panel will not open in them."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [world]"
|
||||
- "&7- edit [line number] [world]"
|
||||
- "&7- insert [line number] [world]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_disabled-worlds
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_paneldisabledworlds %cp-player-input%"
|
||||
'7':
|
||||
material: BEACON
|
||||
name: '&fPanel Permission'
|
||||
lore:
|
||||
- "&7Change the permission for your Panel."
|
||||
- "&7Use 'default' to disable this feature."
|
||||
- "&7The permission will be commandpanel.panel.[text]"
|
||||
commands:
|
||||
- event= CPEditorPanel_perm
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelpermission %cp-player-input%"
|
||||
'8':
|
||||
material: NOTE_BLOCK
|
||||
name: '&fPanel Open Sound'
|
||||
lore:
|
||||
- "&7Choose a sound when your panel opens."
|
||||
- "&7Make sure this is all uppercase."
|
||||
commands:
|
||||
- event= CPEditorPanel_sound-on-open
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelopensound %cp-player-input%"
|
||||
'0':
|
||||
material: LAVA_BUCKET
|
||||
name: '&cDelete Panel'
|
||||
lore:
|
||||
- "&7Enter 'confirm' to delete the panel."
|
||||
commands:
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_paneldelete %cp-player-input%"
|
||||
'9':
|
||||
material: NAME_TAG
|
||||
name: '&fPanel Name: %cp-panel-name%'
|
||||
lore:
|
||||
- "&7Choose the name for your panel."
|
||||
commands:
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelname %cp-player-input%"
|
||||
'21':
|
||||
material: FEATHER
|
||||
name: '&fNo Permission Custom Message'
|
||||
lore:
|
||||
- "&7Add a No Permission custom message."
|
||||
commands:
|
||||
- event= CPEditorPanel_custom-messages.perm
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelpermissionmessage %cp-player-input%"
|
||||
'12':
|
||||
material: FEATHER
|
||||
name: '&fMaximum Input Custom Message'
|
||||
lore:
|
||||
- "&7Add a Player Input Maximum custom message."
|
||||
commands:
|
||||
- event= CPEditorPanel_custom-messages.input
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelmaxinputmessage %cp-player-input%"
|
||||
'13':
|
||||
material: FEATHER
|
||||
name: '&fPlayer Input Custom Message'
|
||||
lore:
|
||||
- "&7Add a Player Input custom message."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [text]"
|
||||
- "&7- edit [line number] [text]"
|
||||
- "&7- insert [line number] [text]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_custom-messages.player-input
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelplayerinputmessage %cp-player-input%"
|
||||
'14':
|
||||
material: BOOK
|
||||
name: '&fPanel Title'
|
||||
lore:
|
||||
- "&7Change your panel title."
|
||||
commands:
|
||||
- event= CPEditorPanel_title
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_paneletitle %cp-player-input%"
|
||||
'15':
|
||||
material: LADDER
|
||||
name: '&fPanel Rows'
|
||||
lore:
|
||||
- "&7How many rows the panel should be 1-6."
|
||||
commands:
|
||||
- event= CPEditorPanel_rows
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelrows %cp-player-input%"
|
||||
'16':
|
||||
material: LEVER
|
||||
name: '&fPanel Refresh Delay'
|
||||
lore:
|
||||
- "&7Refresh delay measured in ticks."
|
||||
commands:
|
||||
- event= CPEditorPanel_refresh-delay
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelrefreshdelay %cp-player-input%"
|
||||
'17':
|
||||
material: SLIME_BALL
|
||||
name: '&fPanel Types'
|
||||
lore:
|
||||
- "&7Add Panel Types."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [text]"
|
||||
- "&7- edit [line number] [text]"
|
||||
- "&7- insert [line number] [text]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_panelType
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_paneltype %cp-player-input%"
|
||||
'22':
|
||||
material: MAGMA_CREAM
|
||||
name: '&fPanel Commands to Open Panel'
|
||||
lore:
|
||||
- "&7Commands that can be used to"
|
||||
- "&7open this panel."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [command]"
|
||||
- "&7- edit [line number] [command]"
|
||||
- "&7- insert [line number] [command]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_commands
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelcommands %cp-player-input%"
|
||||
'23':
|
||||
material: MAGMA_CREAM
|
||||
name: '&fCommands Before Panel Open'
|
||||
lore:
|
||||
- "&7Commands before the panel has opened."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [command]"
|
||||
- "&7- edit [line number] [command]"
|
||||
- "&7- insert [line number] [command]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_pre-load-commands
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelprecommands %cp-player-input%"
|
||||
'24':
|
||||
material: MAGMA_CREAM
|
||||
name: '&fCommands On Panel Open'
|
||||
lore:
|
||||
- "&7Commands when the panel has opened."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [command]"
|
||||
- "&7- edit [line number] [command]"
|
||||
- "&7- insert [line number] [command]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_commands-on-open
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelopencommands %cp-player-input%"
|
||||
'25':
|
||||
material: MAGMA_CREAM
|
||||
name: '&fCommands On Panel Close'
|
||||
lore:
|
||||
- "&7Commands when the panel is closing."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [command]"
|
||||
- "&7- edit [line number] [command]"
|
||||
- "&7- insert [line number] [command]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_commands-on-close
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_panelclosecommands %cp-player-input%"
|
||||
'26':
|
||||
material: MAGMA_CREAM
|
||||
name: '&fOutside Panel Commands'
|
||||
lore:
|
||||
- "&7Add commands when clicking outside the panel."
|
||||
- ""
|
||||
- "&7Options"
|
||||
- "&7- add [command]"
|
||||
- "&7- edit [line number] [command]"
|
||||
- "&7- insert [line number] [command]"
|
||||
- "&7- remove [line number]"
|
||||
commands:
|
||||
- event= CPEditorPanel_outside-commands
|
||||
- cpc
|
||||
player-input:
|
||||
- "event= CPEditor_paneloutsidecommands %cp-player-input%"
|
@ -1,6 +1,6 @@
|
||||
# |------------------------------------------------------------------------
|
||||
# | CommandPanels Legacy Example File
|
||||
# | By RockyHawk v2.3
|
||||
# | Official Panel v2.4
|
||||
# | https://www.spigotmc.org/resources/command-panels-custom-guis.67788/
|
||||
# |------------------------------------------------------------------------
|
||||
panels:
|
||||
@ -107,7 +107,8 @@ panels:
|
||||
'32':
|
||||
material: COMPASS
|
||||
stack: 12
|
||||
enchanted: true
|
||||
enchanted:
|
||||
- true
|
||||
name: '&cClick Me'
|
||||
lore:
|
||||
- '&fI will teleport you home!'
|
||||
|
@ -1,6 +1,6 @@
|
||||
# |------------------------------------------------------------------------
|
||||
# | CommandPanels Example File
|
||||
# | By RockyHawk v3.1
|
||||
# | Official Panel v3.1
|
||||
# | https://www.spigotmc.org/resources/command-panels-custom-guis.67788/
|
||||
# |------------------------------------------------------------------------
|
||||
panels:
|
||||
|
@ -1,6 +1,6 @@
|
||||
# |------------------------------------------------------------------------
|
||||
# | CommandPanels Example File
|
||||
# | By RockyHawk v3.1
|
||||
# | Official Panel v3.2
|
||||
# | https://www.spigotmc.org/resources/command-panels-custom-guis.67788/
|
||||
# |------------------------------------------------------------------------
|
||||
panels:
|
||||
@ -20,102 +20,102 @@ panels:
|
||||
name: ''
|
||||
animate0:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'1':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate1:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'2':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate2:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'3':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate3:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'5':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate9:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'6':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate10:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'7':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate11:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'12':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate4:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'14':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate8:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'16':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate12:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'21':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate5:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'22':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate6:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'23':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate7:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'25':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate13:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
'26':
|
||||
material: AIR
|
||||
stack: 1
|
||||
name: ''
|
||||
animate14:
|
||||
material: PUFFERFISH
|
||||
name: '&eRhys the Pufferfish'
|
||||
name: '&ePopper the Pufferfish'
|
||||
|
@ -1,6 +1,6 @@
|
||||
# |------------------------------------------------------------------------
|
||||
# | CommandPanels Example File
|
||||
# | By RockyHawk v3.1
|
||||
# | Official Panel v3.2
|
||||
# | https://www.spigotmc.org/resources/command-panels-custom-guis.67788/
|
||||
# |------------------------------------------------------------------------
|
||||
panels:
|
||||
@ -23,127 +23,127 @@ panels:
|
||||
- add-data= nextpage 1
|
||||
item:
|
||||
'10':
|
||||
material: 'cps= $cp-player-online-%math_1+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_1+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_1+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_1+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '$cp-player-online-%math_1+14*{cp-data-onlinepage}%$'
|
||||
compare0: '$cp-player-online-%math_0:_1+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'11':
|
||||
material: 'cps= $cp-player-online-%math_2+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_2+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_2+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_2+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_2+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_2+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'12':
|
||||
material: 'cps= $cp-player-online-%math_3+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_3+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_3+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_3+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_3+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_3+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'13':
|
||||
material: 'cps= $cp-player-online-%math_4+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_4+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_4+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_4+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_4+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_4+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'14':
|
||||
material: 'cps= $cp-player-online-%math_5+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_5+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_5+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_5+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_5+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_5+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'15':
|
||||
material: 'cps= $cp-player-online-%math_6+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_6+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_6+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_6+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_6+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_6+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'16':
|
||||
material: 'cps= $cp-player-online-%math_7+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_7+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_7+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_7+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_7+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_7+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'19':
|
||||
material: 'cps= $cp-player-online-%math_8+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_8+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_8+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_8+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_8+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_8+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'20':
|
||||
material: 'cps= $cp-player-online-%math_9+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_9+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_9+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_9+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_9+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_9+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'21':
|
||||
material: 'cps= $cp-player-online-%math_10+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_10+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_10+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_10+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_10+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_10+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'22':
|
||||
material: 'cps= $cp-player-online-%math_11+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_11+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_11+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_11+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_11+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_11+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'23':
|
||||
material: 'cps= $cp-player-online-%math_12+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_12+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_12+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_12+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_12+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_12+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'24':
|
||||
material: 'cps= $cp-player-online-%math_13+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_13+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_13+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_13+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_13+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_13+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
name: '&7&l????'
|
||||
'25':
|
||||
material: 'cps= $cp-player-online-%math_14+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_14+14*{cp-data-onlinepage}%$'
|
||||
material: 'cps= $cp-player-online-%math_0:_14+14*{cp-data-onlinepage}%$'
|
||||
name: '&e$cp-player-online-%math_0:_14+14*{cp-data-onlinepage}%$'
|
||||
has0:
|
||||
compare0: '&e$cp-player-online-%math_14+14*{cp-data-onlinepage}%$'
|
||||
compare0: '&e$cp-player-online-%math_0:_14+14*{cp-data-onlinepage}%$'
|
||||
value0: 'Offline'
|
||||
material: cps= eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmMyNzEwNTI3MTllZjY0MDc5ZWU4YzE0OTg5NTEyMzhhNzRkYWM0YzI3Yjk1NjQwZGI2ZmJkZGMyZDZiNWI2ZSJ9fX0=
|
||||
stack: 1
|
||||
@ -160,7 +160,7 @@ panels:
|
||||
commands:
|
||||
- math-data= onlinepage -1
|
||||
- math-data= nextpage -1
|
||||
- refresh
|
||||
- open= example_middle_two
|
||||
'6':
|
||||
material: ARROW
|
||||
stack: 1
|
||||
@ -168,7 +168,7 @@ panels:
|
||||
commands:
|
||||
- 'math-data= onlinepage +1'
|
||||
- 'math-data= nextpage +1'
|
||||
- 'refresh'
|
||||
- open= example_middle_two
|
||||
'4':
|
||||
material: OAK_SIGN
|
||||
name: '&e&lOnline Players'
|
||||
|
@ -1,6 +1,6 @@
|
||||
# |------------------------------------------------------------------------
|
||||
# | CommandPanels Example File
|
||||
# | By RockyHawk v3.1
|
||||
# | Official Panel v3.2
|
||||
# | https://www.spigotmc.org/resources/command-panels-custom-guis.67788/
|
||||
# |------------------------------------------------------------------------
|
||||
panels:
|
||||
@ -73,18 +73,18 @@ panels:
|
||||
- placeholder= [item:APPLE]
|
||||
- refresh
|
||||
'21':
|
||||
material: POTION
|
||||
material: GOLDEN_APPLE
|
||||
name: '&fClick to heal the player'
|
||||
potion: INSTANT_HEAL
|
||||
lore:
|
||||
- '&7Uses the /heal command so that'
|
||||
- '&7the player needs permission'
|
||||
- '&7Uses the /heal command if'
|
||||
- '&7the player has permission'
|
||||
commands:
|
||||
- heal
|
||||
'24':
|
||||
material: BOW
|
||||
name: '&fThis bow is enchanted'
|
||||
enchanted: true
|
||||
enchanted:
|
||||
- true
|
||||
'26':
|
||||
material: LEATHER_CHESTPLATE
|
||||
name: '&eYellow &fArmor'
|
||||
|
@ -1,6 +1,6 @@
|
||||
# |------------------------------------------------------------------------
|
||||
# | CommandPanels Template File
|
||||
# | By RockyHawk v1.1
|
||||
# | Official Panel v1.1
|
||||
# | https://www.spigotmc.org/resources/command-panels-custom-guis.67788/
|
||||
# |------------------------------------------------------------------------
|
||||
panels:
|
||||
|
@ -1,10 +1,12 @@
|
||||
package me.rockyhawk.commandpanels;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
import io.lumine.mythic.lib.api.item.NBTItem;
|
||||
import me.rockyhawk.commandpanels.api.CommandPanelsAPI;
|
||||
import me.rockyhawk.commandpanels.api.Panel;
|
||||
import me.rockyhawk.commandpanels.classresources.ExecuteOpenVoids;
|
||||
import me.rockyhawk.commandpanels.classresources.GetCustomHeads;
|
||||
import me.rockyhawk.commandpanels.classresources.MiniMessageUtils;
|
||||
import me.rockyhawk.commandpanels.classresources.customheads.GetCustomHeads;
|
||||
import me.rockyhawk.commandpanels.classresources.HasSections;
|
||||
import me.rockyhawk.commandpanels.classresources.ItemCreation;
|
||||
import me.rockyhawk.commandpanels.classresources.placeholders.expansion.CpPlaceholderExpansion;
|
||||
@ -15,15 +17,19 @@ import me.rockyhawk.commandpanels.classresources.placeholders.CreateText;
|
||||
import me.rockyhawk.commandpanels.classresources.placeholders.HexColours;
|
||||
import me.rockyhawk.commandpanels.classresources.placeholders.Placeholders;
|
||||
import me.rockyhawk.commandpanels.commands.*;
|
||||
import me.rockyhawk.commandpanels.commandtags.CommandTags;
|
||||
import me.rockyhawk.commandpanels.commandtags.CommandRunner;
|
||||
import me.rockyhawk.commandpanels.completetabs.CpTabComplete;
|
||||
import me.rockyhawk.commandpanels.completetabs.UpdateTabComplete;
|
||||
import me.rockyhawk.commandpanels.customcommands.Commandpanelcustom;
|
||||
import me.rockyhawk.commandpanels.datamanager.DebugManager;
|
||||
import me.rockyhawk.commandpanels.datamanager.PanelDataLoader;
|
||||
import me.rockyhawk.commandpanels.datamanager.PanelDataPlayerManager;
|
||||
import me.rockyhawk.commandpanels.editor.*;
|
||||
import me.rockyhawk.commandpanels.floodgatecp.OpenFloodgateGUI;
|
||||
import me.rockyhawk.commandpanels.generatepanels.Commandpanelsgenerate;
|
||||
import me.rockyhawk.commandpanels.generatepanels.GenUtils;
|
||||
import me.rockyhawk.commandpanels.generatepanels.TabCompleteGenerate;
|
||||
import me.rockyhawk.commandpanels.interactives.OutsideClickEvent;
|
||||
import me.rockyhawk.commandpanels.interactives.input.UserInputUtils;
|
||||
import me.rockyhawk.commandpanels.interactives.Commandpanelrefresher;
|
||||
import me.rockyhawk.commandpanels.interactives.OpenOnJoin;
|
||||
@ -31,6 +37,8 @@ import me.rockyhawk.commandpanels.ioclasses.nbt.NBTManager;
|
||||
import me.rockyhawk.commandpanels.ioclasses.legacy.LegacyVersion;
|
||||
import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions;
|
||||
import me.rockyhawk.commandpanels.ioclasses.legacy.PlayerHeads;
|
||||
import me.rockyhawk.commandpanels.ioclasses.potions.ClassicPotionData;
|
||||
import me.rockyhawk.commandpanels.ioclasses.potions.LegacyPotionData;
|
||||
import me.rockyhawk.commandpanels.openpanelsmanager.*;
|
||||
import me.rockyhawk.commandpanels.openwithitem.HotbarItemLoader;
|
||||
import me.rockyhawk.commandpanels.openwithitem.SwapItemEvent;
|
||||
@ -41,10 +49,14 @@ import me.rockyhawk.commandpanels.panelblocks.Commandpanelblocks;
|
||||
import me.rockyhawk.commandpanels.panelblocks.PanelBlockOnClick;
|
||||
import me.rockyhawk.commandpanels.playerinventoryhandler.InventorySaver;
|
||||
import me.rockyhawk.commandpanels.playerinventoryhandler.ItemStackSerializer;
|
||||
import me.rockyhawk.commandpanels.playerinventoryhandler.pickupevent.EntityPickupEvent;
|
||||
import me.rockyhawk.commandpanels.playerinventoryhandler.pickupevent.legacyPlayerEvent;
|
||||
import me.rockyhawk.commandpanels.updater.Updater;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.io.input.CharSequenceReader;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bstats.charts.SingleLineChart;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Color;
|
||||
@ -63,7 +75,6 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
public class CommandPanels extends JavaPlugin{
|
||||
public YamlConfiguration config;
|
||||
@ -79,19 +90,25 @@ public class CommandPanels extends JavaPlugin{
|
||||
//get alternate classes
|
||||
public PanelDownloader downloader = new PanelDownloader(this);
|
||||
|
||||
public CommandTags commandTags = new CommandTags(this);
|
||||
public CommandRunner commandRunner = new CommandRunner(this);
|
||||
public PanelDataLoader panelData = new PanelDataLoader(this);
|
||||
public PanelDataPlayerManager panelDataPlayers = new PanelDataPlayerManager(this);
|
||||
|
||||
public Placeholders placeholders = new Placeholders(this);
|
||||
public DebugManager debug = new DebugManager(this);
|
||||
public CreateText tex = new CreateText(this);
|
||||
public HexColours hex = new HexColours(this);
|
||||
|
||||
public MiniMessageUtils miniMessage = null;
|
||||
|
||||
public ExecuteOpenVoids openVoids = new ExecuteOpenVoids(this);
|
||||
public ItemCreation itemCreate = new ItemCreation(this);
|
||||
public HasSections has = new HasSections(this);
|
||||
public GetCustomHeads customHeads = new GetCustomHeads(this);
|
||||
public Updater updater = new Updater(this);
|
||||
public PlayerHeads getHeads = new PlayerHeads(this);
|
||||
public ClassicPotionData classicPotion = new ClassicPotionData(this);
|
||||
public LegacyPotionData legacyPotion = new LegacyPotionData(this);
|
||||
public LegacyVersion legacy = new LegacyVersion(this);
|
||||
|
||||
public OpenPanelsLoader openPanels = new OpenPanelsLoader(this);
|
||||
@ -110,6 +127,9 @@ public class CommandPanels extends JavaPlugin{
|
||||
public void onEnable() {
|
||||
Bukkit.getLogger().info("[CommandPanels] RockyHawk's CommandPanels v" + this.getDescription().getVersion() + " Plugin Loading...");
|
||||
|
||||
//Initialise classes that are not used externally
|
||||
new OpenFloodgateGUI(this);
|
||||
|
||||
//register config files
|
||||
this.blockConfig = YamlConfiguration.loadConfiguration(new File(getDataFolder() + File.separator + "blocks.yml"));
|
||||
panelData.dataConfig = YamlConfiguration.loadConfiguration(new File(getDataFolder() + File.separator + "data.yml"));
|
||||
@ -145,9 +165,10 @@ public class CommandPanels extends JavaPlugin{
|
||||
}
|
||||
|
||||
//setup class files
|
||||
new Metrics(this, 5097);
|
||||
this.setupEconomy();
|
||||
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
|
||||
new Metrics(this);
|
||||
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "my:psb");
|
||||
Objects.requireNonNull(this.getCommand("commandpanel")).setExecutor(new Commandpanel(this));
|
||||
Objects.requireNonNull(this.getCommand("commandpanel")).setTabCompleter(new CpTabComplete(this));
|
||||
|
||||
@ -157,6 +178,9 @@ public class CommandPanels extends JavaPlugin{
|
||||
Objects.requireNonNull(this.getCommand("commandpaneldata")).setTabCompleter(new DataTabComplete(this));
|
||||
Objects.requireNonNull(this.getCommand("commandpaneldata")).setExecutor(new Commandpanelsdata(this));
|
||||
|
||||
Objects.requireNonNull(this.getCommand("commandpanelupdate")).setTabCompleter(new UpdateTabComplete(this));
|
||||
Objects.requireNonNull(this.getCommand("commandpanelupdate")).setExecutor(new Commandpanelsupdate(this));
|
||||
|
||||
Objects.requireNonNull(this.getCommand("commandpanelimport")).setExecutor(new CommandPanelImport(this));
|
||||
Objects.requireNonNull(this.getCommand("commandpanelimport")).setTabCompleter(new ImportTabComplete(this));
|
||||
Objects.requireNonNull(this.getCommand("commandpaneledit")).setExecutor(new CommandPanelsEditor(this));
|
||||
@ -167,12 +191,36 @@ public class CommandPanels extends JavaPlugin{
|
||||
Objects.requireNonNull(this.getCommand("commandpanelversion")).setExecutor(new Commandpanelversion(this));
|
||||
Objects.requireNonNull(this.getCommand("commandpanellist")).setExecutor(new Commandpanelslist(this));
|
||||
this.getServer().getPluginManager().registerEvents(new Utils(this), this);
|
||||
|
||||
this.getServer().getPluginManager().registerEvents(inventorySaver, this);
|
||||
if(this.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
this.getServer().getPluginManager().registerEvents(new EntityPickupEvent(this), this);
|
||||
}else{
|
||||
this.getServer().getPluginManager().registerEvents(new legacyPlayerEvent(this), this);
|
||||
}
|
||||
|
||||
try {
|
||||
// Check all the minimessage classes exist before loading
|
||||
Class.forName("net.kyori.adventure.text.Component");
|
||||
Class.forName("net.kyori.adventure.text.format.TextDecoration");
|
||||
Class.forName("net.kyori.adventure.text.minimessage.MiniMessage");
|
||||
Class.forName("net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer");
|
||||
miniMessage = new MiniMessageUtils(this);
|
||||
} catch (ClassNotFoundException ignore) {
|
||||
//do not initialise miniMessage
|
||||
}
|
||||
|
||||
this.getServer().getPluginManager().registerEvents(inputUtils, this);
|
||||
this.getServer().getPluginManager().registerEvents(panelDataPlayers, this);
|
||||
this.getServer().getPluginManager().registerEvents(new UtilsPanelsLoader(this), this);
|
||||
this.getServer().getPluginManager().registerEvents(new GenUtils(this), this);
|
||||
this.getServer().getPluginManager().registerEvents(new ItemFallManager(this), this);
|
||||
this.getServer().getPluginManager().registerEvents(new OpenOnJoin(this), this);
|
||||
this.getServer().getPluginManager().registerEvents(new OutsideClickEvent(this), this);
|
||||
|
||||
if (this.getServer().getPluginManager().isPluginEnabled("floodgate")) {
|
||||
this.getServer().getPluginManager().registerEvents(new OpenFloodgateGUI(this), this);
|
||||
}
|
||||
|
||||
//load in the updater if requested
|
||||
if (Objects.requireNonNull(config.getString("updater.update-checks")).equalsIgnoreCase("true")) {
|
||||
@ -185,7 +233,7 @@ public class CommandPanels extends JavaPlugin{
|
||||
}
|
||||
|
||||
//load in all built in command tags
|
||||
commandTags.registerBuiltInTags();
|
||||
commandRunner.registerBuiltInTags();
|
||||
|
||||
//if refresh-panels set to false, don't load this
|
||||
if(Objects.requireNonNull(config.getString("config.refresh-panels")).equalsIgnoreCase("true")){
|
||||
@ -213,7 +261,6 @@ public class CommandPanels extends JavaPlugin{
|
||||
if (!Bukkit.getVersion().contains("1.8")) {
|
||||
this.getServer().getPluginManager().registerEvents(new SwapItemEvent(this), this);
|
||||
}
|
||||
|
||||
//if plugin ChestSort is enabled
|
||||
if(getServer().getPluginManager().isPluginEnabled("ChestSort")){
|
||||
this.getServer().getPluginManager().registerEvents(new UtilsChestSortEvent(this), this);
|
||||
@ -222,7 +269,7 @@ public class CommandPanels extends JavaPlugin{
|
||||
//save the example_top.yml file and the template.yml file
|
||||
if (!this.panelsf.exists()) {
|
||||
try {
|
||||
if(legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
if(legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
FileConfiguration exampleFileConfiguration = YamlConfiguration.loadConfiguration(getReaderFromStream(this.getResource("exampleLegacy.yml")));
|
||||
exampleFileConfiguration.save(new File(this.panelsf + File.separator + "example.yml"));
|
||||
}else {
|
||||
@ -252,14 +299,14 @@ public class CommandPanels extends JavaPlugin{
|
||||
//do hotbar items
|
||||
hotbar.reloadHotbarSlots();
|
||||
|
||||
//load all known players for data
|
||||
panelDataPlayers.reloadAllPlayers();
|
||||
|
||||
//add custom charts bStats
|
||||
Metrics metrics = new Metrics(this);
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("panels_amount", new Callable<Integer>() {
|
||||
@Override
|
||||
public Integer call() throws Exception {
|
||||
//this is the total panels loaded
|
||||
return panelList.size();
|
||||
}
|
||||
Metrics metrics = new Metrics(this, 5097);
|
||||
metrics.addCustomChart(new SingleLineChart("panels_amount", () -> {
|
||||
//this is the total panels loaded
|
||||
return panelList.size();
|
||||
}));
|
||||
|
||||
//get tag
|
||||
@ -302,13 +349,30 @@ public class CommandPanels extends JavaPlugin{
|
||||
assert renamedMeta != null;
|
||||
//hiding attributes will add an NBT tag
|
||||
if(hideAttributes) {
|
||||
renamedMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
|
||||
renamedMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
|
||||
renamedMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
|
||||
renamedMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
|
||||
//HIDE_ADDITIONAL_TOOLTIP was added into 1.20.5 api
|
||||
if(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_21) ||
|
||||
(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20) && legacy.MINOR_VERSION >= 5)){
|
||||
renamedMeta.addItemFlags(ItemFlag.valueOf("HIDE_ADDITIONAL_TOOLTIP"));
|
||||
}
|
||||
//HIDE_POTION_EFFECTS was removed in the 1.20.5 api
|
||||
if(legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) ||
|
||||
(legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && legacy.MINOR_VERSION <= 4)){
|
||||
renamedMeta.addItemFlags(ItemFlag.valueOf("HIDE_POTION_EFFECTS"));
|
||||
}
|
||||
//HIDE_ARMOR_TRIM was added into 1.20 api
|
||||
if(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20)){
|
||||
renamedMeta.addItemFlags(ItemFlag.HIDE_ARMOR_TRIM);
|
||||
}
|
||||
//HIDE_DYE was added into 1.17 api
|
||||
if(legacy.LOCAL_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_17)){
|
||||
if(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_17)){
|
||||
renamedMeta.addItemFlags(ItemFlag.HIDE_DYE);
|
||||
}
|
||||
//setAttributeModifiers was added into 1.14 api
|
||||
if(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_14)){
|
||||
renamedMeta.setAttributeModifiers(ImmutableMultimap.of());
|
||||
}
|
||||
}
|
||||
if (customName != null) {
|
||||
renamedMeta.setDisplayName(customName);
|
||||
@ -440,6 +504,9 @@ public class CommandPanels extends JavaPlugin{
|
||||
if (p.hasPermission("commandpanel.version")) {
|
||||
p.sendMessage(ChatColor.GOLD + "/cpv " + ChatColor.WHITE + "Display the current version.");
|
||||
}
|
||||
if (p.hasPermission("commandpanel.refresh")) {
|
||||
p.sendMessage(ChatColor.GOLD + "/cpu <player> [position:all] " + ChatColor.WHITE + "Update a panel for a player while it is still open.");
|
||||
}
|
||||
if (p.hasPermission("commandpanel.update")) {
|
||||
p.sendMessage(ChatColor.GOLD + "/cpv latest " + ChatColor.WHITE + "Download the latest update upon server reload/restart.");
|
||||
p.sendMessage(ChatColor.GOLD + "/cpv [version:cancel] " + ChatColor.WHITE + "Download an update upon server reload/restart.");
|
||||
@ -448,7 +515,7 @@ public class CommandPanels extends JavaPlugin{
|
||||
p.sendMessage(ChatColor.GOLD + "/cpe <panel file> " + ChatColor.WHITE + "Export panel to the Online Editor.");
|
||||
}
|
||||
if (p.hasPermission("commandpanel.import")) {
|
||||
p.sendMessage(ChatColor.GOLD + "/cpi [file name] [URL] " + ChatColor.WHITE + "Downloads a panel from a raw link online.");
|
||||
p.sendMessage(ChatColor.GOLD + "/cpi <file name> <URL> " + ChatColor.WHITE + "Downloads a panel from a raw link online.");
|
||||
}
|
||||
if (p.hasPermission("commandpanel.list")) {
|
||||
p.sendMessage(ChatColor.GOLD + "/cpl " + ChatColor.WHITE + "Lists the currently loaded panels.");
|
||||
|
@ -1,718 +0,0 @@
|
||||
package me.rockyhawk.commandpanels;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.ServicePriority;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import java.io.*;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.logging.Level;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
/**
|
||||
* bStats collects some data for plugin authors.
|
||||
* <p>
|
||||
* Check out https://bStats.org/ to learn more about bStats!
|
||||
*/
|
||||
@SuppressWarnings({"WeakerAccess", "unused"})
|
||||
public class Metrics {
|
||||
|
||||
static {
|
||||
// You can use the property to disable the check in your test environment
|
||||
if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) {
|
||||
// Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D
|
||||
final String defaultPackage = new String(
|
||||
new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'});
|
||||
final String examplePackage = new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'});
|
||||
// We want to make sure nobody just copy & pastes the example and use the wrong package names
|
||||
if (Metrics.class.getPackage().getName().equals(defaultPackage) || Metrics.class.getPackage().getName().equals(examplePackage)) {
|
||||
throw new IllegalStateException("bStats Metrics class has not been relocated correctly!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The version of this bStats class
|
||||
public static final int B_STATS_VERSION = 1;
|
||||
|
||||
// The url to which the data is sent
|
||||
private static final String URL = "https://bStats.org/submitData/bukkit";
|
||||
|
||||
// Is bStats enabled on this server?
|
||||
private boolean enabled;
|
||||
|
||||
// Should failed requests be logged?
|
||||
private static boolean logFailedRequests;
|
||||
|
||||
// Should the sent data be logged?
|
||||
private static boolean logSentData;
|
||||
|
||||
// Should the response text be logged?
|
||||
private static boolean logResponseStatusText;
|
||||
|
||||
// The uuid of the server
|
||||
private static String serverUUID;
|
||||
|
||||
// The plugin
|
||||
private final Plugin plugin;
|
||||
|
||||
// A list with all custom charts
|
||||
private final List<CustomChart> charts = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param plugin The plugin which stats should be submitted.
|
||||
*/
|
||||
public Metrics(Plugin plugin) {
|
||||
if (plugin == null) {
|
||||
throw new IllegalArgumentException("Plugin cannot be null!");
|
||||
}
|
||||
this.plugin = plugin;
|
||||
|
||||
// Get the config file
|
||||
File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats");
|
||||
File configFile = new File(bStatsFolder, "config.yml");
|
||||
YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
|
||||
|
||||
// Check if the config file exists
|
||||
if (!config.isSet("serverUuid")) {
|
||||
|
||||
// Add default values
|
||||
config.addDefault("enabled", true);
|
||||
// Every server gets it's unique random id.
|
||||
config.addDefault("serverUuid", UUID.randomUUID().toString());
|
||||
// Should failed request be logged?
|
||||
config.addDefault("logFailedRequests", false);
|
||||
// Should the sent data be logged?
|
||||
config.addDefault("logSentData", false);
|
||||
// Should the response text be logged?
|
||||
config.addDefault("logResponseStatusText", false);
|
||||
|
||||
// Inform the server owners about bStats
|
||||
config.options().header(
|
||||
"bStats collects some data for plugin authors like how many servers are using their plugins.\n" +
|
||||
"To honor their work, you should not disable it.\n" +
|
||||
"This has nearly no effect on the server performance!\n" +
|
||||
"Check out https://bStats.org/ to learn more :)"
|
||||
).copyDefaults(true);
|
||||
try {
|
||||
config.save(configFile);
|
||||
} catch (IOException ignored) { }
|
||||
}
|
||||
|
||||
// Load the data
|
||||
enabled = config.getBoolean("enabled", true);
|
||||
serverUUID = config.getString("serverUuid");
|
||||
logFailedRequests = config.getBoolean("logFailedRequests", false);
|
||||
logSentData = config.getBoolean("logSentData", false);
|
||||
logResponseStatusText = config.getBoolean("logResponseStatusText", false);
|
||||
|
||||
if (enabled) {
|
||||
boolean found = false;
|
||||
// Search for all other bStats Metrics classes to see if we are the first one
|
||||
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
|
||||
try {
|
||||
service.getField("B_STATS_VERSION"); // Our identifier :)
|
||||
found = true; // We aren't the first
|
||||
break;
|
||||
} catch (NoSuchFieldException ignored) { }
|
||||
}
|
||||
// Register our service
|
||||
Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal);
|
||||
if (!found) {
|
||||
// We are the first!
|
||||
startSubmitting();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if bStats is enabled.
|
||||
*
|
||||
* @return Whether bStats is enabled or not.
|
||||
*/
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a custom chart.
|
||||
*
|
||||
* @param chart The chart to add.
|
||||
*/
|
||||
public void addCustomChart(CustomChart chart) {
|
||||
if (chart == null) {
|
||||
throw new IllegalArgumentException("Chart cannot be null!");
|
||||
}
|
||||
charts.add(chart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the Scheduler which submits our data every 30 minutes.
|
||||
*/
|
||||
private void startSubmitting() {
|
||||
final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags
|
||||
timer.scheduleAtFixedRate(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!plugin.isEnabled()) { // Plugin was disabled
|
||||
timer.cancel();
|
||||
return;
|
||||
}
|
||||
// Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler
|
||||
// Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;)
|
||||
Bukkit.getScheduler().runTask(plugin, () -> submitData());
|
||||
}
|
||||
}, 1000 * 60 * 5, 1000 * 60 * 30);
|
||||
// Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start
|
||||
// WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted!
|
||||
// WARNING: Just don't do it!
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the plugin specific data.
|
||||
* This method is called using Reflection.
|
||||
*
|
||||
* @return The plugin specific data.
|
||||
*/
|
||||
public JsonObject getPluginData() {
|
||||
JsonObject data = new JsonObject();
|
||||
|
||||
String pluginName = plugin.getDescription().getName();
|
||||
String pluginVersion = plugin.getDescription().getVersion();
|
||||
|
||||
data.addProperty("pluginName", pluginName); // Append the name of the plugin
|
||||
data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin
|
||||
JsonArray customCharts = new JsonArray();
|
||||
for (CustomChart customChart : charts) {
|
||||
// Add the data of the custom charts
|
||||
JsonObject chart = customChart.getRequestJsonObject();
|
||||
if (chart == null) { // If the chart is null, we skip it
|
||||
continue;
|
||||
}
|
||||
customCharts.add(chart);
|
||||
}
|
||||
data.add("customCharts", customCharts);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the server specific data.
|
||||
*
|
||||
* @return The server specific data.
|
||||
*/
|
||||
private JsonObject getServerData() {
|
||||
// Minecraft specific data
|
||||
int playerAmount;
|
||||
try {
|
||||
// Around MC 1.8 the return type was changed to a collection from an array,
|
||||
// This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection;
|
||||
Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers");
|
||||
playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class)
|
||||
? ((Collection<?>) onlinePlayersMethod.invoke(Bukkit.getServer())).size()
|
||||
: ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length;
|
||||
} catch (Exception e) {
|
||||
playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed
|
||||
}
|
||||
int onlineMode = Bukkit.getOnlineMode() ? 1 : 0;
|
||||
String bukkitVersion = Bukkit.getVersion();
|
||||
String bukkitName = Bukkit.getName();
|
||||
|
||||
// OS/Java specific data
|
||||
String javaVersion = System.getProperty("java.version");
|
||||
String osName = System.getProperty("os.name");
|
||||
String osArch = System.getProperty("os.arch");
|
||||
String osVersion = System.getProperty("os.version");
|
||||
int coreCount = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
JsonObject data = new JsonObject();
|
||||
|
||||
data.addProperty("serverUUID", serverUUID);
|
||||
|
||||
data.addProperty("playerAmount", playerAmount);
|
||||
data.addProperty("onlineMode", onlineMode);
|
||||
data.addProperty("bukkitVersion", bukkitVersion);
|
||||
data.addProperty("bukkitName", bukkitName);
|
||||
|
||||
data.addProperty("javaVersion", javaVersion);
|
||||
data.addProperty("osName", osName);
|
||||
data.addProperty("osArch", osArch);
|
||||
data.addProperty("osVersion", osVersion);
|
||||
data.addProperty("coreCount", coreCount);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collects the data and sends it afterwards.
|
||||
*/
|
||||
private void submitData() {
|
||||
final JsonObject data = getServerData();
|
||||
|
||||
JsonArray pluginData = new JsonArray();
|
||||
// Search for all other bStats Metrics classes to get their plugin data
|
||||
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
|
||||
try {
|
||||
service.getField("B_STATS_VERSION"); // Our identifier :)
|
||||
|
||||
for (RegisteredServiceProvider<?> provider : Bukkit.getServicesManager().getRegistrations(service)) {
|
||||
try {
|
||||
Object plugin = provider.getService().getMethod("getPluginData").invoke(provider.getProvider());
|
||||
if (plugin instanceof JsonObject) {
|
||||
pluginData.add((JsonObject) plugin);
|
||||
} else { // old bstats version compatibility
|
||||
try {
|
||||
Class<?> jsonObjectJsonSimple = Class.forName("org.json.simple.JSONObject");
|
||||
if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) {
|
||||
Method jsonStringGetter = jsonObjectJsonSimple.getDeclaredMethod("toJSONString");
|
||||
jsonStringGetter.setAccessible(true);
|
||||
String jsonString = (String) jsonStringGetter.invoke(plugin);
|
||||
JsonObject object = new JsonParser().parse(jsonString).getAsJsonObject();
|
||||
pluginData.add(object);
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
// minecraft version 1.14+
|
||||
if (logFailedRequests) {
|
||||
this.plugin.getLogger().log(Level.SEVERE, "Encountered unexpected exception", e);
|
||||
}
|
||||
continue; // continue looping since we cannot do any other thing.
|
||||
}
|
||||
}
|
||||
} catch (NullPointerException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { }
|
||||
}
|
||||
} catch (NoSuchFieldException ignored) { }
|
||||
}
|
||||
|
||||
data.add("plugins", pluginData);
|
||||
|
||||
// Create a new thread for the connection to the bStats server
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
// Send the data
|
||||
sendData(plugin, data);
|
||||
} catch (Exception e) {
|
||||
// Something went wrong! :(
|
||||
if (logFailedRequests) {
|
||||
plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the data to the bStats server.
|
||||
*
|
||||
* @param plugin Any plugin. It's just used to get a logger instance.
|
||||
* @param data The data to send.
|
||||
* @throws Exception If the request failed.
|
||||
*/
|
||||
private static void sendData(Plugin plugin, JsonObject data) throws Exception {
|
||||
if (data == null) {
|
||||
throw new IllegalArgumentException("Data cannot be null!");
|
||||
}
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
throw new IllegalAccessException("This method must not be called from the main thread!");
|
||||
}
|
||||
if (logSentData) {
|
||||
plugin.getLogger().info("Sending data to bStats: " + data.toString());
|
||||
}
|
||||
HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection();
|
||||
|
||||
// Compress the data to save bandwidth
|
||||
byte[] compressedData = compress(data.toString());
|
||||
|
||||
// Add headers
|
||||
connection.setRequestMethod("POST");
|
||||
connection.addRequestProperty("Accept", "application/json");
|
||||
connection.addRequestProperty("Connection", "close");
|
||||
connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request
|
||||
connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
|
||||
connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format
|
||||
connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION);
|
||||
|
||||
// Send data
|
||||
connection.setDoOutput(true);
|
||||
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
|
||||
outputStream.write(compressedData);
|
||||
outputStream.flush();
|
||||
outputStream.close();
|
||||
|
||||
InputStream inputStream = connection.getInputStream();
|
||||
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String line;
|
||||
while ((line = bufferedReader.readLine()) != null) {
|
||||
builder.append(line);
|
||||
}
|
||||
bufferedReader.close();
|
||||
if (logResponseStatusText) {
|
||||
plugin.getLogger().info("Sent data to bStats and received response: " + builder.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gzips the given String.
|
||||
*
|
||||
* @param str The string to gzip.
|
||||
* @return The gzipped String.
|
||||
* @throws IOException If the compression failed.
|
||||
*/
|
||||
private static byte[] compress(final String str) throws IOException {
|
||||
if (str == null) {
|
||||
return null;
|
||||
}
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
GZIPOutputStream gzip = new GZIPOutputStream(outputStream);
|
||||
gzip.write(str.getBytes(StandardCharsets.UTF_8));
|
||||
gzip.close();
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom chart.
|
||||
*/
|
||||
public static abstract class CustomChart {
|
||||
|
||||
// The id of the chart
|
||||
final String chartId;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
CustomChart(String chartId) {
|
||||
if (chartId == null || chartId.isEmpty()) {
|
||||
throw new IllegalArgumentException("ChartId cannot be null or empty!");
|
||||
}
|
||||
this.chartId = chartId;
|
||||
}
|
||||
|
||||
private JsonObject getRequestJsonObject() {
|
||||
JsonObject chart = new JsonObject();
|
||||
chart.addProperty("chartId", chartId);
|
||||
try {
|
||||
JsonObject data = getChartData();
|
||||
if (data == null) {
|
||||
// If the data is null we don't send the chart.
|
||||
return null;
|
||||
}
|
||||
chart.add("data", data);
|
||||
} catch (Throwable t) {
|
||||
if (logFailedRequests) {
|
||||
Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return chart;
|
||||
}
|
||||
|
||||
protected abstract JsonObject getChartData() throws Exception;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom simple pie.
|
||||
*/
|
||||
public static class SimplePie extends CustomChart {
|
||||
|
||||
private final Callable<String> callable;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
* @param callable The callable which is used to request the chart data.
|
||||
*/
|
||||
public SimplePie(String chartId, Callable<String> callable) {
|
||||
super(chartId);
|
||||
this.callable = callable;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JsonObject getChartData() throws Exception {
|
||||
JsonObject data = new JsonObject();
|
||||
String value = callable.call();
|
||||
if (value == null || value.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.addProperty("value", value);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom advanced pie.
|
||||
*/
|
||||
public static class AdvancedPie extends CustomChart {
|
||||
|
||||
private final Callable<Map<String, Integer>> callable;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
* @param callable The callable which is used to request the chart data.
|
||||
*/
|
||||
public AdvancedPie(String chartId, Callable<Map<String, Integer>> callable) {
|
||||
super(chartId);
|
||||
this.callable = callable;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JsonObject getChartData() throws Exception {
|
||||
JsonObject data = new JsonObject();
|
||||
JsonObject values = new JsonObject();
|
||||
Map<String, Integer> map = callable.call();
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
boolean allSkipped = true;
|
||||
for (Map.Entry<String, Integer> entry : map.entrySet()) {
|
||||
if (entry.getValue() == 0) {
|
||||
continue; // Skip this invalid
|
||||
}
|
||||
allSkipped = false;
|
||||
values.addProperty(entry.getKey(), entry.getValue());
|
||||
}
|
||||
if (allSkipped) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.add("values", values);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom drilldown pie.
|
||||
*/
|
||||
public static class DrilldownPie extends CustomChart {
|
||||
|
||||
private final Callable<Map<String, Map<String, Integer>>> callable;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
* @param callable The callable which is used to request the chart data.
|
||||
*/
|
||||
public DrilldownPie(String chartId, Callable<Map<String, Map<String, Integer>>> callable) {
|
||||
super(chartId);
|
||||
this.callable = callable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject getChartData() throws Exception {
|
||||
JsonObject data = new JsonObject();
|
||||
JsonObject values = new JsonObject();
|
||||
Map<String, Map<String, Integer>> map = callable.call();
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
boolean reallyAllSkipped = true;
|
||||
for (Map.Entry<String, Map<String, Integer>> entryValues : map.entrySet()) {
|
||||
JsonObject value = new JsonObject();
|
||||
boolean allSkipped = true;
|
||||
for (Map.Entry<String, Integer> valueEntry : map.get(entryValues.getKey()).entrySet()) {
|
||||
value.addProperty(valueEntry.getKey(), valueEntry.getValue());
|
||||
allSkipped = false;
|
||||
}
|
||||
if (!allSkipped) {
|
||||
reallyAllSkipped = false;
|
||||
values.add(entryValues.getKey(), value);
|
||||
}
|
||||
}
|
||||
if (reallyAllSkipped) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.add("values", values);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom single line chart.
|
||||
*/
|
||||
public static class SingleLineChart extends CustomChart {
|
||||
|
||||
private final Callable<Integer> callable;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
* @param callable The callable which is used to request the chart data.
|
||||
*/
|
||||
public SingleLineChart(String chartId, Callable<Integer> callable) {
|
||||
super(chartId);
|
||||
this.callable = callable;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JsonObject getChartData() throws Exception {
|
||||
JsonObject data = new JsonObject();
|
||||
int value = callable.call();
|
||||
if (value == 0) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.addProperty("value", value);
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom multi line chart.
|
||||
*/
|
||||
public static class MultiLineChart extends CustomChart {
|
||||
|
||||
private final Callable<Map<String, Integer>> callable;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
* @param callable The callable which is used to request the chart data.
|
||||
*/
|
||||
public MultiLineChart(String chartId, Callable<Map<String, Integer>> callable) {
|
||||
super(chartId);
|
||||
this.callable = callable;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JsonObject getChartData() throws Exception {
|
||||
JsonObject data = new JsonObject();
|
||||
JsonObject values = new JsonObject();
|
||||
Map<String, Integer> map = callable.call();
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
boolean allSkipped = true;
|
||||
for (Map.Entry<String, Integer> entry : map.entrySet()) {
|
||||
if (entry.getValue() == 0) {
|
||||
continue; // Skip this invalid
|
||||
}
|
||||
allSkipped = false;
|
||||
values.addProperty(entry.getKey(), entry.getValue());
|
||||
}
|
||||
if (allSkipped) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.add("values", values);
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom simple bar chart.
|
||||
*/
|
||||
public static class SimpleBarChart extends CustomChart {
|
||||
|
||||
private final Callable<Map<String, Integer>> callable;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
* @param callable The callable which is used to request the chart data.
|
||||
*/
|
||||
public SimpleBarChart(String chartId, Callable<Map<String, Integer>> callable) {
|
||||
super(chartId);
|
||||
this.callable = callable;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JsonObject getChartData() throws Exception {
|
||||
JsonObject data = new JsonObject();
|
||||
JsonObject values = new JsonObject();
|
||||
Map<String, Integer> map = callable.call();
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
for (Map.Entry<String, Integer> entry : map.entrySet()) {
|
||||
JsonArray categoryValues = new JsonArray();
|
||||
categoryValues.add(entry.getValue());
|
||||
values.add(entry.getKey(), categoryValues);
|
||||
}
|
||||
data.add("values", values);
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom advanced bar chart.
|
||||
*/
|
||||
public static class AdvancedBarChart extends CustomChart {
|
||||
|
||||
private final Callable<Map<String, int[]>> callable;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
* @param callable The callable which is used to request the chart data.
|
||||
*/
|
||||
public AdvancedBarChart(String chartId, Callable<Map<String, int[]>> callable) {
|
||||
super(chartId);
|
||||
this.callable = callable;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JsonObject getChartData() throws Exception {
|
||||
JsonObject data = new JsonObject();
|
||||
JsonObject values = new JsonObject();
|
||||
Map<String, int[]> map = callable.call();
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
boolean allSkipped = true;
|
||||
for (Map.Entry<String, int[]> entry : map.entrySet()) {
|
||||
if (entry.getValue().length == 0) {
|
||||
continue; // Skip this invalid
|
||||
}
|
||||
allSkipped = false;
|
||||
JsonArray categoryValues = new JsonArray();
|
||||
for (int categoryValue : entry.getValue()) {
|
||||
categoryValues.add(categoryValue);
|
||||
}
|
||||
values.add(entry.getKey(), categoryValues);
|
||||
}
|
||||
if (allSkipped) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.add("values", values);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -45,7 +45,7 @@ public class Utils implements Listener {
|
||||
//if the panel is clicked on the outside area of the GUI
|
||||
if (panel.getConfig().contains("outside-commands")) {
|
||||
try {
|
||||
plugin.commandTags.runCommands(panel,PanelPosition.Top,p, panel.getConfig().getStringList("outside-commands"),e.getClick());
|
||||
plugin.commandRunner.runCommands(panel,PanelPosition.Top,p, panel.getConfig().getStringList("outside-commands"),e.getClick());
|
||||
}catch(Exception s){
|
||||
plugin.debug(s,p);
|
||||
}
|
||||
@ -87,23 +87,24 @@ public class Utils implements Listener {
|
||||
panel = plugin.openPanels.getOpenPanel(p.getName(),position);
|
||||
|
||||
//this loops through all the items in the panel
|
||||
boolean foundSlot = false;
|
||||
for(String slot : Objects.requireNonNull(panel.getConfig().getConfigurationSection("item")).getKeys(false)){
|
||||
String foundSlot = null;
|
||||
for(String item : Objects.requireNonNull(panel.getConfig().getConfigurationSection("item")).getKeys(false)){
|
||||
String slot = plugin.tex.placeholdersNoColour(panel, position, p, item);
|
||||
if (slot.equals(Integer.toString(clickedSlot))) {
|
||||
foundSlot = true;
|
||||
foundSlot = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!foundSlot){
|
||||
if(foundSlot == null){
|
||||
e.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
//get the section of the slot that was clicked
|
||||
String section = plugin.has.hasSection(panel,position,panel.getConfig().getConfigurationSection("item." + clickedSlot), p);
|
||||
String section = plugin.has.hasSection(panel,position,panel.getConfig().getConfigurationSection("item." + foundSlot), p);
|
||||
|
||||
if(panel.getConfig().contains("item." + clickedSlot + section + ".itemType")){
|
||||
if(panel.getConfig().getStringList("item." + clickedSlot + section + ".itemType").contains("placeable")){
|
||||
if(panel.getConfig().contains("item." + foundSlot + section + ".itemType")){
|
||||
if(panel.getConfig().getStringList("item." + foundSlot + section + ".itemType").contains("placeable")){
|
||||
//skip if the item is a placeable
|
||||
e.setCancelled(false);
|
||||
return;
|
||||
@ -115,26 +116,14 @@ public class Utils implements Listener {
|
||||
p.updateInventory();
|
||||
|
||||
//if an item has an area for input instead of commands
|
||||
if(panel.getConfig().contains("item." + clickedSlot + section + ".player-input")) {
|
||||
plugin.inputUtils.playerInput.put(p,new PlayerInput(panel,panel.getConfig().getStringList("item." + clickedSlot + section + ".player-input"),e.getClick()));
|
||||
if(panel.getConfig().contains("item." + foundSlot + section + ".player-input")) {
|
||||
plugin.inputUtils.playerInput.put(p,new PlayerInput(panel,panel.getConfig().getStringList("item." + foundSlot + section + ".player-input"),e.getClick()));
|
||||
plugin.inputUtils.sendMessage(panel,position,p);
|
||||
}
|
||||
|
||||
if(panel.getConfig().contains("item." + clickedSlot + section + ".commands")) {
|
||||
List<String> commands = panel.getConfig().getStringList("item." + clickedSlot + section + ".commands");
|
||||
if (commands.size() != 0) {
|
||||
//this will replace a sequence tag command with the commands from the sequence
|
||||
List<String> commandsAfterSequence = commands;
|
||||
for (int i = 0; commands.size() - 1 >= i; i++) {
|
||||
if(commands.get(i).startsWith("sequence=")){
|
||||
String locationOfSequence = commands.get(i).split("\\s")[1];
|
||||
List<String> commandsSequence = panel.getConfig().getStringList(locationOfSequence);
|
||||
commandsAfterSequence.remove(i);
|
||||
commandsAfterSequence.addAll(i,commandsSequence);
|
||||
}
|
||||
}
|
||||
commands = commandsAfterSequence;
|
||||
|
||||
if(panel.getConfig().contains("item." + foundSlot + section + ".commands")) {
|
||||
List<String> commands = panel.getConfig().getStringList("item." + foundSlot + section + ".commands");
|
||||
if (!commands.isEmpty()) {
|
||||
for (int i = 0; commands.size() > i; i++) {
|
||||
try {
|
||||
commands.set(i, commands.get(i).replaceAll("%cp-clicked%", e.getCurrentItem().getType().toString()));
|
||||
@ -142,8 +131,13 @@ public class Utils implements Listener {
|
||||
commands.set(i, commands.get(i).replaceAll("%cp-clicked%", "AIR"));
|
||||
}
|
||||
}
|
||||
|
||||
plugin.commandTags.runCommands(panel,position,p,commands,e.getClick());
|
||||
if (panel.getConfig().contains("item." + foundSlot + section + ".multi-paywall")) {
|
||||
plugin.commandRunner.runMultiPaywall(panel,position,p,
|
||||
panel.getConfig().getStringList("item." + foundSlot + section + ".multi-paywall"),
|
||||
commands,e.getClick());
|
||||
} else {
|
||||
plugin.commandRunner.runCommands(panel, position, p, commands, e.getClick());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ public class Panel{
|
||||
public ItemStack getHotbarItem(Player p){
|
||||
if (this.getConfig().contains("open-with-item.pre-load-commands")) {
|
||||
try {
|
||||
plugin.commandTags.runCommands(this,PanelPosition.Top,p, this.getConfig().getStringList("open-with-item.pre-load-commands"));
|
||||
plugin.commandRunner.runCommands(this,PanelPosition.Top,p, this.getConfig().getStringList("open-with-item.pre-load-commands"), null);
|
||||
}catch(Exception s){
|
||||
plugin.debug(s,p);
|
||||
}
|
||||
@ -99,7 +99,7 @@ public class Panel{
|
||||
}
|
||||
try {
|
||||
//add NBT to item and return the ItemStack
|
||||
return plugin.nbt.setNBT(s, "CommandPanelsHotbar", panelName + ":" + slot);
|
||||
return plugin.nbt.setNBT(s, "CommandPanelsHotbar", "string_" + panelName + ":" + slot);
|
||||
}catch(Exception e) {
|
||||
//return air if null
|
||||
return new ItemStack(Material.AIR);
|
||||
|
@ -82,7 +82,7 @@ public class ExecuteOpenVoids {
|
||||
//execute commands once the panel opens
|
||||
if (panel.getConfig().contains("commands-on-open")) {
|
||||
try {
|
||||
plugin.commandTags.runCommands(panel,position,p, panel.getConfig().getStringList("commands-on-open"));
|
||||
plugin.commandRunner.runCommands(panel,position,p, panel.getConfig().getStringList("commands-on-open"), null);
|
||||
}catch(Exception s){
|
||||
p.sendMessage(plugin.tex.colour(plugin.tag + plugin.config.getString("config.format.error") + " " + "commands-on-open: " + panel.getConfig().getString("commands-on-open")));
|
||||
}
|
||||
@ -155,7 +155,7 @@ public class ExecuteOpenVoids {
|
||||
public void beforeLoadCommands(Panel panel,PanelPosition pos, Player p){
|
||||
if (panel.getConfig().contains("pre-load-commands")) {
|
||||
try {
|
||||
plugin.commandTags.runCommands(panel,pos,p, panel.getConfig().getStringList("pre-load-commands"));
|
||||
plugin.commandRunner.runCommands(panel,pos,p, panel.getConfig().getStringList("pre-load-commands"), null);
|
||||
}catch(Exception s){
|
||||
plugin.debug(s,p);
|
||||
}
|
||||
|
@ -1,150 +0,0 @@
|
||||
package me.rockyhawk.commandpanels.classresources;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.properties.Property;
|
||||
import com.mojang.authlib.properties.PropertyMap;
|
||||
import me.rockyhawk.commandpanels.CommandPanels;
|
||||
import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.UUID;
|
||||
|
||||
public class GetCustomHeads {
|
||||
CommandPanels plugin;
|
||||
public GetCustomHeads(CommandPanels pl) {
|
||||
this.plugin = pl;
|
||||
}
|
||||
|
||||
//contains cached player name and then base64 value (clears on /cpr reload)
|
||||
//also will clear if the map reaches a length of 1000 which is roughly 135 KB RAM usage
|
||||
public HashMap<String, String> playerHeadTextures = new HashMap<>();
|
||||
|
||||
public String getHeadBase64(ItemStack head) {
|
||||
if (plugin.getHeads.ifSkullOrHead(head.getType().toString()) && head.hasItemMeta()) {
|
||||
try {
|
||||
SkullMeta meta = (SkullMeta) head.getItemMeta();
|
||||
assert meta != null;
|
||||
if (!meta.hasOwner()) {
|
||||
Field fld = meta.getClass().getDeclaredField("profile");
|
||||
fld.setAccessible(true);
|
||||
GameProfile prof = (GameProfile) fld.get(meta);
|
||||
Iterator itr = prof.getProperties().get("textures").iterator();
|
||||
if (itr.hasNext()) {
|
||||
Property var5 = (Property) itr.next();
|
||||
return var5.getValue();
|
||||
}
|
||||
}
|
||||
}catch(Exception exc){/*skip return null*/}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//getting the head from a Player Name
|
||||
@SuppressWarnings("deprecation")
|
||||
public ItemStack getPlayerHead(String name) {
|
||||
byte id = 0;
|
||||
if (plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)) {
|
||||
id = 3;
|
||||
}
|
||||
|
||||
//get texture if already cached
|
||||
if(playerHeadTextures.containsKey(name)) {
|
||||
return getCustomHead(playerHeadTextures.get(name));
|
||||
}
|
||||
|
||||
try {
|
||||
// Fetch the player UUID from the Mojang API
|
||||
URL uuidUrl = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
|
||||
URLConnection uuidConnection = uuidUrl.openConnection();
|
||||
uuidConnection.setConnectTimeout(2000); // Set connection timeout to 2 seconds
|
||||
uuidConnection.setReadTimeout(2000); // Set read timeout to 2 seconds
|
||||
Reader uuidReader = new InputStreamReader(uuidConnection.getInputStream(), StandardCharsets.UTF_8);
|
||||
JSONObject uuidResponse = (JSONObject) new JSONParser().parse(uuidReader);
|
||||
String uuid = (String) uuidResponse.get("id");
|
||||
|
||||
// Fetch the skin texture from the Mojang API using the player UUID
|
||||
URL texturesUrl = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid);
|
||||
URLConnection texturesConnection = texturesUrl.openConnection();
|
||||
texturesConnection.setConnectTimeout(2000); // Set connection timeout to 2 seconds
|
||||
texturesConnection.setReadTimeout(2000); // Set read timeout to 2 seconds
|
||||
Reader texturesReader = new InputStreamReader(texturesConnection.getInputStream(), StandardCharsets.UTF_8);
|
||||
JSONObject texturesResponse = (JSONObject) new JSONParser().parse(texturesReader);
|
||||
JSONArray propertiesArray = (JSONArray) texturesResponse.get("properties");
|
||||
JSONObject texturesProperty = (JSONObject) propertiesArray.get(0);
|
||||
String base64Texture = (String) texturesProperty.get("value");
|
||||
playerHeadTextures.put(name, base64Texture);
|
||||
|
||||
// Create a custom head using the Base64 texture string
|
||||
return getCustomHead(base64Texture);
|
||||
} catch (Exception e) {
|
||||
// Fallback to setting the owner if the Mojang API request fails
|
||||
ItemStack itemStack = new ItemStack(Material.matchMaterial(plugin.getHeads.playerHeadString()), 1, id);
|
||||
SkullMeta meta = (SkullMeta) itemStack.getItemMeta();
|
||||
meta.setOwner(name);
|
||||
itemStack.setItemMeta(meta);
|
||||
return itemStack;
|
||||
}
|
||||
}
|
||||
|
||||
//used to get heads from Base64 Textures
|
||||
@SuppressWarnings("deprecation")
|
||||
public ItemStack getCustomHead(String b64stringtexture) {
|
||||
//get head from base64
|
||||
GameProfile profile = new GameProfile(UUID.randomUUID(), null);
|
||||
PropertyMap propertyMap = profile.getProperties();
|
||||
if (propertyMap == null) {
|
||||
throw new IllegalStateException("Profile doesn't contain a property map");
|
||||
} else {
|
||||
propertyMap.put("textures", new Property("textures", b64stringtexture));
|
||||
byte id = 0;
|
||||
if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){
|
||||
id = 3;
|
||||
}
|
||||
ItemStack head = new ItemStack(Material.matchMaterial(plugin.getHeads.playerHeadString()), 1,id);
|
||||
ItemMeta headMeta = head.getItemMeta();
|
||||
assert headMeta != null;
|
||||
|
||||
Field profileField;
|
||||
Method setProfileMethod = null;
|
||||
try {
|
||||
profileField = headMeta.getClass().getDeclaredField("profile");
|
||||
profileField.setAccessible(true);
|
||||
profileField.set(headMeta, profile);
|
||||
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) {
|
||||
try {
|
||||
setProfileMethod = headMeta.getClass().getDeclaredMethod("setProfile", GameProfile.class);
|
||||
} catch (NoSuchMethodException ignore) {}
|
||||
} catch (SecurityException ignored) {}
|
||||
try {
|
||||
if (setProfileMethod == null) {
|
||||
profileField = headMeta.getClass().getDeclaredField("profile");
|
||||
profileField.setAccessible(true);
|
||||
profileField.set(headMeta, profile);
|
||||
} else {
|
||||
setProfileMethod.setAccessible(true);
|
||||
setProfileMethod.invoke(headMeta, profile);
|
||||
}
|
||||
} catch (Exception e1) {
|
||||
plugin.debug(e1,null);
|
||||
}
|
||||
|
||||
head.setItemMeta(headMeta);
|
||||
return head;
|
||||
}
|
||||
}
|
||||
}
|
@ -9,9 +9,7 @@ import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.*;
|
||||
|
||||
public class HasSections {
|
||||
CommandPanels plugin;
|
||||
@ -19,74 +17,85 @@ public class HasSections {
|
||||
plugin = pl;
|
||||
}
|
||||
|
||||
public String hasSection(Panel panel, PanelPosition position, ConfigurationSection cf, Player p){
|
||||
for (int count = 0; cf.getKeys(false).size() > count; count++) {
|
||||
String setName;
|
||||
if(cf.isSet("has" + count)) {
|
||||
setName = "has" + count;
|
||||
}else{
|
||||
continue;
|
||||
public String hasSection(Panel panel, PanelPosition position, ConfigurationSection cf, Player p) {
|
||||
// Use a TreeMap to automatically sort the sections by the extracted number.
|
||||
Map<Integer, String> sortedSections = new TreeMap<>();
|
||||
|
||||
// Loop through the section names and filter for the ones starting with "has".
|
||||
for (String key : cf.getKeys(false)) {
|
||||
if (!cf.isConfigurationSection(key)) continue;
|
||||
|
||||
// Check if the section starts with "has" and is followed by a number.
|
||||
if (key.startsWith("has")) {
|
||||
try {
|
||||
// Extract the number after "has" and put it in the map for sorting.
|
||||
int number = Integer.parseInt(key.substring(3));
|
||||
sortedSections.put(number, key);
|
||||
} catch (NumberFormatException ignore) {
|
||||
// If the section name doesn't have a valid number after "has", skip it.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean endProcess = true;
|
||||
//loop through possible values and compares for hypothetical and operators
|
||||
for (int a = 0; cf.getConfigurationSection(setName).getKeys(false).size() > a; a++) {
|
||||
if(cf.isSet(setName + ".value" + a) && cf.isSet(setName + ".compare" + a)){
|
||||
//ensure the endProcess variable has been reset for another operation
|
||||
endProcess = true;
|
||||
//get the values of this statement
|
||||
String value;
|
||||
String compare;
|
||||
try {
|
||||
value = ChatColor.stripColor(plugin.tex.placeholders(panel, position, p, cf.getString(setName + ".value" + a)));
|
||||
compare = ChatColor.stripColor(plugin.tex.placeholders(panel, position, p, cf.getString(setName + ".compare" + a)));
|
||||
}catch (Exception e) {
|
||||
//if errors getting text return
|
||||
plugin.debug(e,p);
|
||||
return "";
|
||||
}
|
||||
for (String hasSection : sortedSections.values()) {
|
||||
if (!cf.isConfigurationSection(hasSection)) continue;
|
||||
|
||||
String operator = "AND";
|
||||
if(compare.endsWith(" OR")){
|
||||
compare = compare.substring(0, compare.length()-3);
|
||||
operator = "OR";
|
||||
}else if(compare.endsWith(" AND")){
|
||||
compare = compare.substring(0, compare.length()-4);
|
||||
}
|
||||
ConfigurationSection currentSection = cf.getConfigurationSection(hasSection);
|
||||
int numberOfConditions = currentSection.getKeys(false).size();
|
||||
|
||||
//list of values with the or operator
|
||||
HashSet<String> values = doOperators(new HashSet<>(Collections.singletonList(value)));
|
||||
//go through all values with the or operator
|
||||
for(String val : values){
|
||||
if (hasProcess(setName, val, compare, p)) {
|
||||
endProcess = false;
|
||||
//if it is true and it is OR, there is no need to check the next value in the line
|
||||
if(operator.equals("OR")){
|
||||
a++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(endProcess){
|
||||
//check if the operator link between the next value/compare is OR
|
||||
if(operator.equals("OR")){
|
||||
//I can just continue because the algorithm already assumes the last sequence was true
|
||||
endProcess = false;
|
||||
continue;
|
||||
}
|
||||
Boolean currentBlockResult = null; // This will store the result of the current block (a set of conditions combined by AND or OR).
|
||||
String previousOperator = "AND"; // Default logical operator to start with.
|
||||
|
||||
for (int a = 0; a < numberOfConditions; a++) {
|
||||
if (!currentSection.isSet("value" + a) || !currentSection.isSet("compare" + a)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String value = ChatColor.stripColor(plugin.tex.placeholders(panel, position, p, currentSection.getString("value" + a)));
|
||||
String compare = ChatColor.stripColor(plugin.tex.placeholders(panel, position, p, currentSection.getString("compare" + a)));
|
||||
|
||||
String operator = "AND"; // Default operator for the current condition.
|
||||
if (compare.endsWith(" OR")) {
|
||||
compare = compare.substring(0, compare.length() - 3);
|
||||
operator = "OR";
|
||||
} else if (compare.endsWith(" AND")) {
|
||||
compare = compare.substring(0, compare.length() - 4);
|
||||
}
|
||||
|
||||
HashSet<String> values = doOperators(new HashSet<>(Collections.singletonList(value)));
|
||||
boolean localResult = false; // This tracks the result of the current condition.
|
||||
for (String val : values) {
|
||||
if (hasProcess(val, compare)) {
|
||||
localResult = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentBlockResult == null) {
|
||||
// Initialize the result of the block with the result of the first condition.
|
||||
currentBlockResult = localResult;
|
||||
} else {
|
||||
// Combine the result of the current condition with the block result based on the previous operator.
|
||||
if (previousOperator.equals("AND")) {
|
||||
currentBlockResult = currentBlockResult && localResult;
|
||||
} else if (previousOperator.equals("OR")) {
|
||||
currentBlockResult = currentBlockResult || localResult;
|
||||
}
|
||||
}
|
||||
|
||||
previousOperator = operator; // Update the operator for the next condition.
|
||||
}
|
||||
//if the has section is false move to the next has section
|
||||
if(endProcess){
|
||||
continue;
|
||||
|
||||
if (currentBlockResult != null && currentBlockResult) {
|
||||
// If the result of this section is true, check nested sections.
|
||||
return "." + hasSection + hasSection(panel, position, currentSection, p);
|
||||
}
|
||||
//proceed if none of the values were false
|
||||
return "." + setName + hasSection(panel, position, cf.getConfigurationSection(setName), p);
|
||||
// If the result is false, continue to the next 'has' section.
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
private HashSet<String> doOperators(HashSet<String> value){
|
||||
for(String val : value){
|
||||
if(val.contains(" OR ")){
|
||||
@ -98,7 +107,7 @@ public class HasSections {
|
||||
return value;
|
||||
}
|
||||
|
||||
private boolean hasProcess(String setName, String value, String compare,Player p){
|
||||
private boolean hasProcess(String value, String compare){
|
||||
//check to see if the value should be reversed
|
||||
boolean outputValue = true;
|
||||
if(value.startsWith("NOT ")){
|
||||
@ -106,25 +115,17 @@ public class HasSections {
|
||||
outputValue = false;
|
||||
}
|
||||
|
||||
//the original has sections as TinyTank800 wanted to keep them
|
||||
if(setName.startsWith("hasvalue")) {
|
||||
return compare.equals(value) == outputValue;
|
||||
}
|
||||
if(setName.startsWith("hasperm")) {
|
||||
return p.hasPermission(value) == outputValue;
|
||||
}
|
||||
if(setName.startsWith("hasgreater")) {
|
||||
return (Long.parseLong(compare) >= Long.parseLong(value)) == outputValue;
|
||||
}
|
||||
//the current has section with all the functions implemented inside it
|
||||
if(setName.startsWith("has")) {
|
||||
if(value.endsWith(" HASPERM")) {
|
||||
return Bukkit.getPlayer(value.substring(0, value.length()-8)).hasPermission(compare) == outputValue;
|
||||
}else if(value.endsWith(" ISGREATER")) {
|
||||
return (new BigDecimal(compare).compareTo(new BigDecimal(value.substring(0, value.length()-10))) <= 0 == outputValue);
|
||||
}else{
|
||||
return compare.equals(value) == outputValue;
|
||||
if(value.endsWith(" HASPERM")) {
|
||||
String playername = value.substring(0, value.length()-8);
|
||||
Player player = Bukkit.getPlayerExact(playername);
|
||||
if(player != null){
|
||||
return player.hasPermission(compare) == outputValue;
|
||||
}
|
||||
}else if(value.endsWith(" ISGREATER")) {
|
||||
return (new BigDecimal(compare).compareTo(new BigDecimal(value.substring(0, value.length()-10).replace(",",""))) <= 0 == outputValue);
|
||||
}else{
|
||||
return compare.equals(value) == outputValue;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
package me.rockyhawk.commandpanels.classresources;
|
||||
|
||||
import dev.lone.itemsadder.api.CustomStack;
|
||||
import me.arcaniax.hdb.api.HeadDatabaseAPI;
|
||||
import me.rockyhawk.commandpanels.CommandPanels;
|
||||
import me.rockyhawk.commandpanels.api.Panel;
|
||||
import me.rockyhawk.commandpanels.classresources.customheads.SavedCustomHead;
|
||||
import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions;
|
||||
import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition;
|
||||
import net.Indyuce.mmoitems.MMOItems;
|
||||
@ -14,24 +16,20 @@ import org.bukkit.block.banner.PatternType;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.enchantments.EnchantmentTarget;
|
||||
import org.bukkit.enchantments.EnchantmentWrapper;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.*;
|
||||
import org.bukkit.map.MapCanvas;
|
||||
import org.bukkit.map.MapRenderer;
|
||||
import org.bukkit.map.MapView;
|
||||
import org.bukkit.potion.PotionData;
|
||||
import org.bukkit.inventory.meta.trim.ArmorTrim;
|
||||
import org.bukkit.inventory.meta.trim.TrimMaterial;
|
||||
import org.bukkit.inventory.meta.trim.TrimPattern;
|
||||
import org.bukkit.potion.PotionType;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ItemCreation {
|
||||
@ -53,7 +51,7 @@ public class ItemCreation {
|
||||
return null;
|
||||
}
|
||||
ItemStack s = null;
|
||||
boolean hideAttributes = true;
|
||||
boolean hideAttributes = false;
|
||||
String mat;
|
||||
String matraw;
|
||||
String skullname;
|
||||
@ -86,7 +84,7 @@ public class ItemCreation {
|
||||
if (matraw.split("\\s")[0].equalsIgnoreCase("cps=") || matraw.split("\\s")[0].toLowerCase().equals("cpo=")) {
|
||||
skullname = p.getUniqueId().toString();
|
||||
mat = plugin.getHeads.playerHeadString();
|
||||
if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
id = 3;
|
||||
}
|
||||
}
|
||||
@ -94,11 +92,55 @@ public class ItemCreation {
|
||||
if (matraw.split("\\s")[0].equalsIgnoreCase("hdb=")) {
|
||||
skullname = "hdb";
|
||||
mat = plugin.getHeads.playerHeadString();
|
||||
if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
id = 3;
|
||||
}
|
||||
}
|
||||
|
||||
//Oraxen support, uses itemID (eg, oraxen= coin)
|
||||
if (matraw.split("\\s")[0].equalsIgnoreCase("oraxen=")) {
|
||||
String itemID = matraw.split("\\s")[1];
|
||||
try {
|
||||
// Load the OraxenItems class
|
||||
Class<?> oraxenItemsClass = Class.forName("io.th0rgal.oraxen.api.OraxenItems");
|
||||
|
||||
// Retrieve the 'getItemById' method from the OraxenItems class
|
||||
Method getItemByIdMethod = oraxenItemsClass.getMethod("getItemById", String.class);
|
||||
getItemByIdMethod.setAccessible(true);
|
||||
|
||||
// Invoke the 'getItemById' method with the itemID
|
||||
Object oraxenItem = getItemByIdMethod.invoke(null, itemID); // static method, so pass 'null'
|
||||
|
||||
// Ensure that the method returned a valid Oraxen item
|
||||
if (oraxenItem != null) {
|
||||
// Now we need to invoke 'getReferenceClone' on the OraxenItem object
|
||||
Method getReferenceCloneMethod = oraxenItem.getClass().getMethod("getReferenceClone");
|
||||
getReferenceCloneMethod.setAccessible(true);
|
||||
ItemStack stack = (ItemStack) getReferenceCloneMethod.invoke(oraxenItem);
|
||||
|
||||
// Check if stack is not null
|
||||
if (stack != null) {
|
||||
s = stack;
|
||||
normalCreation = false;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
plugin.debug(e, null);
|
||||
// Handle the error or inform the player
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//ItemsAdder support, needs namespaceID (eg, itemsadder= money:coin)
|
||||
if (matraw.split("\\s")[0].equalsIgnoreCase("itemsadder=")) {
|
||||
String namespaceID = matraw.split("\\s")[1];
|
||||
CustomStack stack = CustomStack.getInstance(namespaceID);
|
||||
if(stack != null) {
|
||||
s = stack.getItemStack().clone();
|
||||
normalCreation = false;
|
||||
}
|
||||
}
|
||||
|
||||
//creates custom MMOItems items
|
||||
if(matraw.split("\\s")[0].equalsIgnoreCase("mmo=") && plugin.getServer().getPluginManager().isPluginEnabled("MMOItems")){
|
||||
String itemType = matraw.split("\\s")[1];
|
||||
@ -124,7 +166,7 @@ public class ItemCreation {
|
||||
|
||||
//creates item from custom-items section of panel
|
||||
if(matraw.split("\\s")[0].equalsIgnoreCase("cpi=")){
|
||||
s = makeCustomItemFromConfig(panel,position,panel.getConfig().getConfigurationSection("custom-item." + matraw.split("\\s")[1]), p, true, true, true);
|
||||
s = makeCustomItemFromConfig(panel,position,panel.getConfig().getConfigurationSection("custom-item." + matraw.split("\\s")[1]), p, true, true, false);
|
||||
normalCreation = false;
|
||||
}
|
||||
|
||||
@ -138,7 +180,7 @@ public class ItemCreation {
|
||||
if (matraw.split("\\s")[1].equalsIgnoreCase("self")) {
|
||||
//if cps= self
|
||||
meta = (SkullMeta) s.getItemMeta();
|
||||
if(!plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) {
|
||||
if(!plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) {
|
||||
try {
|
||||
assert meta != null;
|
||||
meta.setOwningPlayer(Bukkit.getOfflinePlayer(UUID.fromString(skullname)));
|
||||
@ -188,19 +230,22 @@ public class ItemCreation {
|
||||
if(itemSection.contains("itemType")){
|
||||
//if hidden, reverse
|
||||
if(itemSection.getStringList("itemType").contains("noAttributes")){
|
||||
hideAttributes = false;
|
||||
}
|
||||
if(itemSection.getStringList("itemType").contains("noNBT")){
|
||||
addNBT = false;
|
||||
hideAttributes = true;
|
||||
}
|
||||
if(itemSection.getStringList("itemType").contains("placeable")){
|
||||
addNBT = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(addNBT){
|
||||
s = plugin.nbt.setNBT(s);
|
||||
if(itemSection.contains("nbt")){
|
||||
//ItemStack item, ConfigurationSection section, Player player, Panel panel, PanelPosition position
|
||||
plugin.nbt.applyNBTRecursively(s, itemSection.getConfigurationSection("nbt"), p, panel, position);
|
||||
//plugin.nbt.applyNBTRecursively("", itemSection.getConfigurationSection("nbt"), s, p, panel, position);
|
||||
}
|
||||
if(addNBT){
|
||||
plugin.nbt.setNBT(s, "CommandPanelsItem","boolean_" + "true");
|
||||
}
|
||||
|
||||
if (itemSection.contains("enchanted")) {
|
||||
try {
|
||||
ItemMeta EnchantMeta;
|
||||
@ -239,7 +284,6 @@ public class ItemCreation {
|
||||
patterns.add(new Pattern(DyeColor.valueOf(dyePattern[0]), PatternType.valueOf(dyePattern[1]))); //load patterns in config: RED,STRIPE_TOP
|
||||
}
|
||||
bannerMeta.setPatterns(patterns);
|
||||
bannerMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
|
||||
s.setItemMeta(bannerMeta);
|
||||
}
|
||||
}catch(Exception ignore){
|
||||
@ -282,38 +326,46 @@ public class ItemCreation {
|
||||
|
||||
if (itemSection.contains("potion")) {
|
||||
//if the item is a potion, give it an effect
|
||||
try {
|
||||
PotionMeta potionMeta = (PotionMeta)s.getItemMeta();
|
||||
String[] effectType = plugin.tex.placeholdersNoColour(panel,position,p,itemSection.getString("potion")).split("\\s");
|
||||
assert potionMeta != null;
|
||||
boolean extended = false;
|
||||
boolean upgraded = false;
|
||||
//create data
|
||||
if(effectType.length >= 2){
|
||||
if(effectType[1].equalsIgnoreCase("true")){
|
||||
extended = true;
|
||||
}
|
||||
if(effectType.length == 3){
|
||||
if(effectType[2].equalsIgnoreCase("true")){
|
||||
upgraded = true;
|
||||
}
|
||||
}
|
||||
String[] effectType = plugin.tex.placeholdersNoColour(panel,position,p,itemSection.getString("potion")).split("\\s");
|
||||
//potion legacy or current
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) ||
|
||||
(plugin.legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && plugin.legacy.MINOR_VERSION <= 4)){
|
||||
if(plugin.legacy.MAJOR_VERSION.equals(MinecraftVersions.v1_8)){
|
||||
plugin.classicPotion.applyPotionEffect(p, s, effectType);
|
||||
}else {
|
||||
plugin.legacyPotion.applyPotionEffect(p, s, effectType);
|
||||
}
|
||||
}else{
|
||||
try {
|
||||
PotionMeta potionMeta = (PotionMeta)s.getItemMeta();
|
||||
assert potionMeta != null;
|
||||
PotionType newData = PotionType.valueOf(effectType[0].toUpperCase());
|
||||
//set meta
|
||||
potionMeta.setBasePotionType(newData);
|
||||
s.setItemMeta(potionMeta);
|
||||
} catch (Exception er) {
|
||||
//don't add the effect
|
||||
plugin.debug(er,p);
|
||||
p.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.RED + plugin.config.getString("config.format.error") + " potion: " + itemSection.getString("potion")));
|
||||
}
|
||||
PotionData newData = new PotionData(PotionType.valueOf(effectType[0].toUpperCase()),extended,upgraded);
|
||||
//set meta
|
||||
potionMeta.setBasePotionData(newData);
|
||||
potionMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
|
||||
s.setItemMeta(potionMeta);
|
||||
} catch (Exception er) {
|
||||
//don't add the effect
|
||||
plugin.debug(er,p);
|
||||
p.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.RED + plugin.config.getString("config.format.error") + " potion: " + itemSection.getString("potion")));
|
||||
}
|
||||
}
|
||||
|
||||
if(itemSection.contains("potion-color")){
|
||||
if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_11)){
|
||||
String[] rgb = Objects.requireNonNull(itemSection.getString("potion-color")).split(",");
|
||||
Color color = Color.fromRGB(Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]), Integer.parseInt(rgb[2]));
|
||||
PotionMeta potionMeta = (PotionMeta)s.getItemMeta();
|
||||
assert potionMeta != null;
|
||||
potionMeta.setColor(color);
|
||||
s.setItemMeta(potionMeta);
|
||||
}
|
||||
}
|
||||
|
||||
if (itemSection.contains("damage")) {
|
||||
//change the damage amount (placeholders accepted)
|
||||
//if the damage is not unbreakable and should be a value
|
||||
if (plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) {
|
||||
if (plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) {
|
||||
try {
|
||||
s.setDurability(Short.parseShort(Objects.requireNonNull(plugin.tex.placeholders(panel,position,p, itemSection.getString("damage")))));
|
||||
} catch (Exception e) {
|
||||
@ -326,21 +378,39 @@ public class ItemCreation {
|
||||
ItemMeta unbreak = s.getItemMeta();
|
||||
unbreak.setUnbreakable(true);
|
||||
s.setItemMeta(unbreak);
|
||||
}
|
||||
|
||||
try {
|
||||
Damageable itemDamage = (Damageable) s.getItemMeta();
|
||||
itemDamage.setDamage(Integer.parseInt(Objects.requireNonNull(plugin.tex.placeholders(panel,position,p, itemSection.getString("damage")))));
|
||||
s.setItemMeta((ItemMeta) itemDamage);
|
||||
} catch (Exception e) {
|
||||
plugin.debug(e, p);
|
||||
p.sendMessage(plugin.tex.colour(plugin.tag + plugin.config.getString("config.format.error") + " damage: " + itemSection.getString("damage")));
|
||||
}else {
|
||||
try {
|
||||
Damageable itemDamage = (Damageable) s.getItemMeta();
|
||||
itemDamage.setDamage(Integer.parseInt(Objects.requireNonNull(plugin.tex.placeholders(panel, position, p, itemSection.getString("damage")))));
|
||||
s.setItemMeta((ItemMeta) itemDamage);
|
||||
} catch (Exception e) {
|
||||
plugin.debug(e, p);
|
||||
p.sendMessage(plugin.tex.colour(plugin.tag + plugin.config.getString("config.format.error") + " damage: " + itemSection.getString("damage")));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (itemSection.contains("nbt")) {
|
||||
for(String key : itemSection.getConfigurationSection("nbt").getKeys(false)){
|
||||
s = plugin.nbt.setNBT(s,key,itemSection.getString("nbt." + key));
|
||||
// 1.20 Trim Feature for Player Armor
|
||||
if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20) && itemSection.contains("trim")){
|
||||
// trim: <Material> <Pattern>
|
||||
String trim = itemSection.getString("trim");
|
||||
String[] trimList = trim.split("\\s");
|
||||
if(trimList.length == 2){
|
||||
String trimMaterialString = trimList[0].toLowerCase();
|
||||
String trimPatternString = trimList[1].toLowerCase();
|
||||
|
||||
// Check if Material and Pattern are valid and the itemstack is an armor piece
|
||||
if(isTrimMaterial(trimMaterialString) && isTrimPattern(trimPatternString) && isArmor(s)){
|
||||
|
||||
// Getting the correct Pattern and Material - Seems to be experimental this way
|
||||
// Material and Pattern don't have a valueOf-function to get them the easier way.
|
||||
TrimMaterial trimMaterial = Registry.TRIM_MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString("minecraft:" + trimMaterialString)));
|
||||
TrimPattern trimPattern = Registry.TRIM_PATTERN.get(Objects.requireNonNull(NamespacedKey.fromString("minecraft:" + trimPatternString)));
|
||||
|
||||
ArmorMeta armorMeta = (ArmorMeta) s.getItemMeta();
|
||||
armorMeta.setTrim(new ArmorTrim(trimMaterial, trimPattern));
|
||||
s.setItemMeta(armorMeta);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (itemSection.contains("stack")) {
|
||||
@ -351,7 +421,7 @@ public class ItemCreation {
|
||||
//check that the panel is already open and not running commands when opening
|
||||
if (itemSection.contains("refresh-commands") && plugin.openPanels.hasPanelOpen(p.getName(), panel.getName(), position)) {
|
||||
try {
|
||||
plugin.commandTags.runCommands(panel,position,p,itemSection.getStringList("refresh-commands"));
|
||||
plugin.commandRunner.runCommands(panel,position,p,itemSection.getStringList("refresh-commands"), null);
|
||||
}catch(Exception ex){
|
||||
plugin.debug(ex,p);
|
||||
}
|
||||
@ -361,7 +431,7 @@ public class ItemCreation {
|
||||
p.sendMessage(plugin.tex.colour(plugin.tag + plugin.config.getString("config.format.error") + " material: " + itemSection.getString("material")));
|
||||
return null;
|
||||
}
|
||||
plugin.setName(panel,s, itemSection.getString("name"), itemSection.getStringList("lore"), p, placeholders, colours, hideAttributes);
|
||||
s = plugin.setName(panel,s, itemSection.getString("name"), itemSection.getStringList("lore"), p, placeholders, colours, hideAttributes);
|
||||
return s;
|
||||
}
|
||||
|
||||
@ -392,7 +462,7 @@ public class ItemCreation {
|
||||
}
|
||||
}
|
||||
}
|
||||
if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
if (cont.getDurability() != 0 && !cont.getType().toString().equals("SKULL_ITEM")) {
|
||||
file.set("panels." + panelName + ".item." + i + ".ID", cont.getDurability());
|
||||
}
|
||||
@ -410,14 +480,7 @@ public class ItemCreation {
|
||||
}
|
||||
if(plugin.getHeads.ifSkullOrHead(cont.getType().toString())){
|
||||
if(!Objects.requireNonNull(file.getString("panels." + panelName + ".item." + i + ".material")).contains("%") && !Objects.requireNonNull(file.getString("panels." + panelName + ".item." + i + ".material")).contains("=")) {
|
||||
SkullMeta meta = (SkullMeta) cont.getItemMeta();
|
||||
if (plugin.customHeads.getHeadBase64(cont) != null && !plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) {
|
||||
//inject base64 here, disable for legacy as is not working
|
||||
file.set("panels." + panelName + ".item." + i + ".material", "cps= " + plugin.customHeads.getHeadBase64(cont));
|
||||
} else if (meta.hasOwner()) {
|
||||
//check for skull owner
|
||||
file.set("panels." + panelName + ".item." + i + ".material", "cps= " + meta.getOwner());
|
||||
}
|
||||
file.set("panels." + panelName + ".item." + i + ".material", plugin.getHeads.playerHeadString());
|
||||
}
|
||||
}
|
||||
try {
|
||||
@ -431,13 +494,35 @@ public class ItemCreation {
|
||||
//not a banner
|
||||
file.set("panels." + panelName + ".item." + i + ".banner", null);
|
||||
}
|
||||
try {
|
||||
//potion legacy PotionData or current PotionType
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) ||
|
||||
(plugin.legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && plugin.legacy.MINOR_VERSION <= 4)){
|
||||
if(plugin.legacyPotion.retrievePotionData(cont) != null) {
|
||||
file.set("panels." + panelName + ".item." + i + ".potion", plugin.legacyPotion.retrievePotionData(cont));
|
||||
}
|
||||
}else{
|
||||
PotionMeta potionMeta = (PotionMeta) cont.getItemMeta();
|
||||
assert potionMeta != null;
|
||||
String potionType = potionMeta.getBasePotionType().toString(); // Gets the potion type as a string rather than bukkit type
|
||||
file.set("panels." + panelName + ".item." + i + ".potion", potionType);
|
||||
}
|
||||
}catch(Exception ignore){
|
||||
//not a banner
|
||||
file.set("panels." + panelName + ".item." + i + ".potion", null);
|
||||
}
|
||||
file.set("panels." + panelName + ".item." + i + ".stack", cont.getAmount());
|
||||
if(!cont.getEnchantments().isEmpty()){
|
||||
file.set("panels." + panelName + ".item." + i + ".enchanted", "true");
|
||||
Map<Enchantment, Integer> enchantments = cont.getEnchantments();
|
||||
List<String> newEnchantments = new ArrayList<>();
|
||||
for(Enchantment enchantment : enchantments.keySet()){
|
||||
newEnchantments.add(enchantment.getKey().getKey() + " " + enchantments.get(enchantment));
|
||||
}
|
||||
file.set("panels." + panelName + ".item." + i + ".enchanted", newEnchantments);
|
||||
}
|
||||
file.set("panels." + panelName + ".item." + i + ".name", Objects.requireNonNull(cont.getItemMeta()).getDisplayName());
|
||||
file.set("panels." + panelName + ".item." + i + ".lore", Objects.requireNonNull(cont.getItemMeta()).getLore());
|
||||
if(plugin.legacy.LOCAL_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_14)){
|
||||
if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_14)){
|
||||
file.set("panels." + panelName + ".item." + i + ".customdata", Objects.requireNonNull(cont.getItemMeta()).getCustomModelData());
|
||||
}
|
||||
}catch(Exception n){
|
||||
@ -453,11 +538,14 @@ public class ItemCreation {
|
||||
Material, Name, Lore, Enchanted, Potion
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean isIdentical(ItemStack one, ItemStack two){
|
||||
public boolean isIdentical(ItemStack one, ItemStack two, Boolean nbtCheck){
|
||||
//check material
|
||||
if (one.getType() != two.getType()) {
|
||||
return false;
|
||||
}
|
||||
if(one.hasItemMeta() != two.hasItemMeta()){
|
||||
return false;
|
||||
}
|
||||
//check for name
|
||||
try {
|
||||
if (!one.getItemMeta().getDisplayName().equals(two.getItemMeta().getDisplayName())) {
|
||||
@ -466,6 +554,13 @@ public class ItemCreation {
|
||||
}
|
||||
}
|
||||
}catch(Exception ignore){}
|
||||
//check for ID 1.12.2 and below
|
||||
try {
|
||||
if (plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12) &&
|
||||
(one.getDurability() != two.getDurability())) {
|
||||
return false;
|
||||
}
|
||||
}catch(Exception ignore){}
|
||||
//check for lore
|
||||
try {
|
||||
if (!one.getItemMeta().getLore().equals(two.getItemMeta().getLore())) {
|
||||
@ -474,9 +569,27 @@ public class ItemCreation {
|
||||
}
|
||||
}
|
||||
}catch(Exception ignore){}
|
||||
//check for custom model data
|
||||
try {
|
||||
if (plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_14)){
|
||||
if (one.getItemMeta().getCustomModelData() != (two.getItemMeta().getCustomModelData())) {
|
||||
if(one.getItemMeta().hasCustomModelData()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(Exception ignore){}
|
||||
//check for nbt
|
||||
if(nbtCheck) {
|
||||
try {
|
||||
if (!plugin.nbt.hasSameNBT(one, two)) {
|
||||
return false;
|
||||
}
|
||||
} catch (Exception ignore) {}
|
||||
}
|
||||
//check for damage
|
||||
try {
|
||||
if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){
|
||||
if(one.getDurability() != two.getDurability()) {
|
||||
return false;
|
||||
}
|
||||
@ -490,19 +603,21 @@ public class ItemCreation {
|
||||
} catch (Exception ignore) {}
|
||||
//check for potions
|
||||
try {
|
||||
PotionMeta meta1 = (PotionMeta) one.getItemMeta();
|
||||
PotionMeta meta2 = (PotionMeta) two.getItemMeta();
|
||||
//different duration
|
||||
if(meta1.getBasePotionData().isExtended() != meta2.getBasePotionData().isExtended()){
|
||||
return false;
|
||||
}
|
||||
//different upgrade
|
||||
if(meta1.getBasePotionData().isUpgraded() != meta2.getBasePotionData().isUpgraded()){
|
||||
return false;
|
||||
}
|
||||
//different potion type
|
||||
if (meta1.getBasePotionData().getType().compareTo(meta2.getBasePotionData().getType()) != 0){
|
||||
return false;
|
||||
//choose between legacy PotionData (pre 1.20.5) or PotionType
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) ||
|
||||
(plugin.legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && plugin.legacy.MINOR_VERSION <= 4)){
|
||||
String potionOne = plugin.legacyPotion.retrievePotionData(one);
|
||||
String potionTwo = plugin.legacyPotion.retrievePotionData(two);
|
||||
if(!potionOne.equals(potionTwo)){
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
//post 1.20.5 compare
|
||||
PotionMeta meta1 = (PotionMeta) one.getItemMeta();
|
||||
PotionMeta meta2 = (PotionMeta) two.getItemMeta();
|
||||
if (meta1.getBasePotionType().toString().compareTo(meta2.getBasePotionType().toString()) != 0){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}catch(Exception ignore){}
|
||||
//check for enchantments
|
||||
@ -513,4 +628,20 @@ public class ItemCreation {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean isTrimMaterial(String material){
|
||||
List<String> availableMaterial = Arrays.asList("AMETHYST",
|
||||
"COPPER", "DIAMOND", "EMERALD", "GOLD", "IRON","LAPIS", "NETHERITE", "QUARTZ", "REDSTONE");
|
||||
return availableMaterial.contains(material.toUpperCase());
|
||||
}
|
||||
|
||||
private boolean isTrimPattern(String pattern){
|
||||
List<String> availablePattern = Arrays.asList("COAST",
|
||||
"DUNE", "EYE", "HOST", "RAISER", "RIB","SENTRY", "SHAPER", "SILENCE", "SNOUT", "SPIRE", "TIDE","VEX", "WARD", "WAYFINDER", "WILD");
|
||||
return availablePattern.contains(pattern.toUpperCase());
|
||||
}
|
||||
|
||||
private boolean isArmor(ItemStack stack){
|
||||
return EnchantmentTarget.ARMOR.includes(stack);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,60 @@
|
||||
package me.rockyhawk.commandpanels.classresources;
|
||||
|
||||
import me.rockyhawk.commandpanels.CommandPanels;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class MiniMessageUtils {
|
||||
|
||||
CommandPanels plugin;
|
||||
public MiniMessageUtils(CommandPanels pl) {
|
||||
this.plugin = pl;
|
||||
}
|
||||
|
||||
/*
|
||||
MiniMessage is used here as an alternative to the standard Minecraft colour codes &
|
||||
As MiniMessage does not accept legacy colour codes at any point, which is
|
||||
a possibility when using Minecraft colour codes, running a try/catch allows for
|
||||
MiniMessage to be used anywhere and ignored when legacy colour codes are found.
|
||||
*/
|
||||
|
||||
public String doMiniMessageLegacy(String string) {
|
||||
MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||
try {
|
||||
Component component = miniMessage.deserialize(string);
|
||||
return LegacyComponentSerializer.builder()
|
||||
.character('&')
|
||||
.hexColors()
|
||||
.build()
|
||||
.serialize(component);
|
||||
}catch (Exception e){
|
||||
return string;
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> doMiniMessageLegacy(List<String> strings) {
|
||||
return strings.stream()
|
||||
.map(this::doMiniMessageLegacy)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public Component doMiniMessage(String string) {
|
||||
LegacyComponentSerializer legacyComponentSerializer = LegacyComponentSerializer.builder().hexColors().character('&').build();
|
||||
Component component = legacyComponentSerializer.deserialize(string.replace('§', '&'));
|
||||
|
||||
return MiniMessage.miniMessage().deserialize(MiniMessage.miniMessage().serialize(component.decoration(TextDecoration.ITALIC, false))
|
||||
.replace("\\<", "<").replace("\\", "").replace("\n", "<br>")).decoration(TextDecoration.ITALIC, false);
|
||||
|
||||
}
|
||||
|
||||
public List<Component> doMiniMessage(List<String> strings) {
|
||||
return strings.stream()
|
||||
.map(this::doMiniMessage)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
package me.rockyhawk.commandpanels.classresources;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
|
||||
public class SerializerUtils {
|
||||
|
||||
public static Component serializeText(String msg){
|
||||
return MiniMessage.miniMessage().deserialize(msg);
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package me.rockyhawk.commandpanels.classresources.customheads;
|
||||
|
||||
import me.rockyhawk.commandpanels.CommandPanels;
|
||||
import me.rockyhawk.commandpanels.classresources.customheads.methods.CustomHeadGameProfile;
|
||||
import me.rockyhawk.commandpanels.classresources.customheads.methods.CustomHeadPlayerProfile;
|
||||
import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class GetCustomHeads {
|
||||
CustomHeadGameProfile gameProfileHeadClass;
|
||||
CustomHeadPlayerProfile playerProfileHeadClass;
|
||||
CommandPanels plugin;
|
||||
|
||||
public GetCustomHeads(CommandPanels pl) {
|
||||
this.plugin = pl;
|
||||
gameProfileHeadClass = new CustomHeadGameProfile(pl);
|
||||
playerProfileHeadClass = new CustomHeadPlayerProfile();
|
||||
}
|
||||
|
||||
public ItemStack getCustomHead(String base64){
|
||||
if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_18)){
|
||||
return playerProfileHeadClass.getCustomHead(base64);
|
||||
}else{
|
||||
return gameProfileHeadClass.getCustomHead(base64);
|
||||
}
|
||||
}
|
||||
public ItemStack getPlayerHead(String playerName){
|
||||
if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_21)){
|
||||
return playerProfileHeadClass.getPlayerHead(playerName);
|
||||
}else{
|
||||
return gameProfileHeadClass.getPlayerHead(playerName);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package me.rockyhawk.commandpanels.classresources.customheads;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class SavedCustomHead {
|
||||
public String base64;
|
||||
public ItemStack headItem;
|
||||
public boolean isValid; // true if the head was successfully fetched, false otherwise
|
||||
public long lastAttempt; // timestamp of the last attempt
|
||||
|
||||
public SavedCustomHead(ItemStack head, String base64value, boolean isValidAttempt) {
|
||||
base64 = base64value;
|
||||
headItem = head;
|
||||
isValid = isValidAttempt;
|
||||
lastAttempt = System.currentTimeMillis();
|
||||
}
|
||||
}
|
@ -0,0 +1,185 @@
|
||||
package me.rockyhawk.commandpanels.classresources.customheads.methods;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.properties.Property;
|
||||
import com.mojang.authlib.properties.PropertyMap;
|
||||
import me.rockyhawk.commandpanels.CommandPanels;
|
||||
import me.rockyhawk.commandpanels.classresources.customheads.SavedCustomHead;
|
||||
import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
|
||||
public class CustomHeadGameProfile {
|
||||
CommandPanels plugin;
|
||||
public CustomHeadGameProfile(CommandPanels pl) {
|
||||
this.plugin = pl;
|
||||
}
|
||||
|
||||
public HashMap<String, SavedCustomHead> savedCustomHeads = new HashMap<>();
|
||||
|
||||
//getting the head from a Player Name
|
||||
public ItemStack getPlayerHead(String name) {
|
||||
byte id = 0;
|
||||
if (plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)) {
|
||||
id = 3;
|
||||
}
|
||||
|
||||
//get texture if already cached
|
||||
if (savedCustomHeads.containsKey(name)) {
|
||||
if (!savedCustomHeads.get(name).isValid && (System.currentTimeMillis() - savedCustomHeads.get(name).lastAttempt) < 60000) {
|
||||
// If the last attempt was less than 60 seconds ago and was invalid, return null or a default item
|
||||
return new ItemStack(Material.valueOf(plugin.getHeads.playerHeadString()));
|
||||
}
|
||||
if(savedCustomHeads.get(name).isValid) {
|
||||
return savedCustomHeads.get(name).headItem; // Return cached item if valid
|
||||
}
|
||||
}
|
||||
|
||||
//create ItemStack
|
||||
ItemStack itemStack = new ItemStack(Material.matchMaterial(plugin.getHeads.playerHeadString()), 1, id);
|
||||
|
||||
//Run fallback code, if API call fails, use legacy setOwner
|
||||
SkullMeta meta = (SkullMeta) itemStack.getItemMeta();
|
||||
meta.setOwner(name);
|
||||
itemStack.setItemMeta(meta);
|
||||
|
||||
// Fetch and cache the texture asynchronously
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
try {
|
||||
if(plugin.debug.consoleDebug){
|
||||
plugin.getServer().getConsoleSender().sendMessage(plugin.tex.colour(plugin.tag +
|
||||
ChatColor.WHITE +
|
||||
"Download & Cache Head Texture for " + name));
|
||||
}
|
||||
|
||||
// Fetch the player UUID from the Mojang API
|
||||
URL uuidUrl = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
|
||||
URLConnection uuidConnection = uuidUrl.openConnection();
|
||||
uuidConnection.setConnectTimeout(2000); // Set connection timeout to 2 seconds
|
||||
uuidConnection.setReadTimeout(2000); // Set read timeout to 2 seconds
|
||||
//Json is simple and structured so a hard code solution will avoid the need for a library
|
||||
String uuidReader = new Scanner(uuidConnection.getInputStream(),
|
||||
StandardCharsets.UTF_8.name()).useDelimiter("\\A").next();
|
||||
String uuid = uuidReader.split("\"id\" : \"")[1].split("\"")[0];
|
||||
|
||||
// Fetch the skin texture from the Mojang API using the player UUID
|
||||
URL texturesUrl = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid);
|
||||
URLConnection texturesConnection = texturesUrl.openConnection();
|
||||
texturesConnection.setConnectTimeout(2000); // Set connection timeout to 2 seconds
|
||||
texturesConnection.setReadTimeout(2000); // Set read timeout to 2 seconds
|
||||
//Json is simple and structured so a hard code solution will avoid the need for a library
|
||||
String valueReader = new Scanner(texturesConnection.getInputStream(),
|
||||
StandardCharsets.UTF_8.name()).useDelimiter("\\A").next();
|
||||
String value = valueReader.split("\"value\" : \"")[1].split("\"")[0];
|
||||
|
||||
// Once the API call is finished, update the ItemStack on the main thread
|
||||
Bukkit.getScheduler().runTask(plugin, () -> {
|
||||
itemStack.setItemMeta(getCustomHead(name, value).getItemMeta());
|
||||
savedCustomHeads.put(name, new SavedCustomHead(itemStack, value, true));
|
||||
});
|
||||
} catch (Exception ignore) {
|
||||
Bukkit.getScheduler().runTask(plugin, () -> {
|
||||
//do not overwrite a valid cached head
|
||||
if(savedCustomHeads.containsKey(name) && savedCustomHeads.get(name).isValid){
|
||||
return;
|
||||
}
|
||||
savedCustomHeads.put(name, new SavedCustomHead(null, null, false)); // Mark as invalid
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
//will also use cached heads feature to get heads if player name is provided
|
||||
public ItemStack getCustomHead(String playerName, String b64stringtexture) {
|
||||
//check for any saved heads
|
||||
if(savedCustomHeads.containsKey(playerName)) {
|
||||
if (savedCustomHeads.get(playerName).base64 != null) {
|
||||
return savedCustomHeads.get(playerName).headItem;
|
||||
}
|
||||
savedCustomHeads.get(playerName).isValid = false;
|
||||
}
|
||||
|
||||
//clear cached textures list until length limit is reached
|
||||
Iterator<Map.Entry<String, SavedCustomHead>> iterator = savedCustomHeads.entrySet().iterator();
|
||||
while (savedCustomHeads.size() > 2000 && iterator.hasNext()) {
|
||||
iterator.next(); // Move to next entry
|
||||
iterator.remove(); // Remove the entry
|
||||
}
|
||||
|
||||
//if saved head is not found from player name, get head manually
|
||||
return getCustomHead(b64stringtexture);
|
||||
}
|
||||
|
||||
//used to get heads from Base64 Textures
|
||||
@SuppressWarnings("deprecation")
|
||||
public ItemStack getCustomHead(String b64stringtexture) {
|
||||
//get head from base64
|
||||
GameProfile profile = new GameProfile(UUID.randomUUID(), "");
|
||||
PropertyMap propertyMap = profile.getProperties();
|
||||
if (propertyMap == null) {
|
||||
throw new IllegalStateException("Profile doesn't contain a property map");
|
||||
} else {
|
||||
propertyMap.put("textures", new Property("textures", b64stringtexture));
|
||||
byte id = 0;
|
||||
if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){
|
||||
id = 3;
|
||||
}
|
||||
ItemStack head = new ItemStack(Material.matchMaterial(plugin.getHeads.playerHeadString()), 1,id);
|
||||
ItemMeta headMeta = head.getItemMeta();
|
||||
assert headMeta != null;
|
||||
|
||||
Field profileField;
|
||||
Method setProfileMethod = null;
|
||||
try {
|
||||
// Attempt to access the 'profile' field directly
|
||||
// Also writes to 'serializedProfile' field as one cannot be null while the other is not
|
||||
// This block is mainly for 1.20.2+ versions
|
||||
profileField = headMeta.getClass().getDeclaredField("profile");
|
||||
Field serializedProfileField = headMeta.getClass().getDeclaredField("serializedProfile");
|
||||
|
||||
profileField.setAccessible(true);
|
||||
serializedProfileField.setAccessible(true);
|
||||
|
||||
profileField.set(headMeta, profile);
|
||||
serializedProfileField.set(headMeta, profile); // Assuming serializedProfile is of the same type
|
||||
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) {
|
||||
try {
|
||||
// This block covers versions that have a 'setProfile' method instead of direct field access
|
||||
// Likely for versions prior to 1.20.2
|
||||
setProfileMethod = headMeta.getClass().getDeclaredMethod("setProfile", GameProfile.class);
|
||||
} catch (NoSuchMethodException ignore) {}
|
||||
} catch (SecurityException ignored) {}
|
||||
try {
|
||||
if (setProfileMethod == null) {
|
||||
// Attempt to access the 'profile' field directly
|
||||
// This block is a generic fallback for versions lacking the 'setProfile' method
|
||||
profileField = headMeta.getClass().getDeclaredField("profile");
|
||||
profileField.setAccessible(true);
|
||||
profileField.set(headMeta, profile);
|
||||
} else {
|
||||
// Use the 'setProfile' method if it was found
|
||||
setProfileMethod.setAccessible(true);
|
||||
setProfileMethod.invoke(headMeta, profile);
|
||||
}
|
||||
} catch (Exception e1) {
|
||||
plugin.debug(e1,null);
|
||||
}
|
||||
|
||||
head.setItemMeta(headMeta);
|
||||
return head;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,118 @@
|
||||
package me.rockyhawk.commandpanels.classresources.customheads.methods;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.bukkit.profile.PlayerProfile;
|
||||
import org.bukkit.profile.PlayerTextures;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.*;
|
||||
|
||||
public class CustomHeadPlayerProfile {
|
||||
//cached itemstacks stored for access
|
||||
public HashMap<String, ItemStack> savedCustomHeads = new HashMap<>();
|
||||
|
||||
//Using the PlayerProfile API for getting custom heads
|
||||
public ItemStack getCustomHead(String base64Texture) {
|
||||
//check for any saved heads
|
||||
if(savedCustomHeads.containsKey(base64Texture)) {
|
||||
return savedCustomHeads.get(base64Texture);
|
||||
}
|
||||
|
||||
//clear cached textures list until length limit is reached
|
||||
Iterator<Map.Entry<String, ItemStack>> iterator = savedCustomHeads.entrySet().iterator();
|
||||
while (savedCustomHeads.size() > 2000 && iterator.hasNext()) {
|
||||
iterator.next(); // Move to next entry
|
||||
iterator.remove(); // Remove the entry
|
||||
}
|
||||
|
||||
// Create a new player head ItemStack
|
||||
ItemStack skull = new ItemStack(Material.PLAYER_HEAD, 1);
|
||||
SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();
|
||||
|
||||
// Create a new PlayerProfile
|
||||
UUID uuid = UUID.randomUUID(); // Unique ID for the profile
|
||||
PlayerProfile profile = Bukkit.createPlayerProfile(uuid);
|
||||
|
||||
// Decode the base64 texture and extract the texture URL
|
||||
String decodedTexture = extractSkinUrlFromBase64(base64Texture);
|
||||
|
||||
// Set the skin URL using PlayerTextures
|
||||
PlayerTextures textures = profile.getTextures();
|
||||
try {
|
||||
// Using a URL object for the texture
|
||||
textures.setSkin(new URL(decodedTexture));
|
||||
} catch (MalformedURLException ignore) {} // Base64 has no URL, ignore
|
||||
|
||||
// Apply the textures to the profile
|
||||
profile.setTextures(textures);
|
||||
|
||||
// Apply the PlayerProfile to the SkullMeta
|
||||
skullMeta.setOwnerProfile(profile);
|
||||
|
||||
// Set the modified SkullMeta back to the ItemStack
|
||||
skull.setItemMeta(skullMeta);
|
||||
|
||||
savedCustomHeads.put(base64Texture, skull);
|
||||
return skull;
|
||||
}
|
||||
|
||||
// New method to get a player head by player name
|
||||
public ItemStack getPlayerHead(String playerName) {
|
||||
//check for any saved heads
|
||||
if(savedCustomHeads.containsKey(playerName)) {
|
||||
return savedCustomHeads.get(playerName);
|
||||
}
|
||||
|
||||
//clear cached textures list until length limit is reached
|
||||
Iterator<Map.Entry<String, ItemStack>> iterator = savedCustomHeads.entrySet().iterator();
|
||||
while (savedCustomHeads.size() > 2000 && iterator.hasNext()) {
|
||||
iterator.next(); // Move to next entry
|
||||
iterator.remove(); // Remove the entry
|
||||
}
|
||||
|
||||
// Create a new player head ItemStack
|
||||
ItemStack skull = new ItemStack(Material.PLAYER_HEAD, 1);
|
||||
SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();
|
||||
|
||||
// Get the OfflinePlayer object for the provided player name
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName);
|
||||
|
||||
// Create a PlayerProfile from the player's UUID
|
||||
UUID playerUUID = offlinePlayer.getUniqueId();
|
||||
PlayerProfile profile = Bukkit.createPlayerProfile(playerUUID);
|
||||
|
||||
// Apply the PlayerProfile to the SkullMeta
|
||||
skullMeta.setOwnerProfile(profile);
|
||||
|
||||
// Set the modified SkullMeta back to the ItemStack
|
||||
skull.setItemMeta(skullMeta);
|
||||
|
||||
savedCustomHeads.put(playerName, skull);
|
||||
return skull;
|
||||
}
|
||||
|
||||
// Helper method to extract the skin URL from the base64 texture
|
||||
private String extractSkinUrlFromBase64(String base64Texture) {
|
||||
// Decode the base64 string
|
||||
byte[] decodedBytes = Base64.getDecoder().decode(base64Texture);
|
||||
String decodedString = new String(decodedBytes);
|
||||
|
||||
// Parse the decoded string as JSON
|
||||
JsonObject jsonObject = JsonParser.parseString(decodedString).getAsJsonObject();
|
||||
|
||||
// Navigate to "textures" -> "SKIN" -> "url"
|
||||
JsonObject textures = jsonObject.getAsJsonObject("textures");
|
||||
JsonObject skin = textures.getAsJsonObject("SKIN");
|
||||
|
||||
// Return the URL if it exists
|
||||
return skin.has("url") ? skin.get("url").getAsString() : null;
|
||||
}
|
||||
|
||||
}
|
@ -37,6 +37,7 @@ public class ItemFallManager implements Listener {
|
||||
|
||||
e.getPlayer().getWorld().dropItem(e.getPlayer().getLocation(),stack);
|
||||
}else if(e.getPanel().getConfig().getStringList("item." + item + ".itemType").contains("returnItem")){
|
||||
//Remove item is listed just because website is not updated yet.
|
||||
ItemStack stack = e.getPlayer().getOpenInventory().getTopInventory().getItem(Integer.parseInt(item));
|
||||
if(stack == null || stack.getType() == Material.AIR){
|
||||
continue;
|
||||
|
@ -74,7 +74,9 @@ public class CreateText {
|
||||
//change colour
|
||||
for(String temp : setpapi){
|
||||
try {
|
||||
setpapi.set(tempInt, plugin.hex.translateHexColorCodes(ChatColor.translateAlternateColorCodes('&', temp)));
|
||||
setpapi.set(tempInt,
|
||||
plugin.hex.translateHexColorCodes(
|
||||
ChatColor.translateAlternateColorCodes('&', temp)));
|
||||
}catch(NullPointerException ignore){}
|
||||
tempInt += 1;
|
||||
}
|
||||
@ -84,7 +86,11 @@ public class CreateText {
|
||||
//regular string papi, but only colours so Player doesn't need to be there
|
||||
public String colour(String setpapi) {
|
||||
try {
|
||||
setpapi = plugin.hex.translateHexColorCodes(ChatColor.translateAlternateColorCodes('&', setpapi));
|
||||
if(plugin.miniMessage != null){
|
||||
setpapi = plugin.miniMessage.doMiniMessageLegacy(setpapi);
|
||||
}
|
||||
setpapi = ChatColor.translateAlternateColorCodes('&', setpapi);
|
||||
setpapi = plugin.hex.translateHexColorCodes(setpapi);
|
||||
return setpapi;
|
||||
}catch(NullPointerException e){
|
||||
return setpapi;
|
||||
@ -105,7 +111,11 @@ public class CreateText {
|
||||
public String placeholders(Panel panel, PanelPosition position, Player p, String setpapi) {
|
||||
try {
|
||||
setpapi = attachPlaceholders(panel,position, p,setpapi);
|
||||
setpapi = plugin.hex.translateHexColorCodes(ChatColor.translateAlternateColorCodes('&', setpapi));
|
||||
if(plugin.miniMessage != null){
|
||||
setpapi = plugin.miniMessage.doMiniMessageLegacy(setpapi);
|
||||
}
|
||||
setpapi = ChatColor.translateAlternateColorCodes('&', setpapi);
|
||||
setpapi = plugin.hex.translateHexColorCodes(setpapi);
|
||||
return setpapi;
|
||||
}catch(NullPointerException e){
|
||||
return setpapi;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user