mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-07-01 12:36:41 +00:00
Compare commits
391 Commits
FS-308
...
proper-res
Author | SHA1 | Date | |
---|---|---|---|
1f9a36cbfb | |||
f4f60a7993 | |||
6c0856d647 | |||
33ac3a36ca | |||
42482ef8e7 | |||
11f9313653 | |||
2a3a48f2ae | |||
3dde5ef578 | |||
198f1d3acf | |||
7967bfc9f8 | |||
6566c7f305 | |||
71fe940049 | |||
e2d7f6ebcb | |||
8262e81e69 | |||
a48596de8a | |||
39b9147484 | |||
5ba81de118 | |||
4b3c31f0e9 | |||
48aabaa878 | |||
3070ff893e | |||
55f8c29036 | |||
b29a176fa9 | |||
d1569cb3c0 | |||
cb818c0056 | |||
d6c68adb41 | |||
51c807d318 | |||
5422ad6ac7 | |||
773805101b | |||
f474ce99fd | |||
a3530ad143 | |||
8b48408870 | |||
dbb289db66 | |||
0d0fbf2c04 | |||
997210a16f | |||
f53ba1bd76 | |||
74408b85bf | |||
c26e05c392 | |||
ee39e6f534 | |||
8a58782d99 | |||
cc244fc4f7 | |||
65540b7f3a | |||
f91c21cc81 | |||
6c983f6b97 | |||
1e97273e01 | |||
922a2bcc76 | |||
34269bde09 | |||
922fa4a34f | |||
ccf572315f | |||
733f668145 | |||
2cd107c317 | |||
e4782a3542 | |||
77d65e80f8 | |||
3644ba33a5 | |||
f25d69c5fa | |||
9dbe30aaa7 | |||
1a28facc56 | |||
e82a90c0dc | |||
f8e09665f5 | |||
a5135ef641 | |||
071d19c5e0 | |||
2e7756ed0f | |||
5332dc88cd | |||
631b691518 | |||
982a991fb0 | |||
adbad1ad9b | |||
cbd3caaab3 | |||
49696f0c30 | |||
3a96c853d2 | |||
b5804c7eb1 | |||
f9ecebd5c9 | |||
3a6e7921cc | |||
b7ea1b8b3e | |||
2265783afb | |||
71127c3152 | |||
f53696aa9e | |||
ea60be4c48 | |||
3bd177ea6f | |||
1c0b768e4f | |||
67b0656e61 | |||
b3e1a8b528 | |||
99a5897d44 | |||
9064f4b1f2 | |||
2698cbf46d | |||
d3b4feaec9 | |||
c9adb0c5a8 | |||
cb642eba08 | |||
fa85b8e160 | |||
69a06167a1 | |||
550ff492ee | |||
88914632f5 | |||
47445933f3 | |||
94d6f0a872 | |||
3d67c83ea4 | |||
22161b2e90 | |||
b1f08c3b7f | |||
466745d51f | |||
98921b975f | |||
35d53ece4e | |||
33146fa161 | |||
d7fddc3765 | |||
0db765af43 | |||
f4cb736c17 | |||
3763e0728d | |||
af18299613 | |||
f0d6549eec | |||
3b61ba408f | |||
af710edc88 | |||
459a11e638 | |||
2e41414358 | |||
a3d7fe19a0 | |||
7f4000aff9 | |||
d2884f007b | |||
58b1890183 | |||
8317b1f881 | |||
706e9540ce | |||
ac00d36dc6 | |||
a2133369d2 | |||
48728c9524 | |||
d343bbc3d7 | |||
2c357d1d49 | |||
5246639608 | |||
7fb4a477dc | |||
612499ff0a | |||
edb3dbfdbe | |||
a332ecfbea | |||
7f78549f9d | |||
fd6f8a2d17 | |||
21c84d76d3 | |||
88f53c05b9 | |||
51cc527697 | |||
ae5038ef0f | |||
ec5aa0304e | |||
ebafc1c669 | |||
9f8dafb075 | |||
1eaaf5fcdb | |||
42458084d7 | |||
0cd2886e40 | |||
575568cb05 | |||
26be5d0f44 | |||
7a724c2f13 | |||
9e1aa5d34e | |||
4564ad0449 | |||
1ddeb4b621 | |||
a8665a15d4 | |||
c0f3712c8d | |||
0dd7bc06eb | |||
4d98108a46 | |||
02b2810488 | |||
7e110e8ac6 | |||
6d3f365878 | |||
05bb64ce85 | |||
b05238c51f | |||
7bda4beab0 | |||
97544977b0 | |||
073356be49 | |||
c472c5d5ce | |||
cb401577a4 | |||
9d3165694a | |||
cffb5d9326 | |||
4e8df0938f | |||
511f172d84 | |||
bfa8b2a752 | |||
594b1f5605 | |||
b9ca4f52a2 | |||
d298e923b8 | |||
d0d97c0681 | |||
2540c7c589 | |||
6bc91fc779 | |||
9a54ef66d1 | |||
722ef5f99a | |||
6bf6eeec91 | |||
9df30a9556 | |||
83bb892056 | |||
62ff195ec5 | |||
495fe79d94 | |||
422b41dc8d | |||
f44a1c7e69 | |||
9f8dd91457 | |||
ee45256764 | |||
f6faf3b8bc | |||
8210dafcd3 | |||
4eb8174aa9 | |||
ab309032e5 | |||
0db661600f | |||
d94b184703 | |||
c07473ef6d | |||
d7261627ff | |||
6ac7090fef | |||
611ee619a0 | |||
9d2555cd03 | |||
3c4b4140ce | |||
0f2d596b7a | |||
dcdaecf9b0 | |||
b4b10a3020 | |||
fb259ca9b7 | |||
52a39aa992 | |||
b4e7251e3b | |||
0f1fbf9481 | |||
73eb3226ee | |||
8edc87034f | |||
68bcabe5c2 | |||
ecc92589e9 | |||
bf41d08580 | |||
0fc20b6c56 | |||
9c91166319 | |||
09a220e0a2 | |||
ad9dd42edb | |||
c9f5db0141 | |||
47c30c3283 | |||
6c426644f6 | |||
72bab1e2ed | |||
1726050d65 | |||
0fc5b01b29 | |||
dfd90af017 | |||
5af45a2154 | |||
54df28022f | |||
0326171e85 | |||
d13ecea947 | |||
7ec053c867 | |||
1dcc05e7f5 | |||
c913b7ae74 | |||
951f3c91d9 | |||
b573871c14 | |||
78654eb5e8 | |||
adbe125283 | |||
e6a20e1757 | |||
d71d8edf53 | |||
6af9f240f4 | |||
05745c4210 | |||
98388d0d23 | |||
1da87eeb37 | |||
b656925e4f | |||
d4f44e988c | |||
c39c632a67 | |||
733f002a87 | |||
adcccb10e5 | |||
3fdc0c05bb | |||
2551d184ca | |||
f9eabf27d5 | |||
76ce98621a | |||
bc0495a68f | |||
846154a723 | |||
804614d011 | |||
2c22c6c52d | |||
5ef0f29ffe | |||
11134f4109 | |||
e7992c7eb4 | |||
82e966dfb0 | |||
f457c4cde2 | |||
004a0f3d7c | |||
cf5199f28e | |||
43c68579e5 | |||
127ee7d9f9 | |||
c873fd4abc | |||
fa90e1d239 | |||
b711ed517f | |||
2618d97a3e | |||
1c4647290a | |||
f00f67a844 | |||
850f12103c | |||
7fd77f3cbb | |||
2eb0ab4cb1 | |||
2612aaec31 | |||
6e7ad73152 | |||
af6411b82c | |||
e9ba958a4e | |||
8cff0124ea | |||
1162f10ebb | |||
35965b0b10 | |||
1253732f77 | |||
7ce173e02b | |||
aa20a6e579 | |||
e1bee32163 | |||
4d006ed172 | |||
a29392cab2 | |||
1ecfb0b066 | |||
706229004c | |||
a4adfa9bee | |||
225ade8753 | |||
bf2323bed2 | |||
8cbfde8bbc | |||
a42cb6aff9 | |||
5849947c6b | |||
01fdf766ee | |||
afe755f5c1 | |||
5f97e68e0e | |||
1b5bbd1c05 | |||
2ecfb88604 | |||
8356e831a5 | |||
ab00cb840f | |||
bb2ddf1129 | |||
bba5ec922b | |||
58c21bb1aa | |||
f190bbeac1 | |||
42143c1163 | |||
6453e4efca | |||
9155ac90b5 | |||
1e1367d08f | |||
3f690e2ca1 | |||
abfa3b977c | |||
68adaed997 | |||
ecce62f6b4 | |||
cf9fdc6fe4 | |||
a728ec24d4 | |||
74a71b1843 | |||
4d469cdc0a | |||
4c287ca9b8 | |||
912bc1a1e4 | |||
a598c933ec | |||
936f0b621e | |||
387ea6f71e | |||
e122c4c5fa | |||
180cd81132 | |||
d814853036 | |||
a1ecf88109 | |||
5a6a5ff75d | |||
fdba119d5d | |||
087b8dd7ea | |||
213a43380e | |||
8a31b4c5c0 | |||
3818aab454 | |||
61857dd06f | |||
bd647afe92 | |||
0e12f5e792 | |||
69f17ef2d7 | |||
aebe1acec2 | |||
938b3aa630 | |||
6772333eb4 | |||
0204961834 | |||
2f332a8c42 | |||
e288668c92 | |||
caeda219fa | |||
e50101df43 | |||
ee1b27fa0d | |||
6ca61d9c6c | |||
2d18d461fe | |||
47e6386907 | |||
0a9b95bfce | |||
fedf80b834 | |||
2bdf14f38c | |||
b1062fbb6c | |||
f00f075551 | |||
44ff621d73 | |||
032e54e2d4 | |||
3ca9835257 | |||
f69feed469 | |||
8253f94ac4 | |||
54cb0cfac4 | |||
a4c81f202c | |||
da82b27016 | |||
daf0126f45 | |||
f6d46b6178 | |||
a2d11d4b93 | |||
23caa4e853 | |||
a51f5c9bbf | |||
ee804d52ff | |||
dc490659c1 | |||
0d09c3a550 | |||
4c3f188bb8 | |||
e2ccd14eb3 | |||
af1df22812 | |||
f380898bb7 | |||
464ed85f1b | |||
7dd235b166 | |||
1474a80875 | |||
f45466ee24 | |||
d70b7bbec2 | |||
541c66c3de | |||
77fd4ff66a | |||
d901cbaa81 | |||
538ed7020d | |||
18e6ef16be | |||
a335a2acf7 | |||
2eb6cc0036 | |||
5322d8ab64 | |||
dccc315869 | |||
7657ae1928 | |||
dcaf1ec11a | |||
33aca2a482 | |||
0582c2e5be | |||
159eda73a1 | |||
101987cc17 | |||
6874b2ce13 | |||
3be0ffba4e | |||
da2d25252b | |||
c8a4382a7b | |||
3f89f3f48e | |||
871acc2eeb | |||
a9c9979b1c | |||
fc3fe871b3 | |||
e99aaa2eb4 |
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
@ -9,11 +9,15 @@ updates:
|
||||
# Maintain Maven Updates
|
||||
- package-ecosystem: "maven" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
target-branch: "development"
|
||||
open-pull-requests-limit: 50
|
||||
schedule:
|
||||
interval: "daily"
|
||||
|
||||
# Maintain dependencies for GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "development"
|
||||
open-pull-requests-limit: 50
|
||||
schedule:
|
||||
interval: "daily"
|
||||
|
6
.github/workflows/codacy-analysis.yml
vendored
6
.github/workflows/codacy-analysis.yml
vendored
@ -21,11 +21,11 @@ jobs:
|
||||
steps:
|
||||
# Checkout the repository to the GitHub Actions runner
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
|
||||
- name: Run Codacy Analysis CLI
|
||||
uses: codacy/codacy-analysis-cli-action@1.1.0
|
||||
uses: codacy/codacy-analysis-cli-action@v4.2.0
|
||||
with:
|
||||
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
|
||||
# You can also omit the token and run the tools that support default configurations
|
||||
@ -41,6 +41,6 @@ jobs:
|
||||
|
||||
# Upload the SARIF file generated in the previous step
|
||||
- name: Upload SARIF results file
|
||||
uses: github/codeql-action/upload-sarif@v1
|
||||
uses: github/codeql-action/upload-sarif@v2
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
13
.github/workflows/codeql-analysis.yml
vendored
13
.github/workflows/codeql-analysis.yml
vendored
@ -35,17 +35,18 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Java JDK
|
||||
uses: actions/setup-java@v1.4.3
|
||||
uses: actions/setup-java@v3.9.0
|
||||
with:
|
||||
# The Java version to make available on the path. Takes a whole or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x). Early access versions can be specified in the form of e.g. 14-ea, 14.0.0-ea, or 14.0.0-ea.28
|
||||
java-version: 11
|
||||
java-version: 17
|
||||
distribution: 'adopt'
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@ -56,7 +57,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@ -70,4 +71,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
uses: github/codeql-action/analyze@v2
|
||||
|
43
.github/workflows/downstream.yml
vendored
43
.github/workflows/downstream.yml
vendored
@ -1,43 +0,0 @@
|
||||
# This is a basic workflow to help you get started with Actions
|
||||
|
||||
name: Downstream Branch Updates
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '20 7 * * *'
|
||||
# scheduled at 07:00 every Monday and Thursday
|
||||
|
||||
workflow_dispatch: # click the button on Github repo!
|
||||
|
||||
|
||||
jobs:
|
||||
sync_with_upstream:
|
||||
runs-on: ubuntu-latest
|
||||
name: Sync main with upstream latest
|
||||
|
||||
steps:
|
||||
# Step 1: run a standard checkout action, provided by github
|
||||
- name: Checkout main
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: main
|
||||
# submodules: 'recursive' ### may be needed in your situation
|
||||
|
||||
# Step 2: run this sync action - specify the upstream repo, upstream branch to sync with, and target sync branch
|
||||
- name: Pull (Fast-Forward) upstream changes
|
||||
id: sync
|
||||
uses: aormsby/Fork-Sync-With-Upstream-action@v2.1
|
||||
with:
|
||||
upstream_repository: AtlasMediaGroup/TotalFreedomMod
|
||||
upstream_branch: main
|
||||
target_branch: main
|
||||
git_pull_args: --ff-only # optional arg use, defaults to simple 'pull'
|
||||
|
||||
# Step 3: Display a message if 'sync' step had new commits (simple test)
|
||||
- name: Check for new commits
|
||||
if: steps.sync.outputs.has_new_commits
|
||||
run: echo "There were new commits."
|
||||
|
||||
# Step 4: Print a helpful timestamp for your records (not required, just nice)
|
||||
- name: Timestamp
|
||||
run: date
|
21
.github/workflows/java17-maven.yml
vendored
Normal file
21
.github/workflows/java17-maven.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
name: Java17-Maven-Build
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build-java-17:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Checkout the code
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
# Java 16 Builds
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3.9.0
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'adopt'
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
27
.github/workflows/maven.yml
vendored
27
.github/workflows/maven.yml
vendored
@ -1,27 +0,0 @@
|
||||
name: Maven-Build
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Java 11 Builds
|
||||
- uses: actions/checkout@v1
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 11
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
||||
|
||||
# Java 16 Builds
|
||||
- uses: actions/checkout@v1
|
||||
- name: Set up JDK 16
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 16
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -29,7 +29,7 @@ manifest.mf
|
||||
*.iml
|
||||
|
||||
# Maven excludes
|
||||
/target
|
||||
target/
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
|
@ -1,4 +1,4 @@
|
||||
# TotalFreedomMod [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/maven.yml) [](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade) [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml)
|
||||
# TotalFreedomMod [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/java17-maven.yml) [](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade) [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml)
|
||||
|
||||
TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the [Official TotalFreedom Minecraft Server](https://totalfreedom.me/). However, you are more than welcome to adapt the source for your own server.
|
||||
|
||||
|
12
SECURITY.md
12
SECURITY.md
@ -10,21 +10,25 @@ In terms of plugin releases, our support matrix is as follows:
|
||||
These versions are currently actively supported by our team, and you should expect security patches where appropriate for these versions.
|
||||
|
||||
| Version | Supported | Support End: |
|
||||
| ------------------- | ------------------ | ------------------------------ |
|
||||
| 2021.05 | :white_check_mark: | No Earlier than August 2021 |
|
||||
| ------------------- | ---------- | ------------------------------ |
|
||||
| 2022.02 | ✅ | No Earlier than May 2022 |
|
||||
|
||||
### Legacy Supported
|
||||
These versions are no longer under active development, however we will look to release critical secuirty patches where appropriate.
|
||||
|
||||
| Version | Supported | Support End: |
|
||||
| ------------------- | ------------------ | ------------ |
|
||||
| 2021.04 | :white_check_mark: | July 2021 |
|
||||
| ------------------- | ---------- | ------------ |
|
||||
| 2021.09 | ⚠️ | April 2022 |
|
||||
|
||||
|
||||
### No Longer Supported
|
||||
These versions are no longer supported at all. It is strongly advised to update if you are running any of these versions.
|
||||
|
||||
| Version | Supported | Support Ended: |
|
||||
| ------------------- | ------------------ | ------------------- |
|
||||
| 2021.06 | :x: | October 2021 |
|
||||
| 2021.05 | :x: | September 2021 |
|
||||
| 2021.04 | :x: | July 2021 |
|
||||
| 2021.02 | :x: | 6 June 2021 |
|
||||
| 2020.11 | :x: | 3 May 2021 |
|
||||
| 6.0.x (Pre-Release) | :x: | December 2020 |
|
||||
|
250
commons/pom.xml
Normal file
250
commons/pom.xml
Normal file
@ -0,0 +1,250 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>me.totalfreedom</groupId>
|
||||
<artifactId>TotalFreedomMod</artifactId>
|
||||
<version>2023.03</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>commons</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.papermc</groupId>
|
||||
<artifactId>paperlib</artifactId>
|
||||
<version>1.0.7</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.12.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.luckperms</groupId>
|
||||
<artifactId>api</artifactId>
|
||||
<version>5.4</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>3.0.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.reflections</groupId>
|
||||
<artifactId>reflections</artifactId>
|
||||
<version>0.10.2</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.eclipse.sisu</groupId>
|
||||
<artifactId>org.eclipse.sisu.inject</artifactId>
|
||||
<version>0.3.5</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
<build>
|
||||
<!-- Filter resources for build.properties -->
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
<plugins>
|
||||
<!-- Compiler -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.10.1</version>
|
||||
<configuration>
|
||||
<outputFileName>TotalFreedomMod.jar</outputFileName>
|
||||
<compilerVersion>17</compilerVersion>
|
||||
<source>17</source>
|
||||
<target>17</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- Git describe -->
|
||||
<plugin>
|
||||
<groupId>pl.project13.maven</groupId>
|
||||
<artifactId>git-commit-id-plugin</artifactId>
|
||||
<version>4.9.10</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>get-the-git-infos</id>
|
||||
<goals>
|
||||
<goal>revision</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>validate-the-git-infos</id>
|
||||
<goals>
|
||||
<goal>validateRevision</goal>
|
||||
</goals>
|
||||
<phase>package</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
|
||||
<prefix>git</prefix>
|
||||
<dateFormat>yyyy-MM-dd HH:mm:ss</dateFormat>
|
||||
<verbose>false</verbose>
|
||||
<format>properties</format>
|
||||
<failOnNoGitDirectory>false</failOnNoGitDirectory>
|
||||
<failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo>
|
||||
<includeOnlyProperties>
|
||||
<includeOnlyProperty>git.commit.id.abbrev</includeOnlyProperty>
|
||||
</includeOnlyProperties>
|
||||
<gitDescribe>
|
||||
<skip>false</skip>
|
||||
<always>false</always>
|
||||
<abbrev>7</abbrev>
|
||||
<dirty>-dirty</dirty>
|
||||
<match>*</match>
|
||||
</gitDescribe>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- Antrun -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>default-cli</id>
|
||||
<phase>initialize</phase>
|
||||
<configuration>
|
||||
<target>
|
||||
<propertyfile file="${project.basedir}/src/main/resources/build.properties"
|
||||
comment="Build information. Edit this to your liking.">
|
||||
<entry key="buildAuthor" default="unknown"/>
|
||||
<entry key="buildNumber" default="0"/>
|
||||
<entry key="buildCodeName" value="${tfm.build.codename}"/>
|
||||
<entry key="buildVersion" value="${project.version}"/>
|
||||
<entry key="buildDate" value="${timestamp}"/>
|
||||
<!--suppress UnresolvedMavenProperty -->
|
||||
<entry key="buildHead" value="${git.commit.id.abbrev}"/>
|
||||
</propertyfile>
|
||||
</target>
|
||||
</configuration>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<!-- Properties -->
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>properties-maven-plugin</artifactId>
|
||||
<version>1.1.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>initialize</phase>
|
||||
<goals>
|
||||
<goal>read-project-properties</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<files>
|
||||
<file>${project.basedir}/src/main/resources/build.properties</file>
|
||||
</files>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<!-- Buildnumber -->
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>buildnumber-maven-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>create</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
|
||||
<configuration>
|
||||
<buildNumberPropertyName>maven.buildnumber</buildNumberPropertyName>
|
||||
<buildNumberPropertiesFileLocation>${project.basedir}/src/main/resources/build.properties
|
||||
</buildNumberPropertiesFileLocation>
|
||||
<format>{0,number,#}</format>
|
||||
<items>
|
||||
<item>buildNumber</item>
|
||||
</items>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- Shade -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<minimizeJar>true</minimizeJar>
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>io.papermc.lib</pattern>
|
||||
<shadedPattern>me.totalfreedom.totalfreedommod.paperlib
|
||||
</shadedPattern> <!-- Replace this -->
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>org.bstats</pattern>
|
||||
<shadedPattern>me.totalfreedom.totalfreedommod</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
<artifactSet>
|
||||
<includes>
|
||||
<include>org.reflections:reflections</include>
|
||||
<include>io.papermc:paperlib</include>
|
||||
<include>org.bstats:bstats-bukkit</include>
|
||||
<include>org.bstats:bstats-base</include>
|
||||
</includes>
|
||||
</artifactSet>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -2,8 +2,8 @@ package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@ -35,10 +35,10 @@ public class AntiNuke extends FreedomService
|
||||
|
||||
if (fPlayer.incrementAndGetBlockDestroyCount() > ConfigEntry.NUKE_MONITOR_COUNT_BREAK.getInteger())
|
||||
{
|
||||
FUtil.bcastMsg(player.getName() + " is breaking blocks too fast!", ChatColor.RED);
|
||||
//plugin.ae.autoEject(player, "You are breaking blocks too fast. Nukers are not permitted on this server.");
|
||||
player.kickPlayer(ChatColor.RED + "You are breaking blocks too fast. Nukers are not permitted on this server.");
|
||||
|
||||
server.broadcast(Component.text(player.getName()).append(Component.text(" is breaking blocks too fast!"))
|
||||
.color(NamedTextColor.RED));
|
||||
player.kick(Component.text("You are breaking blocks too fast. Nukers are not permitted on this server.",
|
||||
NamedTextColor.RED));
|
||||
fPlayer.resetBlockDestroyCount();
|
||||
|
||||
event.setCancelled(true);
|
||||
@ -58,10 +58,9 @@ public class AntiNuke extends FreedomService
|
||||
|
||||
if (fPlayer.incrementAndGetBlockPlaceCount() > ConfigEntry.NUKE_MONITOR_COUNT_PLACE.getInteger())
|
||||
{
|
||||
FUtil.bcastMsg(player.getName() + " is placing blocks too fast!", ChatColor.RED);
|
||||
//plugin.ae.autoEject(player, "You are placing blocks too fast.");
|
||||
player.kickPlayer(ChatColor.RED + "You are placing blocks too fast.");
|
||||
|
||||
server.broadcast(Component.text(player.getName()).append(Component.text(" is placing blocks too fast!"))
|
||||
.color(NamedTextColor.RED));
|
||||
player.kick(Component.text("You are placing blocks too fast.", NamedTextColor.RED));
|
||||
fPlayer.resetBlockPlaceCount();
|
||||
|
||||
event.setCancelled(true);
|
@ -2,60 +2,48 @@ package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class AntiSpam extends FreedomService
|
||||
{
|
||||
|
||||
private ScheduledThreadPoolExecutor cycle;
|
||||
public static final int MSG_PER_CYCLE = 8;
|
||||
public static final int TICKS_PER_CYCLE = 2 * 10;
|
||||
//
|
||||
public BukkitTask cycleTask = null;
|
||||
private Map<Player, Integer> muteCounts = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
new BukkitRunnable()
|
||||
{
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
cycle();
|
||||
}
|
||||
}.runTaskTimer(plugin, TICKS_PER_CYCLE, TICKS_PER_CYCLE);
|
||||
cycle = new ScheduledThreadPoolExecutor(1);
|
||||
cycle.scheduleAtFixedRate(this::cycle, 0, 1, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
FUtil.cancel(cycleTask);
|
||||
cycle.shutdownNow();
|
||||
}
|
||||
|
||||
private void cycle()
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
server.getOnlinePlayers().stream().map(player -> plugin.pl.getPlayer(player)).forEach(fPlayer ->
|
||||
{
|
||||
final FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||
|
||||
// TODO: Move each to their own section
|
||||
playerdata.resetMsgCount();
|
||||
playerdata.resetBlockDestroyCount();
|
||||
playerdata.resetBlockPlaceCount();
|
||||
}
|
||||
fPlayer.resetMsgCount();
|
||||
fPlayer.resetBlockDestroyCount();
|
||||
fPlayer.resetBlockPlaceCount();
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
@ -81,17 +69,16 @@ public class AntiSpam extends FreedomService
|
||||
int time = count * minutes;
|
||||
playerdata.setMuted(true, time);
|
||||
|
||||
FSync.bcastMsg(String.format("%s has automatically been muted for %d minutes for spamming chat.",
|
||||
player.getName(),
|
||||
time),
|
||||
ChatColor.RED);
|
||||
server.broadcast(Component.text(player.getName()).append(Component.text(" has been automatically muted for "))
|
||||
.append(Component.text(time)).append(Component.text(" minutes for spamming chat."))
|
||||
.color(NamedTextColor.RED));
|
||||
|
||||
playerdata.resetMsgCount();
|
||||
event.setCancelled(true);
|
||||
}
|
||||
else if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE / 2)
|
||||
{
|
||||
FUtil.playerMsg(player, "Please refrain from spamming chat.", ChatColor.GRAY);
|
||||
player.sendMessage(Component.text("Please refrain from spamming chat.", NamedTextColor.GRAY));
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@ -100,14 +87,12 @@ public class AntiSpam extends FreedomService
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
String command = event.getMessage();
|
||||
final Player player = event.getPlayer();
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
fPlayer.setLastCommand(command);
|
||||
|
||||
if (fPlayer.allCommandsBlocked())
|
||||
{
|
||||
FUtil.playerMsg(player, "Your commands have been blocked by an admin.", ChatColor.RED);
|
||||
player.sendMessage(Component.text("Your commands have been blocked by an admin.", NamedTextColor.RED));
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
@ -119,7 +104,9 @@ public class AntiSpam extends FreedomService
|
||||
|
||||
if (fPlayer.incrementAndGetMsgCount() > MSG_PER_CYCLE)
|
||||
{
|
||||
FUtil.bcastMsg(player.getName() + " was automatically kicked for spamming commands.", ChatColor.RED);
|
||||
server.broadcast(Component.text(player.getName())
|
||||
.append(Component.text(" was automatically kicked for spamming commands."))
|
||||
.color(NamedTextColor.RED));
|
||||
plugin.ae.autoEject(player, "Kicked for spamming commands.");
|
||||
|
||||
fPlayer.resetMsgCount();
|
@ -91,7 +91,7 @@ public class AutoEject extends FreedomService
|
||||
}
|
||||
case STRIKE_THREE:
|
||||
{
|
||||
plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage));
|
||||
plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), null, kickMessage));
|
||||
|
||||
FUtil.bcastMsg(ChatColor.RED + player.getName() + " has been banned.");
|
||||
|
@ -2,7 +2,6 @@ package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
|
||||
import me.totalfreedom.totalfreedommod.config.YamlConfig;
|
||||
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentList;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
@ -32,7 +31,6 @@ public class BackupManager extends FreedomService
|
||||
{
|
||||
createBackups(TotalFreedomMod.CONFIG_FILENAME, true);
|
||||
createBackups(IndefiniteBanList.CONFIG_FILENAME);
|
||||
createBackups(PermissionConfig.PERMISSIONS_FILENAME, true);
|
||||
createBackups(PunishmentList.CONFIG_FILENAME);
|
||||
createBackups("database.db");
|
||||
}
|
@ -0,0 +1,229 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.api.event.AdminChatEvent;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.minimessage.tag.Tag;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.SoundCategory;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class ChatManager extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onPlayerChat(AsyncChatEvent event)
|
||||
{
|
||||
// Important information for later down the line
|
||||
String steamrolled = FUtil.steamroll(event.originalMessage());
|
||||
Player player = event.getPlayer();
|
||||
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
|
||||
// Chat is disabled
|
||||
if (!ConfigEntry.TOGGLE_CHAT.getBoolean() && !plugin.al.isAdmin(player))
|
||||
{
|
||||
event.getPlayer().sendMessage(FUtil.miniMessage("<red>The chat is currently disabled."));
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
// Locked up
|
||||
else if (fPlayer.isLockedUp())
|
||||
{
|
||||
event.getPlayer().sendMessage(FUtil.miniMessage("<red>You are locked up and thus can't talk."));
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
// Admin chat is enabled
|
||||
else if (fPlayer.inAdminChat())
|
||||
{
|
||||
adminChat(player, steamrolled, true);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
// The event was already cancelled elsewhere or the player was muted
|
||||
else if (event.isCancelled() || fPlayer.isMuted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Splitter
|
||||
Component splitter = Component.text("»", NamedTextColor.DARK_GRAY);
|
||||
|
||||
// Message
|
||||
TextComponent.Builder message = Component.text();
|
||||
|
||||
// Truncate the message if it's too long
|
||||
if (steamrolled.length() > 256)
|
||||
{
|
||||
steamrolled = steamrolled.substring(0, 256);
|
||||
}
|
||||
|
||||
// Did this because sonarlint was complaining about doing the unboxing in the if statement.
|
||||
// Something about returning null because it was boxed... I'm not sure.
|
||||
boolean unboxed = ConfigEntry.FOURCHAN_ENABLED.getBoolean();
|
||||
|
||||
// Chat colorization
|
||||
// -- 4chan mode --
|
||||
if (steamrolled.startsWith("> ") && unboxed)
|
||||
{
|
||||
message.append(Component.text(steamrolled, NamedTextColor.GREEN));
|
||||
}
|
||||
// -- Legacy chat colors --
|
||||
else if (FUtil.containsChatColor(steamrolled))
|
||||
{
|
||||
message.append(FUtil.colorizeAsComponent(steamrolled.replace("&k", "")));
|
||||
}
|
||||
// -- MiniMessage --
|
||||
else
|
||||
{
|
||||
message.append(FUtil.miniMessage(steamrolled));
|
||||
}
|
||||
|
||||
// This simply filters out shit like &k in a simple but stupid way.
|
||||
Component filtered = FUtil.miniMessage(FUtil.miniMessage(message.build()));
|
||||
|
||||
// Pinging
|
||||
String steamrolledFiltered = FUtil.steamroll(filtered);
|
||||
Arrays.stream(steamrolledFiltered.split(" ")).filter(string -> string.startsWith("@")).forEach(possiblePlayer ->
|
||||
{
|
||||
Player potential = server.getPlayer(possiblePlayer.replace("@", ""));
|
||||
|
||||
// Ping only that particular player
|
||||
if (potential != null)
|
||||
{
|
||||
ping(potential);
|
||||
}
|
||||
// Ping everyone (if the person pinging is an admin)
|
||||
else if (possiblePlayer.equalsIgnoreCase("@everyone") && plugin.al.isAdmin(player))
|
||||
{
|
||||
server.getOnlinePlayers().forEach(this::ping);
|
||||
}
|
||||
});
|
||||
|
||||
event.message(filtered);
|
||||
|
||||
event.renderer((source, displayName, msg, viewer) -> FUtil.miniMessage("<tag><nickname> <splitter> <message>",
|
||||
Placeholder.component("tag", plugin.pl.getPlayer(source).getTag().append(Component.space())),
|
||||
Placeholder.component("nickname", displayName),
|
||||
Placeholder.component("splitter", splitter),
|
||||
Placeholder.component("message", msg)));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onAdminChat(AdminChatEvent event)
|
||||
{
|
||||
Displayable display = event.getDisplayable();
|
||||
String flatAbv = FUtil.miniMessage(display.getAbbr());
|
||||
|
||||
Component defaultFormat = FUtil.miniMessage("<prefix><dark_gray>[<aqua>ADMIN<dark_gray>] <dark_red><name> <dark_gray>[<rankcolor><rank></rankcolor>]</dark_gray><white>: <gold><message>",
|
||||
Placeholder.component("prefix", event.getPrefix()),
|
||||
Placeholder.component("name", event.getName()),
|
||||
Placeholder.unparsed("rank", flatAbv),
|
||||
TagResolver.resolver("rankcolor", Tag.styling(getColor(display))),
|
||||
Placeholder.component("message", event.getMessage()));
|
||||
|
||||
plugin.getComponentLogger().info(defaultFormat);
|
||||
;
|
||||
server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)).forEach(player ->
|
||||
{
|
||||
Admin admin = plugin.al.getAdmin(player);
|
||||
if (!Strings.isNullOrEmpty(admin.getAcFormat()))
|
||||
{
|
||||
String format = admin.getAcFormat();
|
||||
|
||||
player.sendMessage(FUtil.miniMessage(format,
|
||||
Placeholder.component("prefix", event.getPrefix()),
|
||||
Placeholder.component("name", event.getName()),
|
||||
Placeholder.unparsed("rank", flatAbv),
|
||||
TagResolver.resolver("rankcolor", Tag.styling(getColor(display))),
|
||||
Placeholder.component("message", event.getMessage())));
|
||||
}
|
||||
else
|
||||
{
|
||||
player.sendMessage(defaultFormat);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public TextColor getColor(Displayable display)
|
||||
{
|
||||
return display.getColor();
|
||||
}
|
||||
|
||||
public void adminChat(Component name, Displayable displayable, Component message, boolean async)
|
||||
{
|
||||
AdminChatEvent event = new AdminChatEvent(name, displayable, message, async);
|
||||
event.callEvent();
|
||||
}
|
||||
|
||||
public void adminChat(Key key, Component prefix, Component name, Displayable displayable, Component message, boolean async)
|
||||
{
|
||||
AdminChatEvent event = new AdminChatEvent(key, prefix, name, displayable, message, async);
|
||||
event.callEvent();
|
||||
}
|
||||
|
||||
public void adminChat(CommandSender sender, String message)
|
||||
{
|
||||
adminChat(sender, message, false);
|
||||
}
|
||||
|
||||
public void adminChat(CommandSender sender, String message, boolean async)
|
||||
{
|
||||
Displayable display = plugin.rm.getDisplay(sender);
|
||||
adminChat(Component.text(sender.getName()), display, Component.text(message), async);
|
||||
}
|
||||
|
||||
public void reportAction(Player reporter, String reportedName, String report)
|
||||
{
|
||||
messageAllAdmins("<red>[REPORTS]</red> <gold><reporter> has reported <reported> for <reason>.",
|
||||
Placeholder.unparsed("reporter", reporter.getName()),
|
||||
Placeholder.unparsed("reported", reportedName),
|
||||
Placeholder.unparsed("reason", report));
|
||||
}
|
||||
|
||||
public void messageAllAdmins(String message, TagResolver... placeholders)
|
||||
{
|
||||
Component parsed = FUtil.miniMessage(message, placeholders);
|
||||
plugin.getComponentLogger().info(parsed);
|
||||
server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)).forEach(player ->
|
||||
player.sendMessage(parsed));
|
||||
}
|
||||
|
||||
public void broadcastSplit(String forAdmins, String forOperators, TagResolver... placeholders)
|
||||
{
|
||||
messageAllAdmins(forAdmins, placeholders);
|
||||
server.getOnlinePlayers().stream().filter(player -> !plugin.al.isAdmin(player)).forEach(player ->
|
||||
player.sendMessage(FUtil.miniMessage(forOperators, placeholders)));
|
||||
}
|
||||
|
||||
public void ping(Player player)
|
||||
{
|
||||
player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, SoundCategory.MASTER, 1337F, 0.9F);
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
|
||||
public class CommandSpy extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)
|
||||
&& plugin.al.getAdmin(player).getCommandSpy() && player != event.getPlayer()).forEach(player ->
|
||||
player.sendMessage(Component.text(event.getPlayer().getName()).append(Component.text(": "))
|
||||
.append(Component.text(event.getMessage())).color(NamedTextColor.GRAY)));
|
||||
}
|
||||
}
|
@ -11,7 +11,7 @@ public abstract class FreedomService implements Listener
|
||||
protected final Server server;
|
||||
protected final Logger logger;
|
||||
|
||||
public FreedomService()
|
||||
protected FreedomService()
|
||||
{
|
||||
plugin = TotalFreedomMod.getPlugin();
|
||||
server = plugin.getServer();
|
@ -17,7 +17,7 @@ import java.util.Random;
|
||||
import java.util.function.Consumer;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.fun.Jumppads;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
@ -614,7 +614,7 @@ public class FrontDoor extends FreedomService
|
||||
{
|
||||
for (Player player : Bukkit.getOnlinePlayers())
|
||||
{
|
||||
plugin.pl.getPlayer(player).setTag("[" + ChatColor.BLUE + "Total" + ChatColor.GOLD + "Freedom" + ChatColor.WHITE + "]");
|
||||
plugin.pl.getPlayer(player).setTag(FUtil.miniMessage("[" + ChatColor.BLUE + "Total" + ChatColor.GOLD + "Freedom" + ChatColor.WHITE + "]"));
|
||||
}
|
||||
break;
|
||||
}
|
@ -1,15 +1,22 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import io.papermc.lib.PaperLib;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.util.FConverter;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -19,6 +26,7 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class LoginProcess extends FreedomService
|
||||
{
|
||||
@ -29,7 +37,6 @@ public class LoginProcess extends FreedomService
|
||||
private static boolean lockdownEnabled = false;
|
||||
public List<String> TELEPORT_ON_JOIN = new ArrayList<>();
|
||||
public List<String> CLEAR_ON_JOIN = new ArrayList<>();
|
||||
public List<String> CLOWNFISH_TOGGLE = new ArrayList<>();
|
||||
|
||||
public static boolean isLockdownEnabled()
|
||||
{
|
||||
@ -57,13 +64,13 @@ public class LoginProcess extends FreedomService
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
||||
{
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
final boolean isAdmin = plugin.al.getEntryByIp(ip) != null;
|
||||
final Admin entry = plugin.al.getEntryByUuid(event.getUniqueId());
|
||||
final boolean isAdmin = entry != null && entry.isActive();
|
||||
|
||||
// Check if the player is already online
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
if (!onlinePlayer.getName().equalsIgnoreCase(event.getName()))
|
||||
if (!onlinePlayer.getUniqueId().equals(event.getUniqueId()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -85,7 +92,7 @@ public class LoginProcess extends FreedomService
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
final String username = player.getName();
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
final UUID uuid = player.getUniqueId();
|
||||
|
||||
// Check username length
|
||||
if (username.length() < MIN_USERNAME_LENGTH || username.length() > MAX_USERNAME_LENGTH)
|
||||
@ -119,7 +126,8 @@ public class LoginProcess extends FreedomService
|
||||
}
|
||||
|
||||
// Validation below this point
|
||||
if (plugin.al.getEntryByIp(ip) != null) // Check if player is admin
|
||||
final Admin entry = plugin.al.getEntryByUuid(uuid);
|
||||
if (entry != null && entry.isActive()) // Check if player is admin
|
||||
{
|
||||
// Force-allow log in
|
||||
event.allow();
|
||||
@ -174,14 +182,11 @@ public class LoginProcess extends FreedomService
|
||||
}
|
||||
|
||||
// Whitelist
|
||||
if (plugin.si.isWhitelisted())
|
||||
{
|
||||
if (!plugin.si.getWhitelisted().contains(username.toLowerCase()))
|
||||
if (server.hasWhitelist() && !player.isWhitelisted())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
@ -190,21 +195,33 @@ public class LoginProcess extends FreedomService
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
final PlayerData playerData = plugin.pl.getData(player);
|
||||
|
||||
player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60);
|
||||
player.setOp(true);
|
||||
// Sends a message to the player if they have never joined before (or simply lack player data).
|
||||
if (!event.getPlayer().hasPlayedBefore() && ConfigEntry.FIRST_JOIN_INFO_ENABLED.getBoolean())
|
||||
{
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
ConfigEntry.FIRST_JOIN_INFO.getStringList().forEach(line -> FUtil.playerMsgCooler(player, line));
|
||||
}
|
||||
}.runTaskLater(plugin, 20);
|
||||
}
|
||||
|
||||
FUtil.playerTitle(player, ConfigEntry.SERVER_LOGIN_TITLE.getString(), ConfigEntry.SERVER_LOGIN_SUBTITLE.getString());
|
||||
|
||||
if (TELEPORT_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_TP.getBoolean())
|
||||
{
|
||||
int x = FUtil.randomInteger(-10000, 10000);
|
||||
int z = FUtil.randomInteger(-10000, 10000);
|
||||
int y = player.getWorld().getHighestBlockYAt(x, z);
|
||||
int y = player.getWorld().getHighestBlockYAt(x, z) + 1;
|
||||
Location location = new Location(player.getLocation().getWorld(), x, y, z);
|
||||
PaperLib.teleportAsync(player, location);
|
||||
player.sendMessage(ChatColor.AQUA + "You have been teleported to a random location automatically.");
|
||||
FUtil.playerMsgCooler(player, "<aqua>You have been automatically teleported to a random location.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!playerData.hasVerification() && !playerData.getIps().contains(FUtil.getIp(player)))
|
||||
if (!playerData.getIps().contains(FUtil.getIp(player)))
|
||||
{
|
||||
playerData.addIp(FUtil.getIp(player));
|
||||
plugin.pl.save(playerData);
|
||||
@ -213,35 +230,47 @@ public class LoginProcess extends FreedomService
|
||||
if (CLEAR_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_CLEAR.getBoolean())
|
||||
{
|
||||
player.getInventory().clear();
|
||||
player.sendMessage(ChatColor.AQUA + "Your inventory has been cleared automatically.");
|
||||
FUtil.playerMsgCooler(player, "<aqua>Your inventory has been automatically cleared.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ConfigEntry.SERVER_TABLIST_HEADER.getString().isEmpty())
|
||||
{
|
||||
player.setPlayerListHeader(FUtil.colorize(ConfigEntry.SERVER_TABLIST_HEADER.getString()).replace("\\n", "\n"));
|
||||
player.sendPlayerListHeader(FUtil.miniMessage(ConfigEntry.SERVER_TABLIST_HEADER.getString()));
|
||||
}
|
||||
|
||||
if (!ConfigEntry.SERVER_TABLIST_FOOTER.getString().isEmpty())
|
||||
{
|
||||
player.setPlayerListFooter(FUtil.colorize(ConfigEntry.SERVER_TABLIST_FOOTER.getString()).replace("\\n", "\n"));
|
||||
player.sendPlayerListFooter(FUtil.miniMessage(ConfigEntry.SERVER_TABLIST_FOOTER.getString()));
|
||||
}
|
||||
|
||||
if (!plugin.al.isAdmin(player))
|
||||
{
|
||||
String tag = playerData.getTag();
|
||||
Component tag = playerData.getTag();
|
||||
if (tag != null)
|
||||
{
|
||||
fPlayer.setTag(FUtil.colorize(tag));
|
||||
fPlayer.setTag(tag);
|
||||
}
|
||||
|
||||
int noteCount = playerData.getNotes().size();
|
||||
if (noteCount != 0)
|
||||
{
|
||||
String noteMessage = "This player has " + noteCount + " admin note" + (noteCount > 1 ? "s" : "") + ".";
|
||||
FLog.info(noteMessage);
|
||||
plugin.al.messageAllAdmins(ChatColor.GOLD + noteMessage);
|
||||
plugin.al.messageAllAdmins(ChatColor.GOLD + "Do " + ChatColor.YELLOW + "/notes " + player.getName() + " list" + ChatColor.GOLD + " to view them.");
|
||||
plugin.cm.messageAllAdmins("<gold>This player has <yellow><count> <gold>admin note<plural>.",
|
||||
Placeholder.unparsed("count", String.valueOf(noteCount)), Placeholder.unparsed("plural", noteCount > 1 ? "s" : ""));
|
||||
plugin.cm.messageAllAdmins("<gold>Do <yellow>/notes <player> list<gold> to view them.",
|
||||
Placeholder.unparsed("player", player.getName()));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Admin admin = plugin.al.getAdmin(player);
|
||||
String format = admin.getAcFormat();
|
||||
|
||||
if (!Strings.isNullOrEmpty(format) && FConverter.needsConversion(admin.getAcFormat()))
|
||||
{
|
||||
player.sendMessage(FUtil.miniMessage("<green>Converting your admin chat format..."));
|
||||
admin.setAcFormat(FConverter.convertAdminChatFormat(format));
|
||||
plugin.al.save(admin);
|
||||
}
|
||||
}
|
||||
|
||||
@ -252,12 +281,12 @@ public class LoginProcess extends FreedomService
|
||||
{
|
||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
||||
{
|
||||
player.sendMessage(ChatColor.RED + "Server is currently closed to non-admins.");
|
||||
FUtil.playerMsgCooler(player, "<red>Server is currently closed to non-admins.");
|
||||
}
|
||||
|
||||
if (lockdownEnabled)
|
||||
{
|
||||
FUtil.playerMsg(player, "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", ChatColor.RED);
|
||||
FUtil.playerMsgCooler(player, "<red>Warning: Server is currenty in lockdown-mode, new players will not be able to join!");
|
||||
}
|
||||
}
|
||||
}.runTaskLater(plugin, 20L);
|
@ -1,17 +1,16 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||
import ca.momothereal.mojangson.value.MojangsonCompound;
|
||||
import ca.momothereal.mojangson.value.MojangsonValue;
|
||||
import com.google.common.collect.Multimap;
|
||||
import io.papermc.lib.PaperLib;
|
||||
import java.util.List;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import net.minecraft.server.v1_16_R3.NBTTagCompound;
|
||||
import net.minecraft.server.v1_16_R3.NBTTagList;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||
import org.bukkit.attribute.Attribute;
|
||||
import org.bukkit.attribute.AttributeModifier;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@ -20,6 +19,7 @@ import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
public class MovementValidator extends FreedomService
|
||||
{
|
||||
@ -133,55 +133,49 @@ public class MovementValidator extends FreedomService
|
||||
|
||||
private Boolean exploitItem(ItemStack item)
|
||||
{
|
||||
net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
|
||||
NBTTagList modifiers = getAttributeList(nmsStack);
|
||||
MojangsonCompound compound = new MojangsonCompound();
|
||||
boolean foundNegative = false;
|
||||
boolean foundPositive = false;
|
||||
try
|
||||
if (item == null)
|
||||
{
|
||||
String mod = modifiers.toString();
|
||||
String fancy = ("{" + (mod.substring(1, mod.length() - 1).replace("{", "").replace("}", "")) + "}");
|
||||
compound.read(fancy);
|
||||
for (String key : compound.keySet())
|
||||
{
|
||||
if (Objects.equals(key, "Amount")) //null-safe .equals()
|
||||
{
|
||||
@SuppressWarnings("rawtypes")
|
||||
List<MojangsonValue> values = compound.get(key);
|
||||
for (MojangsonValue<?> val : values)
|
||||
{
|
||||
if (val.getValue().toString().equals("Infinityd"))
|
||||
{
|
||||
foundPositive = true;
|
||||
}
|
||||
if (val.getValue().toString().equals("-Infinityd"))
|
||||
{
|
||||
foundNegative = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (MojangsonParseException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
return foundNegative && foundPositive;
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null)
|
||||
{
|
||||
Multimap<Attribute, AttributeModifier> attributes = meta.getAttributeModifiers();
|
||||
if (attributes != null)
|
||||
{
|
||||
Map<Attribute, Collection<AttributeModifier>> attrMap = attributes.asMap();
|
||||
|
||||
private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack)
|
||||
// For every attribute...
|
||||
for (Attribute attr : attributes.keySet())
|
||||
{
|
||||
if (stack.getTag() == null)
|
||||
// Default values
|
||||
boolean posInf = false;
|
||||
boolean negInf = false;
|
||||
|
||||
// For every AttributeModifier...
|
||||
for (AttributeModifier modifier : attrMap.get(attr))
|
||||
{
|
||||
stack.setTag(new NBTTagCompound());
|
||||
}
|
||||
NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10);
|
||||
if (attr == null)
|
||||
// Are they ∞ or -∞?
|
||||
if (modifier.getAmount() == Double.POSITIVE_INFINITY)
|
||||
{
|
||||
stack.getTag().set("AttributeModifiers", new NBTTagList());
|
||||
posInf = true;
|
||||
}
|
||||
return stack.getTag().getList("AttributeModifiers", 10);
|
||||
else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
|
||||
{
|
||||
negInf = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Are both values set as true?
|
||||
if (posInf && negInf)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -1,11 +1,12 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -13,13 +14,9 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
|
||||
public class Muter extends FreedomService
|
||||
{
|
||||
|
||||
public final List<String> MUTED_PLAYERS = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
@ -31,7 +28,7 @@ public class Muter extends FreedomService
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event)
|
||||
public void onAsyncPlayerChatEvent(AsyncChatEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
|
||||
@ -45,11 +42,10 @@ public class Muter extends FreedomService
|
||||
if (plugin.al.isAdminSync(player))
|
||||
{
|
||||
fPlayer.setMuted(false);
|
||||
MUTED_PLAYERS.remove(player.getName());
|
||||
return;
|
||||
}
|
||||
|
||||
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "You are muted.");
|
||||
player.sendMessage(Component.text("You are muted.", NamedTextColor.RED));
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@ -87,7 +83,7 @@ public class Muter extends FreedomService
|
||||
|
||||
if (ConfigEntry.MUTED_BLOCKED_COMMANDS.getStringList().contains(cmdName))
|
||||
{
|
||||
player.sendMessage(ChatColor.RED + "That command is blocked while you are muted.");
|
||||
player.sendMessage(Component.text("That command is blocked while you are muted.", NamedTextColor.RED));
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
@ -98,16 +94,4 @@ public class Muter extends FreedomService
|
||||
FLog.info(String.format("[PREPROCESS_COMMAND] %s(%s): %s", player.getName(), ChatColor.stripColor(player.getDisplayName()), message), true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||
|
||||
if (MUTED_PLAYERS.contains(player.getName()))
|
||||
{
|
||||
playerdata.setMuted(true);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +1,21 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
public class ServerPing extends FreedomService
|
||||
{
|
||||
private final Gson gson = new Gson();
|
||||
private final VersionMeta meta = gson.fromJson(new InputStreamReader(Bukkit.class.getClassLoader().getResourceAsStream("version.json")),VersionMeta.class);
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
@ -26,51 +33,39 @@ public class ServerPing extends FreedomService
|
||||
|
||||
if (plugin.bm.isIpBanned(ip))
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_BAN_MOTD.getString()));
|
||||
event.motd(FUtil.miniMessage(ConfigEntry.SERVER_BAN_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_ADMINMODE_MOTD.getString()));
|
||||
event.motd(FUtil.miniMessage(ConfigEntry.SERVER_ADMINMODE_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (LoginProcess.isLockdownEnabled())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_LOCKDOWN_MOTD.getString()));
|
||||
event.motd(FUtil.miniMessage(ConfigEntry.SERVER_LOCKDOWN_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Bukkit.hasWhitelist())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_WHITELIST_MOTD.getString()));
|
||||
event.motd(FUtil.miniMessage(ConfigEntry.SERVER_WHITELIST_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Bukkit.getOnlinePlayers().size() >= Bukkit.getMaxPlayers())
|
||||
{
|
||||
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_FULL_MOTD.getString()));
|
||||
event.motd(FUtil.miniMessage(ConfigEntry.SERVER_FULL_MOTD.getString()));
|
||||
return;
|
||||
}
|
||||
|
||||
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion());
|
||||
baseMotd = baseMotd.replace("\\n", "\n");
|
||||
baseMotd = FUtil.colorize(baseMotd);
|
||||
event.motd(FUtil.miniMessage(ConfigEntry.SERVER_MOTD.getString(), Placeholder.unparsed("version", meta.id)));
|
||||
}
|
||||
|
||||
if (!ConfigEntry.SERVER_COLORFUL_MOTD.getBoolean())
|
||||
private static class VersionMeta
|
||||
{
|
||||
event.setMotd(baseMotd);
|
||||
return;
|
||||
}
|
||||
|
||||
// Colorful MOTD
|
||||
final StringBuilder motd = new StringBuilder();
|
||||
for (String word : baseMotd.split(" "))
|
||||
{
|
||||
motd.append(FUtil.randomChatColor()).append(word).append(" ");
|
||||
}
|
||||
|
||||
event.setMotd(motd.toString().trim());
|
||||
private String id;
|
||||
}
|
||||
}
|
@ -1,46 +1,23 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
import me.totalfreedom.totalfreedommod.admin.ActivityLog;
|
||||
import me.totalfreedom.totalfreedommod.admin.AdminList;
|
||||
import me.totalfreedom.totalfreedommod.api.Aggregator;
|
||||
import me.totalfreedom.totalfreedommod.api.ShoppeCommons;
|
||||
import me.totalfreedom.totalfreedommod.api.TFD4JCommons;
|
||||
import me.totalfreedom.totalfreedommod.banning.BanManager;
|
||||
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
|
||||
import me.totalfreedom.totalfreedommod.blocking.BlockBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.EditBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.EventBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.InteractBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.MobBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.PVPBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.PotionBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.SignBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.*;
|
||||
import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker;
|
||||
import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.TFGuildsBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.WorldGuardBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.*;
|
||||
import me.totalfreedom.totalfreedommod.caging.Cager;
|
||||
import me.totalfreedom.totalfreedommod.command.CommandLoader;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandLoader;
|
||||
import me.totalfreedom.totalfreedommod.config.MainConfig;
|
||||
import me.totalfreedom.totalfreedommod.discord.Discord;
|
||||
import me.totalfreedom.totalfreedommod.freeze.Freezer;
|
||||
import me.totalfreedom.totalfreedommod.fun.ItemFun;
|
||||
import me.totalfreedom.totalfreedommod.fun.Jumppads;
|
||||
import me.totalfreedom.totalfreedommod.fun.Landminer;
|
||||
import me.totalfreedom.totalfreedommod.fun.MP44;
|
||||
import me.totalfreedom.totalfreedommod.fun.Trailer;
|
||||
import me.totalfreedom.totalfreedommod.fun.*;
|
||||
import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon;
|
||||
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
|
||||
import me.totalfreedom.totalfreedommod.permissions.PermissionManager;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerList;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentList;
|
||||
import me.totalfreedom.totalfreedommod.rank.RankManager;
|
||||
import me.totalfreedom.totalfreedommod.shop.Shop;
|
||||
import me.totalfreedom.totalfreedommod.shop.Votifier;
|
||||
import me.totalfreedom.totalfreedommod.sql.SQLite;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
@ -54,7 +31,10 @@ import org.bukkit.generator.ChunkGenerator;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spigotmc.SpigotConfig;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
public class TotalFreedomMod extends JavaPlugin
|
||||
{
|
||||
@ -67,19 +47,14 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
private static TotalFreedomMod plugin;
|
||||
//
|
||||
public MainConfig config;
|
||||
public PermissionConfig permissions;
|
||||
//
|
||||
// Service Handler
|
||||
public FreedomServiceHandler fsh;
|
||||
// Command Loader
|
||||
public CommandLoader cl;
|
||||
// Services
|
||||
public ServerInterface si;
|
||||
public SavedFlags sf;
|
||||
public WorldManager wm;
|
||||
public LogViewer lv;
|
||||
public AdminList al;
|
||||
public ActivityLog acl;
|
||||
public RankManager rm;
|
||||
public CommandBlocker cb;
|
||||
public EventBlocker eb;
|
||||
@ -91,16 +66,15 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
public AntiNuke nu;
|
||||
public AntiSpam as;
|
||||
public PlayerList pl;
|
||||
public Shop sh;
|
||||
public Votifier vo;
|
||||
public ShoppeCommons sh;
|
||||
public SQLite sql;
|
||||
public Announcer an;
|
||||
public ChatManager cm;
|
||||
public Discord dc;
|
||||
public TFD4JCommons dc;
|
||||
public Aggregator ag;
|
||||
public PunishmentList pul;
|
||||
public BanManager bm;
|
||||
public IndefiniteBanList im;
|
||||
public PermissionManager pem;
|
||||
public GameRuleHandler gr;
|
||||
public CommandSpy cs;
|
||||
public Cager ca;
|
||||
@ -122,20 +96,16 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
public Trailer tr;
|
||||
public HTTPDaemon hd;
|
||||
public WorldRestrictions wr;
|
||||
public SignBlocker snp;
|
||||
public EntityWiper ew;
|
||||
public Sitter st;
|
||||
public VanishHandler vh;
|
||||
public Pterodactyl ptero;
|
||||
//
|
||||
// Bridges
|
||||
public BukkitTelnetBridge btb;
|
||||
public EssentialsBridge esb;
|
||||
public LibsDisguisesBridge ldb;
|
||||
public CoreProtectBridge cpb;
|
||||
public TFGuildsBridge tfg;
|
||||
public WorldEditBridge web;
|
||||
public WorldGuardBridge wgb;
|
||||
public LuckPermsBridge lpb;
|
||||
|
||||
public static TotalFreedomMod getPlugin()
|
||||
{
|
||||
@ -177,9 +147,6 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
final MethodTimer timer = new MethodTimer();
|
||||
timer.start();
|
||||
|
||||
// Warn if we're running on a wrong version
|
||||
ServerInterface.warnVersion();
|
||||
|
||||
// Delete unused files
|
||||
FUtil.deleteCoreDumps();
|
||||
FUtil.deleteFolder(new File("./_deleteme"));
|
||||
@ -187,7 +154,6 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
fsh = new FreedomServiceHandler();
|
||||
|
||||
config = new MainConfig();
|
||||
config.load();
|
||||
|
||||
if (FUtil.inDeveloperMode())
|
||||
{
|
||||
@ -200,9 +166,6 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
BackupManager backups = new BackupManager();
|
||||
backups.createAllBackups();
|
||||
|
||||
permissions = new PermissionConfig();
|
||||
permissions.load();
|
||||
|
||||
mv = new MovementValidator();
|
||||
sp = new ServerPing();
|
||||
|
||||
@ -213,13 +176,10 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
FLog.info("Started " + fsh.getServiceAmount() + " services.");
|
||||
|
||||
timer.update();
|
||||
FLog.info("Version " + pluginVersion + " for " + ServerInterface.COMPILE_NMS_VERSION + " enabled in " + timer.getTotal() + "ms");
|
||||
FLog.info("Version " + pluginVersion + " enabled in " + timer.getTotal() + "ms");
|
||||
|
||||
// Metrics @ https://bstats.org/plugin/bukkit/TotalFreedomMod/2966
|
||||
new Metrics(this, 2966);
|
||||
|
||||
// little workaround to stop spigot from autorestarting - causing AMP to detach from process.
|
||||
SpigotConfig.config.set("settings.restart-on-crash", false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -239,6 +199,22 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
return new CleanroomChunkGenerator(id);
|
||||
}
|
||||
|
||||
public void registerDiscord()
|
||||
{
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("TFD4J"))
|
||||
{
|
||||
dc = ag.getDiscordContext().getValue();
|
||||
}
|
||||
}
|
||||
|
||||
public void registerShoppe()
|
||||
{
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("TF-Shoppe"))
|
||||
{
|
||||
sh = ag.getShoppeContext().getValue();
|
||||
}
|
||||
}
|
||||
|
||||
public static class BuildProperties
|
||||
{
|
||||
public String author;
|
||||
@ -253,6 +229,7 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
try
|
||||
{
|
||||
final Properties props;
|
||||
final String unknown = "unknown";
|
||||
|
||||
try (InputStream in = plugin.getResource("build.properties"))
|
||||
{
|
||||
@ -260,15 +237,13 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
props.load(in);
|
||||
}
|
||||
|
||||
author = props.getProperty("buildAuthor", "unknown");
|
||||
codename = props.getProperty("buildCodeName", "unknown");
|
||||
author = props.getProperty("buildAuthor", unknown);
|
||||
codename = props.getProperty("buildCodeName", unknown);
|
||||
version = props.getProperty("buildVersion", pluginVersion);
|
||||
number = props.getProperty("buildNumber", "1");
|
||||
date = props.getProperty("buildDate", "unknown");
|
||||
// Need to do this or it will display ${git.commit.id.abbrev}
|
||||
head = props.getProperty("buildHead", "unknown").replace("${git.commit.id.abbrev}", "unknown");
|
||||
}
|
||||
catch (Exception ex)
|
||||
date = props.getProperty("buildDate", unknown);
|
||||
head = props.getProperty("buildHead", unknown).replace("${git.commit.id.abbrev}", unknown);
|
||||
} catch (Exception ex)
|
||||
{
|
||||
FLog.severe("Could not load build properties! Did you compile with NetBeans/Maven?");
|
||||
FLog.severe(ex);
|
||||
@ -298,13 +273,9 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
private void initServices()
|
||||
{
|
||||
// Start services
|
||||
si = new ServerInterface();
|
||||
sf = new SavedFlags();
|
||||
wm = new WorldManager();
|
||||
lv = new LogViewer();
|
||||
sql = new SQLite();
|
||||
al = new AdminList();
|
||||
acl = new ActivityLog();
|
||||
rm = new RankManager();
|
||||
cb = new CommandBlocker();
|
||||
eb = new EventBlocker();
|
||||
@ -317,21 +288,18 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
as = new AntiSpam();
|
||||
wr = new WorldRestrictions();
|
||||
pl = new PlayerList();
|
||||
sh = new Shop();
|
||||
vo = new Votifier();
|
||||
ag = new Aggregator();
|
||||
|
||||
an = new Announcer();
|
||||
cm = new ChatManager();
|
||||
dc = new Discord();
|
||||
|
||||
|
||||
pul = new PunishmentList();
|
||||
bm = new BanManager();
|
||||
im = new IndefiniteBanList();
|
||||
pem = new PermissionManager();
|
||||
gr = new GameRuleHandler();
|
||||
snp = new SignBlocker();
|
||||
ew = new EntityWiper();
|
||||
st = new Sitter();
|
||||
vh = new VanishHandler();
|
||||
ptero = new Pterodactyl();
|
||||
}
|
||||
|
||||
private void initAdminUtils()
|
||||
@ -357,9 +325,8 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
cpb = new CoreProtectBridge();
|
||||
esb = new EssentialsBridge();
|
||||
ldb = new LibsDisguisesBridge();
|
||||
tfg = new TFGuildsBridge();
|
||||
web = new WorldEditBridge();
|
||||
wgb = new WorldGuardBridge();
|
||||
lpb = new LuckPermsBridge();
|
||||
}
|
||||
|
||||
private void initFun()
|
@ -0,0 +1,70 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class VanishHandler extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
|
||||
server.getOnlinePlayers().stream().filter(pl -> !plugin.al.isAdmin(player)
|
||||
&& plugin.al.isVanished(pl.getUniqueId())).forEach(pl -> player.hidePlayer(plugin, pl));
|
||||
|
||||
server.getOnlinePlayers().stream().filter(pl -> !plugin.al.isAdmin(pl)
|
||||
&& plugin.al.isVanished(player.getUniqueId())).forEach(pl -> pl.hidePlayer(plugin, player));
|
||||
|
||||
if (plugin.al.isVanished(player.getUniqueId()))
|
||||
{
|
||||
plugin.esb.setVanished(player.getName(), true);
|
||||
plugin.cm.messageAllAdmins("<yellow><player> has joined silently.", Placeholder.unparsed("player", player.getName()));
|
||||
event.joinMessage(null);
|
||||
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (plugin.al.isVanished(player.getUniqueId()))
|
||||
{
|
||||
player.sendActionBar(FUtil.miniMessage("<gold>You are hidden from other players."));
|
||||
}
|
||||
else
|
||||
{
|
||||
this.cancel();
|
||||
}
|
||||
}
|
||||
}.runTaskTimer(plugin, 0L, 4L);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerLeave(PlayerQuitEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (plugin.al.isVanished(player.getUniqueId()))
|
||||
{
|
||||
event.quitMessage(null);
|
||||
plugin.cm.messageAllAdmins("<yellow><player> has left silently.", Placeholder.unparsed("player", player.getName()));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,60 +1,51 @@
|
||||
package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode;
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.DisplayableGroup;
|
||||
import me.totalfreedom.totalfreedommod.rank.GroupProvider;
|
||||
import me.totalfreedom.totalfreedommod.sql.ResultSetProvider;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class Admin
|
||||
{
|
||||
|
||||
|
||||
private final List<String> ips = new ArrayList<>();
|
||||
private String name;
|
||||
private UUID uuid;
|
||||
private boolean active = true;
|
||||
private Rank rank = Rank.ADMIN;
|
||||
private DisplayableGroup rank = GroupProvider.ADMIN.getGroup();
|
||||
private Date lastLogin = new Date();
|
||||
private Boolean commandSpy = false;
|
||||
private Boolean potionSpy = false;
|
||||
private String acFormat = null;
|
||||
private String pteroID = null;
|
||||
|
||||
public Admin(Player player)
|
||||
{
|
||||
this.name = player.getName();
|
||||
uuid = player.getUniqueId();
|
||||
this.ips.add(FUtil.getIp(player));
|
||||
}
|
||||
|
||||
public Admin(ResultSet resultSet)
|
||||
public Admin(ResultSetProvider resultSet)
|
||||
{
|
||||
try
|
||||
if (resultSet.getString("uuid") == null)
|
||||
{
|
||||
this.name = resultSet.getString("username");
|
||||
throw new IllegalArgumentException("Failed to load admin, as the UUID is null.");
|
||||
}
|
||||
|
||||
this.uuid = UUID.fromString(resultSet.getString("uuid"));
|
||||
this.active = resultSet.getBoolean("active");
|
||||
this.rank = Rank.findRank(resultSet.getString("rank"));
|
||||
this.rank = GroupProvider.fromString(resultSet.getString("rank")).getGroup();
|
||||
this.ips.clear();
|
||||
this.ips.addAll(FUtil.stringToList(resultSet.getString("ips")));
|
||||
this.lastLogin = new Date(resultSet.getLong("last_login"));
|
||||
this.commandSpy = resultSet.getBoolean("command_spy");
|
||||
this.potionSpy = resultSet.getBoolean("potion_spy");
|
||||
this.acFormat = resultSet.getString("ac_format");
|
||||
this.pteroID = resultSet.getString("ptero_id");
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to load admin: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -62,33 +53,30 @@ public class Admin
|
||||
{
|
||||
final StringBuilder output = new StringBuilder();
|
||||
|
||||
output.append("Admin: ").append(name).append("\n")
|
||||
output.append("Admin: ").append(getName() != null ? getName() : getUuid().toString()).append("\n")
|
||||
.append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n")
|
||||
.append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n")
|
||||
.append("- Rank: ").append(rank.getName()).append("\n")
|
||||
.append("- Is Active: ").append(active).append("\n")
|
||||
.append("- Potion Spy: ").append(potionSpy).append("\n")
|
||||
.append("- Admin Chat Format: ").append(acFormat).append("\n")
|
||||
.append("- Pterodactyl ID: ").append(pteroID).append("\n");
|
||||
.append("- Admin Chat Format: ").append(acFormat).append("\n");
|
||||
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
public Map<String, Object> toSQLStorable()
|
||||
{
|
||||
Map<String, Object> map = new HashMap<String, Object>()
|
||||
{{
|
||||
put("username", name);
|
||||
put("active", active);
|
||||
put("rank", rank.toString());
|
||||
put("ips", FUtil.listToString(ips));
|
||||
put("last_login", lastLogin.getTime());
|
||||
put("command_spy", commandSpy);
|
||||
put("potion_spy", potionSpy);
|
||||
put("ac_format", acFormat);
|
||||
put("ptero_id", pteroID);
|
||||
}};
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("uuid", uuid.toString());
|
||||
map.put("active", active);
|
||||
map.put("rank", rank.toString());
|
||||
map.put("ips", FUtil.listToString(ips));
|
||||
map.put("last_login", lastLogin.getTime());
|
||||
map.put("command_spy", commandSpy);
|
||||
map.put("potion_spy", potionSpy);
|
||||
map.put("ac_format", acFormat);
|
||||
return map;
|
||||
|
||||
}
|
||||
|
||||
// Util IP methods
|
||||
@ -120,20 +108,20 @@ public class Admin
|
||||
|
||||
public boolean isValid()
|
||||
{
|
||||
return name != null
|
||||
return uuid != null
|
||||
&& rank != null
|
||||
&& !ips.isEmpty()
|
||||
&& lastLogin != null;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
public UUID getUuid()
|
||||
{
|
||||
return name;
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
public String getName()
|
||||
{
|
||||
this.name = name;
|
||||
return Bukkit.getOfflinePlayer(uuid).getName();
|
||||
}
|
||||
|
||||
public boolean isActive()
|
||||
@ -156,24 +144,55 @@ public class Admin
|
||||
|
||||
if (!active)
|
||||
{
|
||||
if (getRank().isAtLeast(Rank.ADMIN))
|
||||
setActiveSplitWorkToReduceComplexity(plugin);
|
||||
}
|
||||
}
|
||||
|
||||
private void setActiveSplitWorkToReduceComplexity(TotalFreedomMod plugin)
|
||||
{
|
||||
if (getRank().isAtLeast(GroupProvider.ADMIN.getGroup()))
|
||||
{
|
||||
if (plugin.btb != null)
|
||||
{
|
||||
plugin.btb.killTelnetSessions(getName());
|
||||
}
|
||||
|
||||
// Ensure admins don't have admin functionality when removed (FS-222)
|
||||
AdminList.vanished.remove(getUuid());
|
||||
|
||||
if (plugin.esb != null)
|
||||
{
|
||||
plugin.esb.setVanished(getName(), false);
|
||||
}
|
||||
|
||||
plugin.lv.updateLogsRegistration(null, getName(), LogsRegistrationMode.DELETE);
|
||||
setCommandSpy(false);
|
||||
setPotionSpy(false);
|
||||
|
||||
Server server = Bukkit.getServer();
|
||||
Player player = server.getPlayer(getUuid());
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
// Update chats
|
||||
FPlayer freedomPlayer = plugin.pl.getPlayer(player);
|
||||
freedomPlayer.removeAdminFunctionality();
|
||||
|
||||
// Disable vanish
|
||||
for (Player player1 : server.getOnlinePlayers())
|
||||
{
|
||||
player1.showPlayer(plugin, player);
|
||||
}
|
||||
}
|
||||
|
||||
public Rank getRank()
|
||||
}
|
||||
}
|
||||
|
||||
public DisplayableGroup getRank()
|
||||
{
|
||||
return rank;
|
||||
}
|
||||
|
||||
public void setRank(Rank rank)
|
||||
public void setRank(DisplayableGroup rank)
|
||||
{
|
||||
this.rank = rank;
|
||||
}
|
||||
@ -222,14 +241,4 @@ public class Admin
|
||||
{
|
||||
this.acFormat = acFormat;
|
||||
}
|
||||
|
||||
public String getPteroID()
|
||||
{
|
||||
return pteroID;
|
||||
}
|
||||
|
||||
public void setPteroID(String pteroID)
|
||||
{
|
||||
this.pteroID = pteroID;
|
||||
}
|
||||
}
|
@ -0,0 +1,344 @@
|
||||
package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.GroupProvider;
|
||||
import me.totalfreedom.totalfreedommod.sql.ResultSetProvider;
|
||||
import me.totalfreedom.totalfreedommod.rank.Hierarchy;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class AdminList extends FreedomService
|
||||
{
|
||||
public static final List<UUID> vanished = new ArrayList<>();
|
||||
public static final String SQL_SAVE_FAILED = "Failed to save admin: ";
|
||||
private final Set<Admin> allAdmins = Sets.newHashSet(); // Includes disabled admins
|
||||
// Only active admins below
|
||||
private final Set<Admin> activeAdmins = Sets.newHashSet();
|
||||
private final Map<UUID, Admin> uuidTable = Maps.newHashMap();
|
||||
private final Map<String, Admin> nameTable = Maps.newHashMap();
|
||||
private final Map<String, Admin> ipTable = Maps.newHashMap();
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
load();
|
||||
deactivateOldEntries(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
// This does nothing. This comment is here to prevent SonarLint from complaining.
|
||||
}
|
||||
|
||||
public void load()
|
||||
{
|
||||
allAdmins.clear();
|
||||
plugin.sql.getAdminList().thenAcceptAsync(provider ->
|
||||
{
|
||||
AtomicInteger row = new AtomicInteger(1);
|
||||
provider.getAllRowsResultSet().forEach(adminSet ->
|
||||
{
|
||||
try
|
||||
{
|
||||
tryAddAdmin(ResultSetProvider.fromRow(adminSet));
|
||||
row.set(row.get() + 1);
|
||||
} catch (Throwable e)
|
||||
{
|
||||
FLog.warning("An error occurred whilst reading the admin entry at row #" + row.get());
|
||||
throw new CompletionException(e); // handle downstream.
|
||||
}
|
||||
});
|
||||
}).whenComplete((result, throwable) ->
|
||||
{
|
||||
if (throwable != null)
|
||||
{
|
||||
FLog.severe(throwable.getMessage());
|
||||
return;
|
||||
}
|
||||
updateTables();
|
||||
FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)");
|
||||
});
|
||||
}
|
||||
|
||||
private void tryAddAdmin(ResultSetProvider adminSet)
|
||||
{
|
||||
Admin admin = new Admin(adminSet);
|
||||
allAdmins.add(admin);
|
||||
}
|
||||
|
||||
public void messageAllAdmins(Component message)
|
||||
{
|
||||
server.getOnlinePlayers().stream().filter(this::isAdmin).forEach(player -> player.sendMessage(message));
|
||||
}
|
||||
|
||||
public void potionSpyMessage(String message)
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
Admin admin = getAdmin(player.getPlayer());
|
||||
if (isAdmin(player) && admin.getPotionSpy())
|
||||
{
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized boolean isAdminSync(CommandSender sender)
|
||||
{
|
||||
return isAdmin(sender);
|
||||
}
|
||||
|
||||
public boolean isAdmin(CommandSender sender)
|
||||
{
|
||||
if (!(sender instanceof Player))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Admin admin = getAdmin((Player) sender);
|
||||
|
||||
return admin != null && admin.isActive();
|
||||
}
|
||||
|
||||
public boolean isAdmin(Player player)
|
||||
{
|
||||
if (Hierarchy.getHierarchy().isUserOnAdminTrack(player)) return true;
|
||||
|
||||
return isAdmin((OfflinePlayer) player);
|
||||
}
|
||||
|
||||
public boolean isAdmin(OfflinePlayer player)
|
||||
{
|
||||
if (player == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Admin admin = getAdmin(player);
|
||||
|
||||
return admin != null && admin.isActive();
|
||||
}
|
||||
|
||||
public Admin getAdmin(CommandSender sender)
|
||||
{
|
||||
if (sender instanceof Player player)
|
||||
{
|
||||
return getAdmin(player);
|
||||
}
|
||||
|
||||
return getEntryByName(sender.getName());
|
||||
}
|
||||
|
||||
public Admin getAdmin(OfflinePlayer player)
|
||||
{
|
||||
return getEntryByUuid(player.getUniqueId());
|
||||
}
|
||||
|
||||
public Admin getEntryByUuid(UUID uuid)
|
||||
{
|
||||
return uuidTable.get(uuid);
|
||||
}
|
||||
|
||||
public Admin getEntryByName(String name)
|
||||
{
|
||||
return nameTable.get(name.toLowerCase());
|
||||
}
|
||||
|
||||
public Admin getEntryByIp(String ip)
|
||||
{
|
||||
return ipTable.get(ip);
|
||||
}
|
||||
|
||||
// To cast against OfflinePlayer
|
||||
public Admin getAdmin(Player player)
|
||||
{
|
||||
return getAdmin((OfflinePlayer) player);
|
||||
}
|
||||
|
||||
public void updateLastLogin(Player player)
|
||||
{
|
||||
final Admin admin = getAdmin(player);
|
||||
if (admin == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
admin.setLastLogin(new Date());
|
||||
save(admin);
|
||||
}
|
||||
|
||||
public void addAdmin(Admin admin)
|
||||
{
|
||||
if (!admin.isValid())
|
||||
{
|
||||
FLog.warning("Could not add admin: " + admin.getName() + ". Admin is missing details!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Store admin, update views
|
||||
allAdmins.add(admin);
|
||||
updateTables();
|
||||
|
||||
// Save admin
|
||||
plugin.sql.addAdmin(admin).whenComplete((result, exception) ->
|
||||
{
|
||||
if (exception != null)
|
||||
{
|
||||
FLog.warning(SQL_SAVE_FAILED + admin.getName() + " to the database.\n" + exception.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public boolean removeAdmin(Admin admin)
|
||||
{
|
||||
if (admin.getRank().isAtLeast(GroupProvider.ADMIN.getGroup()) && (plugin.btb != null))
|
||||
{
|
||||
plugin.btb.killTelnetSessions(admin.getName());
|
||||
}
|
||||
|
||||
// Remove admin, update views
|
||||
if (!allAdmins.remove(admin))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
updateTables();
|
||||
|
||||
// Unsave admin
|
||||
plugin.sql.removeAdmin(admin).whenComplete((result, exception) ->
|
||||
{
|
||||
if (exception != null)
|
||||
{
|
||||
FLog.warning("Failed to remove admin: " + admin.getName() + " from the database.\n" + exception.getMessage());
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void updateTables()
|
||||
{
|
||||
activeAdmins.clear();
|
||||
uuidTable.clear();
|
||||
nameTable.clear();
|
||||
ipTable.clear();
|
||||
|
||||
for (Admin admin : allAdmins)
|
||||
{
|
||||
if (!admin.isActive())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
activeAdmins.add(admin);
|
||||
uuidTable.put(admin.getUuid(), admin);
|
||||
if (admin.getName() != null)
|
||||
{
|
||||
nameTable.put(admin.getName().toLowerCase(), admin);
|
||||
}
|
||||
|
||||
for (String ip : admin.getIps())
|
||||
{
|
||||
ipTable.put(ip, admin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Set<String> getAdminNames()
|
||||
{
|
||||
return nameTable.keySet();
|
||||
}
|
||||
|
||||
public Set<String> getAdminIps()
|
||||
{
|
||||
return ipTable.keySet();
|
||||
}
|
||||
|
||||
public void save(Admin admin)
|
||||
{
|
||||
plugin.sql.getAdminByUuid(admin.getUuid()).thenApplyAsync(result ->
|
||||
{
|
||||
for (Map.Entry<String, Object> entry : admin.toSQLStorable().entrySet())
|
||||
{
|
||||
Object storedValue = plugin.sql.getValue(result, entry.getKey(), entry.getValue());
|
||||
if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null)
|
||||
{
|
||||
plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue()).whenComplete((result2, exception) ->
|
||||
{
|
||||
if (exception != null)
|
||||
{
|
||||
throw new CompletionException(exception); // We want to handle downstream in #whenComplete()
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}).whenComplete((result, exception) ->
|
||||
{
|
||||
if (exception != null)
|
||||
{
|
||||
FLog.severe(SQL_SAVE_FAILED + exception.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void deactivateOldEntries(boolean verbose)
|
||||
{
|
||||
allAdmins.stream()
|
||||
.filter(admin -> admin.isActive() && !admin.getRank().isAtLeast(GroupProvider.SENIOR_ADMIN.getGroup()))
|
||||
.forEach(admin ->
|
||||
{
|
||||
final Date lastLogin = admin.getLastLogin();
|
||||
final long lastLoginHours = TimeUnit.HOURS.convert(new Date().getTime() - lastLogin.getTime(), TimeUnit.MILLISECONDS);
|
||||
if (lastLoginHours < ConfigEntry.ADMINLIST_CLEAN_THESHOLD_HOURS.getInteger())
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (verbose)
|
||||
{
|
||||
FUtil.adminAction("TotalFreedomMod", "Deactivating admin " + admin.getName() + ", inactive for " + lastLoginHours + " hours", true);
|
||||
}
|
||||
admin.setActive(false);
|
||||
save(admin);
|
||||
});
|
||||
|
||||
updateTables();
|
||||
}
|
||||
|
||||
public boolean isVanished(UUID uuid)
|
||||
{
|
||||
return vanished.contains(uuid);
|
||||
}
|
||||
|
||||
public Set<Admin> getAllAdmins()
|
||||
{
|
||||
return allAdmins;
|
||||
}
|
||||
|
||||
public Set<Admin> getActiveAdmins()
|
||||
{
|
||||
return activeAdmins;
|
||||
}
|
||||
|
||||
public Map<String, Admin> getNameTable()
|
||||
{
|
||||
return nameTable;
|
||||
}
|
||||
|
||||
public Map<String, Admin> getIpTable()
|
||||
{
|
||||
return ipTable;
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package me.totalfreedom.totalfreedommod.api;
|
||||
|
||||
public class Aggregator
|
||||
{
|
||||
private Context<TFD4JCommons> discord;
|
||||
private Context<ShoppeCommons> shoppe;
|
||||
|
||||
public Context<TFD4JCommons> getDiscordContext()
|
||||
{
|
||||
return discord;
|
||||
}
|
||||
|
||||
public void setDiscordContext(Context<TFD4JCommons> discord)
|
||||
{
|
||||
this.discord = discord;
|
||||
}
|
||||
|
||||
public Context<ShoppeCommons> getShoppeContext()
|
||||
{
|
||||
return shoppe;
|
||||
}
|
||||
|
||||
public void setShoppeContext(Context<ShoppeCommons> shoppe)
|
||||
{
|
||||
this.shoppe = shoppe;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package me.totalfreedom.totalfreedommod.api;
|
||||
|
||||
public class Context<T>
|
||||
{
|
||||
private final T value;
|
||||
|
||||
public Context(T value)
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public T getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package me.totalfreedom.totalfreedommod.api;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface Interpolator
|
||||
{
|
||||
double[] interpolate(double from, double to, int max);
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package me.totalfreedom.totalfreedommod.shop;
|
||||
package me.totalfreedom.totalfreedommod.api;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -10,19 +10,29 @@ public enum ShopItem
|
||||
LIGHTNING_ROD("Lightning Rod", Material.BLAZE_ROD, 12, ConfigEntry.SHOP_PRICES_LIGHTNING_ROD, ChatColor.LIGHT_PURPLE, "lightningRod", "/lightningrod"),
|
||||
FIRE_BALL("Fire Ball", Material.FIRE_CHARGE, 14, ConfigEntry.SHOP_PRICES_FIRE_BALL, ChatColor.RED, "fireBall", "/fireball"),
|
||||
RIDEABLE_PEARL("Rideable Ender Pearl", Material.ENDER_PEARL, 16, ConfigEntry.SHOP_PRICES_RIDEABLE_PEARL, ChatColor.DARK_PURPLE, "rideablePearl", "/rideablepearl"),
|
||||
STACKING_POTATO("Stacking Potato", Material.POTATO, 20, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"),
|
||||
CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 22, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"),
|
||||
LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 24, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage");
|
||||
STACKING_POTATO("Stacking Potato", Material.POTATO, 19, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"),
|
||||
CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 21, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"),
|
||||
LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 23, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage"),
|
||||
RAINBOW_TRAIL("Rainbow Trail", Material.RED_WOOL, 25, ConfigEntry.SHOP_PRICES_RAINBOW_TRAIL, ChatColor.DARK_RED, "rainbowTrail", "/trail");
|
||||
|
||||
/*
|
||||
Shop GUI Layout:
|
||||
|
||||
Dimensions: 9x4 = 36
|
||||
Key: g = Grappling Hook, l = Lightning Rod, f = Fire Ball, r = Rideable Ender Pearl, s = Stacking Potato, c = Clown Fish, x = Login Messages $ = Coins}
|
||||
Key:
|
||||
g = Grappling Hook,
|
||||
l = Lightning Rod
|
||||
f = Fire Ball
|
||||
r = Rideable Ender Pearl
|
||||
s = Stacking Potato
|
||||
c = Clown Fish
|
||||
x = Login Messages
|
||||
t = Rainbow Trail
|
||||
$ = Coins
|
||||
|
||||
---------
|
||||
-g-l-f-r-
|
||||
--s-c-x--
|
||||
-s-c-x-t-
|
||||
--------$
|
||||
*/
|
||||
|
@ -0,0 +1,55 @@
|
||||
package me.totalfreedom.totalfreedommod.api;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
|
||||
public interface ShoppeCommons
|
||||
{
|
||||
|
||||
int getCoinsPerReactionWin();
|
||||
|
||||
void startReactionTimer();
|
||||
|
||||
void forceStartReaction();
|
||||
|
||||
void startReaction();
|
||||
|
||||
void endReaction(String winner);
|
||||
|
||||
String getShopPrefix();
|
||||
|
||||
String getShopTitle();
|
||||
|
||||
Inventory generateShopGUI(PlayerData playerData);
|
||||
|
||||
Inventory generateLoginMessageGUI(Player player);
|
||||
|
||||
boolean isRealItem(PlayerData data, ShopItem shopItem, PlayerInventory inventory, ItemStack realItem);
|
||||
|
||||
boolean isRealItem(PlayerData data, ShopItem shopItem, ItemStack givenItem, ItemStack realItem);
|
||||
|
||||
ItemStack getLightningRod();
|
||||
|
||||
ItemStack getGrapplingHook();
|
||||
|
||||
ItemStack getFireBall();
|
||||
|
||||
ItemStack getRideablePearl();
|
||||
|
||||
ItemStack getStackingPotato();
|
||||
|
||||
ItemStack getClownFish();
|
||||
|
||||
boolean canAfford(int price, int coins);
|
||||
|
||||
int amountNeeded(int price, int coins);
|
||||
|
||||
ItemStack shopGUIItem(ShopItem item, PlayerData data);
|
||||
|
||||
ShopItem getShopItem(int slot);
|
||||
|
||||
String getReactionString();
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package me.totalfreedom.totalfreedommod.api;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface TFD4JCommons
|
||||
{
|
||||
void messageAdminChatChannel(String message);
|
||||
|
||||
void clearQueue();
|
||||
|
||||
void messageChatChannel(String message, boolean system);
|
||||
|
||||
boolean syncRoles(Admin admin, String id);
|
||||
|
||||
String getCode(PlayerData playerData);
|
||||
|
||||
String generateCode(int size);
|
||||
|
||||
Map<String, PlayerData> getLinkCodes();
|
||||
|
||||
String formatBotTag();
|
||||
|
||||
boolean sendReportOffline(Player reporter, OfflinePlayer reported, String reason);
|
||||
|
||||
boolean sendReport(Player reporter, Player reported, String reason);
|
||||
|
||||
boolean isEnabled();
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
package me.totalfreedom.totalfreedommod.api.event;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class AdminChatEvent extends Event
|
||||
{
|
||||
private static HandlerList handlerList = new HandlerList();
|
||||
//--
|
||||
private Key identifier;
|
||||
private Component prefix = Component.empty();
|
||||
private Component name;
|
||||
private Displayable displayable;
|
||||
private Component message;
|
||||
|
||||
public AdminChatEvent(Key identifier, Component prefix, Component name, Displayable rank, Component message, boolean async)
|
||||
{
|
||||
super(async);
|
||||
this.identifier = identifier;
|
||||
this.prefix = prefix;
|
||||
this.name = name;
|
||||
this.displayable = rank;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public AdminChatEvent(Component name, Displayable rank, Component message, boolean async)
|
||||
{
|
||||
super(async);
|
||||
this.identifier = Key.key("tfm", "default");
|
||||
this.name = name;
|
||||
this.displayable = rank;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlerList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers()
|
||||
{
|
||||
return handlerList;
|
||||
}
|
||||
|
||||
public Key getIdentifier()
|
||||
{
|
||||
return identifier;
|
||||
}
|
||||
|
||||
public Component getPrefix()
|
||||
{
|
||||
return prefix;
|
||||
}
|
||||
|
||||
public Component getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public Displayable getDisplayable()
|
||||
{
|
||||
return displayable;
|
||||
}
|
||||
|
||||
public Component getMessage()
|
||||
{
|
||||
return message;
|
||||
}
|
||||
}
|
@ -121,17 +121,6 @@ public class Ban
|
||||
reason);
|
||||
}
|
||||
|
||||
public static Ban forPlayerFuzzy(Player player, CommandSender by, Date expiry, String reason)
|
||||
{
|
||||
return new Ban(player.getName(),
|
||||
player.getUniqueId(),
|
||||
FUtil.getFuzzyIp(FUtil.getIp(player)),
|
||||
by.getName(),
|
||||
Date.from(Instant.now()),
|
||||
expiry,
|
||||
reason);
|
||||
}
|
||||
|
||||
public static SimpleDateFormat getDateFormat()
|
||||
{
|
||||
return DATE_FORMAT;
|
@ -1,20 +1,9 @@
|
||||
package me.totalfreedom.totalfreedommod.banning;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.sql.ResultSetProvider;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -23,6 +12,8 @@ import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class BanManager extends FreedomService
|
||||
{
|
||||
|
||||
@ -30,20 +21,24 @@ public class BanManager extends FreedomService
|
||||
private final Map<String, Ban> nameBans = Maps.newHashMap();
|
||||
private final Map<UUID, Ban> uuidBans = Maps.newHashMap();
|
||||
private final Map<String, Ban> ipBans = Maps.newHashMap();
|
||||
private final List<String> unbannableUsernames = Lists.newArrayList();
|
||||
|
||||
//
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
bans.clear();
|
||||
try
|
||||
|
||||
plugin.sql.getBanList().whenComplete((result, throwable) ->
|
||||
{
|
||||
ResultSet banSet = plugin.sql.getBanList();
|
||||
if (throwable != null)
|
||||
{
|
||||
while (banSet.next())
|
||||
FLog.severe("Failed to load ban list: " + throwable.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
result.getAllRowsResultSet().forEach(row ->
|
||||
{
|
||||
ResultSetProvider banSet = ResultSetProvider.fromRow(row);
|
||||
String name = banSet.getString("name");
|
||||
UUID uuid = null;
|
||||
String strUUID = banSet.getString("uuid");
|
||||
@ -58,28 +53,18 @@ public class BanManager extends FreedomService
|
||||
String reason = banSet.getString("reason");
|
||||
Ban ban = new Ban(name, uuid, ips, by, at, expires, reason);
|
||||
bans.add(ban);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to load ban list: " + e.getMessage());
|
||||
}
|
||||
|
||||
// Remove expired bans, repopulate ipBans and nameBans,
|
||||
updateViews();
|
||||
|
||||
FLog.info("Loaded " + ipBans.size() + " IP bans and " + nameBans.size() + " username bans.");
|
||||
|
||||
// Load unbannable usernames
|
||||
unbannableUsernames.clear();
|
||||
unbannableUsernames.addAll(ConfigEntry.FAMOUS_PLAYERS.getStringList());
|
||||
FLog.info("Loaded " + unbannableUsernames.size() + " unbannable usernames.");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
// This does nothing. This comment is here to prevent SonarLint from complaining.
|
||||
}
|
||||
|
||||
public Set<Ban> getAllBans()
|
||||
@ -194,8 +179,7 @@ public class BanManager extends FreedomService
|
||||
if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null)
|
||||
{
|
||||
removeBan(ban);
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
|
||||
for (String ip : ban.getIps())
|
||||
@ -210,8 +194,16 @@ public class BanManager extends FreedomService
|
||||
|
||||
if (bans.add(ban))
|
||||
{
|
||||
plugin.sql.addBan(ban);
|
||||
plugin.sql.addBan(ban).whenComplete((result, ex) ->
|
||||
{
|
||||
if (ex != null)
|
||||
{
|
||||
FLog.severe(ex.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
updateViews();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@ -220,8 +212,16 @@ public class BanManager extends FreedomService
|
||||
{
|
||||
if (bans.remove(ban))
|
||||
{
|
||||
plugin.sql.removeBan(ban);
|
||||
plugin.sql.removeBan(ban).whenComplete((result, ex) ->
|
||||
{
|
||||
if (ex != null)
|
||||
{
|
||||
FLog.severe(ex.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
updateViews();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@ -231,7 +231,13 @@ public class BanManager extends FreedomService
|
||||
int size = bans.size();
|
||||
bans.clear();
|
||||
updateViews();
|
||||
plugin.sql.truncate("bans");
|
||||
plugin.sql.truncate("bans").whenComplete((result, ex) ->
|
||||
{
|
||||
if (ex != null)
|
||||
{
|
||||
FLog.severe(ex.getMessage());
|
||||
}
|
||||
});
|
||||
return size;
|
||||
}
|
||||
|
||||
@ -275,8 +281,7 @@ public class BanManager extends FreedomService
|
||||
if (ban != null)
|
||||
{
|
||||
removeBan(ban);
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
ban = getByIp(FUtil.getIp(player));
|
||||
if (ban != null)
|
||||
@ -294,7 +299,13 @@ public class BanManager extends FreedomService
|
||||
if (ban.isExpired())
|
||||
{
|
||||
bans.remove(ban);
|
||||
plugin.sql.removeBan(ban);
|
||||
plugin.sql.removeBan(ban).whenComplete((result, ex) ->
|
||||
{
|
||||
if (ex != null)
|
||||
{
|
||||
FLog.severe(ex.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,14 @@
|
||||
package me.totalfreedom.totalfreedommod.banning;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import me.totalfreedom.totalfreedommod.config.IConfig;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
public class IndefiniteBan implements IConfig
|
||||
@ -13,15 +17,13 @@ public class IndefiniteBan implements IConfig
|
||||
private String username = null;
|
||||
private UUID uuid = null;
|
||||
private String reason = null;
|
||||
|
||||
public IndefiniteBan()
|
||||
{
|
||||
}
|
||||
private Date expiry = null;
|
||||
|
||||
@Override
|
||||
public void loadFrom(ConfigurationSection cs)
|
||||
{
|
||||
this.username = cs.getName();
|
||||
|
||||
try
|
||||
{
|
||||
String strUUID = cs.getString("uuid", null);
|
||||
@ -35,9 +37,20 @@ public class IndefiniteBan implements IConfig
|
||||
{
|
||||
FLog.warning("Failed to load indefinite banned UUID for " + this.username + ". Make sure the UUID is in the correct format with dashes.");
|
||||
}
|
||||
|
||||
this.ips.clear();
|
||||
this.ips.addAll(cs.getStringList("ips"));
|
||||
this.reason = cs.getString("reason", null);
|
||||
|
||||
String date = cs.getString("expiry", null);
|
||||
try
|
||||
{
|
||||
this.expiry = date != null ? new SimpleDateFormat("yyyy-MM-dd").parse(date) : null;
|
||||
}
|
||||
catch (ParseException ex)
|
||||
{
|
||||
FLog.warning("Failed to load indefinite banned expiry for " + this.username + ". Make sure the expiry is in the correct format (yyyy-MM-dd).");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -86,4 +99,24 @@ public class IndefiniteBan implements IConfig
|
||||
{
|
||||
this.reason = reason;
|
||||
}
|
||||
|
||||
public Date getExpiry()
|
||||
{
|
||||
return expiry;
|
||||
}
|
||||
|
||||
public void setExpiry(Date date)
|
||||
{
|
||||
this.expiry = date;
|
||||
}
|
||||
|
||||
public boolean hasExpiry()
|
||||
{
|
||||
return this.expiry != null;
|
||||
}
|
||||
|
||||
public boolean isExpired()
|
||||
{
|
||||
return hasExpiry() && expiry.before(new Date(FUtil.getUnixTime()));
|
||||
}
|
||||
}
|
@ -2,6 +2,8 @@ package me.totalfreedom.totalfreedommod.banning;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Sets;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
@ -19,30 +21,24 @@ public class IndefiniteBanList extends FreedomService
|
||||
{
|
||||
|
||||
public static final String CONFIG_FILENAME = "indefinitebans.yml";
|
||||
|
||||
private YamlConfig config;
|
||||
|
||||
private final Set<IndefiniteBan> indefBans = Sets.newHashSet();
|
||||
|
||||
|
||||
private int nameBanCount = 0;
|
||||
|
||||
|
||||
private int uuidBanCount = 0;
|
||||
|
||||
|
||||
private int ipBanCount = 0;
|
||||
|
||||
public static String getConfigFilename()
|
||||
{
|
||||
return CONFIG_FILENAME;
|
||||
}
|
||||
private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy, zzzz");
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
indefBans.clear();
|
||||
|
||||
final YamlConfig config = new YamlConfig(plugin, CONFIG_FILENAME, true);
|
||||
config = new YamlConfig(plugin, CONFIG_FILENAME, true);
|
||||
config.load();
|
||||
|
||||
for (String name : config.getKeys(false))
|
||||
@ -64,10 +60,18 @@ public class IndefiniteBanList extends FreedomService
|
||||
continue;
|
||||
}
|
||||
|
||||
if (indefBan.isExpired())
|
||||
{
|
||||
FLog.info("Removing " + name + " from indefinite ban list as the entry has expired!");
|
||||
config.set(name, null);
|
||||
continue;
|
||||
}
|
||||
|
||||
indefBans.add(indefBan);
|
||||
}
|
||||
|
||||
updateCount();
|
||||
config.save();
|
||||
|
||||
FLog.info("Loaded " + nameBanCount + " indefinite name bans, " + uuidBanCount + " UUID bans, and " + ipBanCount + " ip bans");
|
||||
}
|
||||
@ -75,6 +79,7 @@ public class IndefiniteBanList extends FreedomService
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
// This does nothing. This comment is here to prevent SonarLint from complaining.
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
@ -109,14 +114,34 @@ public class IndefiniteBanList extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
onPlayerLoginSplitWorkToReduceComplexity(event, ban, bannedBy);
|
||||
}
|
||||
|
||||
private void onPlayerLoginSplitWorkToReduceComplexity(PlayerLoginEvent event, IndefiniteBan ban, String bannedBy) {
|
||||
if (ban != null)
|
||||
{
|
||||
String kickMessage = ChatColor.RED + "Your " + bannedBy + " is indefinitely banned from this server.";
|
||||
if (ban.isExpired())
|
||||
{
|
||||
config.set(ban.getUsername(), null);
|
||||
config.save();
|
||||
return;
|
||||
}
|
||||
|
||||
String kickMessage = ChatColor.RED + "Your " + bannedBy + " is "
|
||||
+ (ban.hasExpiry() ? "" : "indefinitely ")
|
||||
+ "banned from this server.";
|
||||
String reason = ban.getReason();
|
||||
if (!Strings.isNullOrEmpty(reason))
|
||||
{
|
||||
kickMessage += "\nReason: " + ChatColor.GOLD + reason;
|
||||
}
|
||||
|
||||
Date expiry = ban.getExpiry();
|
||||
if (expiry != null)
|
||||
{
|
||||
kickMessage += ChatColor.RED + "\nExpiry: " + ChatColor.GOLD + dateFormat.format(expiry);
|
||||
}
|
||||
|
||||
String appealURL = ConfigEntry.SERVER_INDEFBAN_URL.getString();
|
||||
if (!Strings.isNullOrEmpty(appealURL))
|
||||
{
|
||||
@ -125,7 +150,6 @@ public class IndefiniteBanList extends FreedomService
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, kickMessage);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateCount()
|
||||
{
|
||||
nameBanCount = 0;
|
@ -1,14 +1,10 @@
|
||||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Banner;
|
||||
import org.bukkit.block.Skull;
|
||||
import org.bukkit.block.banner.Pattern;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@ -30,6 +26,7 @@ public class BlockBlocker extends FreedomService
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
// TODO: Remove deprecated method. Complexity is also O(35) which is very bad.
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockPlace(BlockPlaceEvent event)
|
||||
{
|
||||
@ -71,7 +68,7 @@ public class BlockBlocker extends FreedomService
|
||||
}
|
||||
case STRUCTURE_BLOCK:
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_STRUCTURE_BLOCKS.getBoolean())
|
||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
||||
{
|
||||
player.sendMessage(ChatColor.GRAY + "Structure blocks are disabled.");
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
@ -81,7 +78,7 @@ public class BlockBlocker extends FreedomService
|
||||
}
|
||||
case JIGSAW:
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_JIGSAWS.getBoolean())
|
||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
||||
{
|
||||
player.sendMessage(ChatColor.GRAY + "Jigsaws are disabled.");
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
@ -89,6 +86,16 @@ public class BlockBlocker extends FreedomService
|
||||
}
|
||||
break;
|
||||
}
|
||||
case REPEATING_COMMAND_BLOCK:
|
||||
case CHAIN_COMMAND_BLOCK:
|
||||
case COMMAND_BLOCK:
|
||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
||||
{
|
||||
player.sendMessage(ChatColor.GRAY + "Command blocks are disabled.");
|
||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||
event.setCancelled(true);
|
||||
}
|
||||
break;
|
||||
case GRINDSTONE:
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_GRINDSTONES.getBoolean())
|
||||
@ -177,17 +184,5 @@ public class BlockBlocker extends FreedomService
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Groups.BANNERS.contains(event.getBlockPlaced().getType()))
|
||||
{
|
||||
Banner banner = (Banner)event.getBlockPlaced().getState();
|
||||
List<Pattern> patterns = banner.getPatterns();
|
||||
|
||||
if (patterns.size() >= 2)
|
||||
{
|
||||
banner.setPatterns(patterns.subList(0, 2));
|
||||
player.sendMessage(ChatColor.GRAY + "Your banner had too many patterns on it, so some were removed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -4,6 +4,8 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.scissors.event.block.MasterBlockFireEvent;
|
||||
import io.papermc.paper.event.player.PlayerSignCommandPreprocessEvent;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
@ -18,15 +20,7 @@ import org.bukkit.entity.FallingBlock;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.block.BlockBurnEvent;
|
||||
import org.bukkit.event.block.BlockDispenseEvent;
|
||||
import org.bukkit.event.block.BlockFromToEvent;
|
||||
import org.bukkit.event.block.BlockGrowEvent;
|
||||
import org.bukkit.event.block.BlockIgniteEvent;
|
||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||
import org.bukkit.event.block.LeavesDecayEvent;
|
||||
import org.bukkit.event.block.*;
|
||||
import org.bukkit.event.entity.EntityCombustEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.entity.EntityDeathEvent;
|
||||
@ -115,6 +109,28 @@ public class EventBlocker extends FreedomService
|
||||
event.setRadius(ConfigEntry.EXPLOSIVE_RADIUS.getDouble().floatValue());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockExplode(BlockExplodeEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
event.setYield(ConfigEntry.EXPLOSIVE_RADIUS.getDouble().floatValue());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onMasterBlockFire(MasterBlockFireEvent event)
|
||||
{
|
||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
event.getAt().getBlock().setType(Material.CAKE);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onEntityCombust(EntityCombustEvent event)
|
||||
{
|
||||
@ -146,15 +162,12 @@ public class EventBlocker extends FreedomService
|
||||
if (ConfigEntry.ENABLE_PET_PROTECT.getBoolean())
|
||||
{
|
||||
Entity entity = event.getEntity();
|
||||
if (entity instanceof Tameable)
|
||||
{
|
||||
if (((Tameable)entity).isTamed())
|
||||
if (entity instanceof Tameable tameable && tameable.isTamed())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event)
|
||||
@ -265,4 +278,10 @@ public class EventBlocker extends FreedomService
|
||||
FUtil.fixCommandVoid(event.getEntity());
|
||||
event.setDeathMessage(event.getDeathMessage());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onSignInteract(PlayerSignCommandPreprocessEvent event)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
@ -5,6 +5,8 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@ -64,24 +66,42 @@ public class InteractBlocker extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Current cognitive complexity is O(24). This is too high.
|
||||
private void handleRightClick(PlayerInteractEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
final Block clickedBlock = event.getClickedBlock();
|
||||
|
||||
if (event.getClickedBlock() != null)
|
||||
{
|
||||
if (event.getClickedBlock().getType().equals(Material.STRUCTURE_BLOCK) || event.getClickedBlock().getType().equals(Material.JIGSAW) || event.getClickedBlock().getType().equals(Material.RESPAWN_ANCHOR))
|
||||
if (clickedBlock != null && clickedBlock.getType() == Material.RESPAWN_ANCHOR && !ConfigEntry.ALLOW_RESPAWN_ANCHORS.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
event.getPlayer().closeInventory();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (Groups.SPAWN_EGGS.contains(event.getMaterial()))
|
||||
{
|
||||
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||
player.sendMessage(ChatColor.GRAY + "Spawn eggs are currently disabled.");
|
||||
event.setCancelled(true);
|
||||
EntityType eggType = null;
|
||||
try
|
||||
{
|
||||
Material mat = event.getMaterial();
|
||||
if (mat == Material.MOOSHROOM_SPAWN_EGG)
|
||||
{
|
||||
eggType = EntityType.MUSHROOM_COW;
|
||||
}
|
||||
else
|
||||
{
|
||||
eggType = EntityType.valueOf(mat.name().substring(0, mat.name().length() - 10));
|
||||
}
|
||||
}
|
||||
catch (IllegalArgumentException ignored)
|
||||
{
|
||||
//
|
||||
}
|
||||
if (eggType != null && clickedBlock != null)
|
||||
{
|
||||
clickedBlock.getWorld().spawnEntity(clickedBlock.getLocation().add(event.getBlockFace().getDirection()).add(0.5, 0.5, 0.5), eggType);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -152,6 +172,11 @@ public class InteractBlocker extends FreedomService
|
||||
}
|
||||
case WRITTEN_BOOK:
|
||||
{
|
||||
if (ConfigEntry.ALLOW_BOOKS.getBoolean())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||
player.sendMessage(ChatColor.GRAY + "Books are currently disabled.");
|
||||
event.setCancelled(true);
|
@ -54,6 +54,7 @@ public class MobBlocker extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Complexity for this method is too high [O(23)]. This needs to be fixed.
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onCreatureSpawn(CreatureSpawnEvent event)
|
||||
{
|
@ -24,6 +24,7 @@ public class PVPBlocker extends FreedomService
|
||||
{
|
||||
}
|
||||
|
||||
// TODO: Complexity is O(26). This needs to be reduced.
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onEntityDamageByEntity(EntityDamageByEntityEvent event)
|
||||
{
|
||||
@ -70,7 +71,7 @@ public class PVPBlocker extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
if (player != null & !plugin.al.isAdmin(player))
|
||||
if (player != null && !plugin.al.isAdmin(player))
|
||||
{
|
||||
if (player.getGameMode() == GameMode.CREATIVE)
|
||||
{
|
@ -24,30 +24,12 @@ import org.bukkit.plugin.SimplePluginManager;
|
||||
|
||||
public class CommandBlocker extends FreedomService
|
||||
{
|
||||
|
||||
private final Pattern whitespacePattern = Pattern.compile("^/?( +)(.*)?");
|
||||
private final Pattern flagPattern = Pattern.compile("(:([0-9]){5,})");
|
||||
//
|
||||
private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap();
|
||||
private final List<String> unknownCommands = Lists.newArrayList();
|
||||
|
||||
public static CommandMap getCommandMap()
|
||||
{
|
||||
try
|
||||
{
|
||||
SimplePluginManager simplePluginManager = (SimplePluginManager)Bukkit.getServer().getPluginManager();
|
||||
|
||||
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
|
||||
commandMapField.setAccessible(true);
|
||||
|
||||
return (SimpleCommandMap)commandMapField.get(simplePluginManager);
|
||||
}
|
||||
catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e)
|
||||
{
|
||||
FLog.severe("Failed to get command map field (" + e.getMessage() + ")");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
@ -60,12 +42,12 @@ public class CommandBlocker extends FreedomService
|
||||
entryList.clear();
|
||||
}
|
||||
|
||||
public void load()
|
||||
public void load() // TODO: Complexity is 21. Need to fix this.
|
||||
{
|
||||
entryList.clear();
|
||||
unknownCommands.clear();
|
||||
|
||||
final CommandMap commandMap = getCommandMap();
|
||||
final CommandMap commandMap = Bukkit.getCommandMap();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<String> blockedCommands = (List<String>)ConfigEntry.BLOCKED_COMMANDS.getList();
|
||||
@ -147,6 +129,7 @@ public class CommandBlocker extends FreedomService
|
||||
return isCommandBlocked(command, sender, false);
|
||||
}
|
||||
|
||||
// TODO: Complexity is 22. Need to fix this. Complexity can be no more than O(15).
|
||||
public boolean isCommandBlocked(String command, CommandSender sender, boolean doAction)
|
||||
{
|
||||
if (command == null || command.isEmpty())
|
||||
@ -156,6 +139,14 @@ public class CommandBlocker extends FreedomService
|
||||
|
||||
// Format
|
||||
command = command.toLowerCase().trim();
|
||||
|
||||
// Whitespaces
|
||||
Matcher whitespaceMatcher = whitespacePattern.matcher(command);
|
||||
if (whitespaceMatcher.matches() && whitespaceMatcher.groupCount() == 2)
|
||||
{
|
||||
command = whitespaceMatcher.group(2);
|
||||
}
|
||||
|
||||
command = command.startsWith("/") ? command.substring(1) : command;
|
||||
|
||||
// Check for plugin specific commands
|
||||
@ -203,13 +194,10 @@ public class CommandBlocker extends FreedomService
|
||||
}
|
||||
|
||||
// Validate sub command
|
||||
if (entry.getSubCommand() != null)
|
||||
{
|
||||
if (subCommand == null || !subCommand.startsWith(entry.getSubCommand()))
|
||||
if (entry.getSubCommand() != null && (subCommand == null || !subCommand.startsWith(entry.getSubCommand())))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (entry.getRank().hasPermission(sender))
|
||||
{
|
@ -2,10 +2,10 @@ package me.totalfreedom.totalfreedommod.blocking.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.spigotmc.SpigotConfig;
|
||||
|
||||
public class CommandBlockerEntry
|
||||
{
|
||||
@ -45,7 +45,7 @@ public class CommandBlockerEntry
|
||||
}
|
||||
if (action == CommandBlockerAction.BLOCK_UNKNOWN)
|
||||
{
|
||||
sender.sendMessage(SpigotConfig.unknownCommandMessage);
|
||||
sender.sendMessage(Bukkit.spigot().getSpigotConfig().getString("messages.unknown-command"));
|
||||
return;
|
||||
}
|
||||
FUtil.playerMsg(sender, FUtil.colorize(message));
|
@ -2,7 +2,7 @@ package me.totalfreedom.totalfreedommod.blocking.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.rank.GroupProvider;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public enum CommandBlockerRank
|
||||
@ -25,7 +25,7 @@ public enum CommandBlockerRank
|
||||
Admin admin = TotalFreedomMod.getPlugin().al.getAdmin(sender);
|
||||
if (admin != null)
|
||||
{
|
||||
if (admin.getRank() == Rank.SENIOR_ADMIN)
|
||||
if (admin.getRank() == GroupProvider.SENIOR_ADMIN.getGroup())
|
||||
{
|
||||
return SENIOR_ADMIN;
|
||||
}
|
@ -1,8 +1,5 @@
|
||||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.bukkittelnet.BukkitTelnet;
|
||||
import me.totalfreedom.bukkittelnet.api.TelnetCommandEvent;
|
||||
import me.totalfreedom.bukkittelnet.api.TelnetPreLoginEvent;
|
||||
@ -10,13 +7,18 @@ import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent;
|
||||
import me.totalfreedom.bukkittelnet.session.ClientSession;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.rank.GroupProvider;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Deprecated
|
||||
public class BukkitTelnetBridge extends FreedomService
|
||||
{
|
||||
|
||||
@ -42,9 +44,9 @@ public class BukkitTelnetBridge extends FreedomService
|
||||
return;
|
||||
}
|
||||
|
||||
final Admin admin = plugin.al.getEntryByIpFuzzy(ip);
|
||||
final Admin admin = plugin.al.getEntryByIp(ip);
|
||||
|
||||
if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant())
|
||||
if (admin == null || !admin.isActive())
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -80,8 +82,8 @@ public class BukkitTelnetBridge extends FreedomService
|
||||
boolean active = admin.isActive();
|
||||
|
||||
isAdmin = active;
|
||||
isSeniorAdmin = active && admin.getRank() == Rank.SENIOR_ADMIN;
|
||||
isTelnetAdmin = active && (isSeniorAdmin || admin.getRank() == Rank.ADMIN);
|
||||
isSeniorAdmin = active && admin.getRank().equals(GroupProvider.SENIOR_ADMIN.getGroup());
|
||||
isTelnetAdmin = active && (isSeniorAdmin || admin.getRank().equals(GroupProvider.ADMIN.getGroup()));
|
||||
}
|
||||
|
||||
playerTags.put("tfm.admin.isAdmin", isAdmin);
|
||||
@ -90,9 +92,12 @@ public class BukkitTelnetBridge extends FreedomService
|
||||
|
||||
playerTags.put("tfm.playerdata.getTag", plugin.pl.getPlayer(player).getTag());
|
||||
|
||||
if (server.getPluginManager().isPluginEnabled("Essentials"))
|
||||
{
|
||||
playerTags.put("tfm.essentialsBridge.getNickname", plugin.esb.getNickname(player.getName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public BukkitTelnet getBukkitTelnetPlugin()
|
||||
{
|
||||
@ -101,15 +106,11 @@ public class BukkitTelnetBridge extends FreedomService
|
||||
try
|
||||
{
|
||||
final Plugin bukkitTelnet = server.getPluginManager().getPlugin("BukkitTelnet");
|
||||
if (bukkitTelnet != null)
|
||||
{
|
||||
if (bukkitTelnet instanceof BukkitTelnet)
|
||||
{
|
||||
bukkitTelnetPlugin = (BukkitTelnet) bukkitTelnet;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
} catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
@ -159,8 +160,7 @@ public class BukkitTelnetBridge extends FreedomService
|
||||
{
|
||||
telnet.appender.removeSession(session);
|
||||
session.syncTerminateSession();
|
||||
}
|
||||
catch (Exception ex)
|
||||
} catch (Exception ex)
|
||||
{
|
||||
FLog.severe("Error removing single telnet session: " + ex.getMessage());
|
||||
}
|
||||
@ -168,8 +168,7 @@ public class BukkitTelnetBridge extends FreedomService
|
||||
|
||||
FLog.info(sessionsToRemove.size() + " telnet session(s) removed.");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
} catch (Exception ex)
|
||||
{
|
||||
FLog.severe("Error removing telnet sessions: " + ex.getMessage());
|
||||
}
|
@ -0,0 +1,339 @@
|
||||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.coreprotect.CoreProtect;
|
||||
import net.coreprotect.CoreProtectAPI;
|
||||
import net.coreprotect.utility.Util;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class CoreProtectBridge extends FreedomService
|
||||
{
|
||||
//-- Block Inspector --//
|
||||
private static final Component name = Component.text("Block Inspector").color(TextColor.color(0x30ade4));
|
||||
private static final Component header = Component.text("---- ").append(name)
|
||||
.append(Component.text(" ---- ")).colorIfAbsent(NamedTextColor.WHITE);
|
||||
private static final Component prefix = name.append(Component.text(" - ").color(NamedTextColor.WHITE))
|
||||
.colorIfAbsent(NamedTextColor.WHITE);
|
||||
//--
|
||||
private final HashMap<UUID, Long> cooldownMap = new HashMap<>();
|
||||
private HashMap<UUID, FUtil.PaginationList<CoreProtectAPI.ParseResult>> historyMap;
|
||||
|
||||
//---------------------//
|
||||
private CoreProtectAPI coreProtectAPI = null;
|
||||
|
||||
public static Long getSecondsLeft(long prevTime, int timeAdd)
|
||||
{
|
||||
return prevTime / 1000L + timeAdd - System.currentTimeMillis() / 1000L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
if (isEnabled())
|
||||
{
|
||||
historyMap = new HashMap<>();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public CoreProtect getCoreProtect()
|
||||
{
|
||||
CoreProtect coreProtect = null;
|
||||
try
|
||||
{
|
||||
final Plugin coreProtectPlugin = server.getPluginManager().getPlugin("CoreProtect");
|
||||
assert coreProtectPlugin != null;
|
||||
if (coreProtectPlugin instanceof CoreProtect)
|
||||
{
|
||||
coreProtect = (CoreProtect)coreProtectPlugin;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
return coreProtect;
|
||||
}
|
||||
|
||||
public CoreProtectAPI getCoreProtectAPI()
|
||||
{
|
||||
if (coreProtectAPI == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
final CoreProtect coreProtect = getCoreProtect();
|
||||
|
||||
coreProtectAPI = coreProtect.getAPI();
|
||||
|
||||
// Check if the plugin or api is not enabled, if so, return null
|
||||
if (!coreProtect.isEnabled() || !coreProtectAPI.isEnabled())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
return coreProtectAPI;
|
||||
}
|
||||
|
||||
public boolean isEnabled()
|
||||
{
|
||||
if (!server.getPluginManager().isPluginEnabled("CoreProtect"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final CoreProtect coreProtect = getCoreProtect();
|
||||
|
||||
return coreProtect != null && coreProtect.isEnabled();
|
||||
}
|
||||
|
||||
// Rollback the specified player's edits that were in the last 24 hours.
|
||||
public void rollback(final String name)
|
||||
{
|
||||
if (!isEnabled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
||||
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
coreProtect.performRollback(86400, Collections.singletonList(name), null, null, null, null, 0, null);
|
||||
}
|
||||
}.runTaskAsynchronously(plugin);
|
||||
}
|
||||
|
||||
// Reverts a rollback for the specified player's edits that were in the last 24 hours.
|
||||
public void restore(final String name)
|
||||
{
|
||||
if (!isEnabled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
||||
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
coreProtect.performRestore(86400, Collections.singletonList(name), null, null, null, null, 0, null);
|
||||
}
|
||||
}.runTaskAsynchronously(plugin);
|
||||
}
|
||||
|
||||
public boolean hasHistory(Player player)
|
||||
{
|
||||
return historyMap.containsKey(player.getUniqueId());
|
||||
}
|
||||
|
||||
public FUtil.PaginationList<CoreProtectAPI.ParseResult> getHistoryForPlayer(Player player)
|
||||
{
|
||||
return historyMap.get(player.getUniqueId());
|
||||
}
|
||||
|
||||
// TODO: Complexity is O(19). This should be reduced.
|
||||
public void showPageToPlayer(Player player, FUtil.PaginationList<CoreProtectAPI.ParseResult> results, int pageNum)
|
||||
{
|
||||
if (player == null || !player.isOnline())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
List<CoreProtectAPI.ParseResult> page = results.getPage(pageNum);
|
||||
|
||||
if (page == null || page.isEmpty())
|
||||
{
|
||||
player.sendMessage(prefix.append(Component.text("No results were found.", NamedTextColor.WHITE)));
|
||||
}
|
||||
else
|
||||
{
|
||||
// This shouldn't change at all in any of the other entries, so this should be safe
|
||||
Component location = Component.text(String.format("(%s, %s, %s)", results.get(0).getX(),
|
||||
results.get(0).getY(), results.get(0).getZ()));
|
||||
final long time = System.currentTimeMillis() / 1000;
|
||||
|
||||
player.sendMessage(header.append(location.color(NamedTextColor.GRAY).decorate(TextDecoration.ITALIC)));
|
||||
page.forEach(entry ->
|
||||
{
|
||||
TextComponent.Builder line = Component.text();
|
||||
|
||||
// Time
|
||||
line.append(Component.text(Util.getTimeSince(entry.getTime(), time, false))
|
||||
.color(NamedTextColor.GRAY));
|
||||
|
||||
// Action
|
||||
Component action = Component.text(" interacted with ");
|
||||
Component symbol = Component.text(" - ", NamedTextColor.WHITE);
|
||||
switch (entry.getActionId())
|
||||
{
|
||||
case 0 ->
|
||||
{
|
||||
action = Component.text(" broke ");
|
||||
symbol = Component.text(" - ", NamedTextColor.RED);
|
||||
}
|
||||
case 1 ->
|
||||
{
|
||||
action = Component.text(" placed ");
|
||||
symbol = Component.text(" + ", NamedTextColor.GREEN);
|
||||
}
|
||||
case 2 -> action = Component.text(" clicked ");
|
||||
default ->
|
||||
{
|
||||
// Do nothing (shuts Codacy up)
|
||||
}
|
||||
}
|
||||
// Symbol, player, action, block
|
||||
line.append(symbol).append(Component.text(entry.getPlayer()).color(TextColor.color(0x30ade4)))
|
||||
.append(action.color(NamedTextColor.WHITE)).append(
|
||||
Component.text(entry.getBlockData().getMaterial().name().toLowerCase())
|
||||
.color(TextColor.color(0x30ade4)));
|
||||
|
||||
// Rolled back?
|
||||
if (entry.isRolledBack())
|
||||
{
|
||||
line.decorate(TextDecoration.STRIKETHROUGH);
|
||||
}
|
||||
|
||||
player.sendMessage(line.append(Component.text(".", NamedTextColor.WHITE)).build());
|
||||
});
|
||||
|
||||
if (results.getPageCount() > 1)
|
||||
{
|
||||
player.sendMessage(Component.text("-----", NamedTextColor.WHITE));
|
||||
|
||||
// Page indicator
|
||||
TextComponent.Builder indicator = Component.text();
|
||||
|
||||
// <-
|
||||
if (pageNum > 1)
|
||||
{
|
||||
indicator.append(Component.text("◀ ", NamedTextColor.WHITE).clickEvent(
|
||||
ClickEvent.runCommand("/ins history " + (pageNum - 1))));
|
||||
}
|
||||
|
||||
// Page <current>/<total>
|
||||
indicator.append(Component.text("Page ", TextColor.color(0x30ade4)).append(Component.text(pageNum + "/"
|
||||
+ results.getPageCount(), NamedTextColor.WHITE)));
|
||||
|
||||
// ->
|
||||
if (pageNum < results.getPageCount())
|
||||
{
|
||||
indicator.append(Component.text(" ▶", NamedTextColor.WHITE).clickEvent(
|
||||
ClickEvent.runCommand("/ins history " + (pageNum + 1))));
|
||||
}
|
||||
|
||||
// | Use /ins history <page> for advanced navigation
|
||||
indicator.append(Component.text(" | ", NamedTextColor.GRAY).append(Component.text("Use ", NamedTextColor.WHITE)
|
||||
.append(Component.text("/ins history <page>", TextColor.color(0x30ade4))
|
||||
.clickEvent(ClickEvent.suggestCommand("/ins history ")))
|
||||
.append(Component.text(" for advanced navigation", NamedTextColor.WHITE))));
|
||||
|
||||
player.sendMessage(indicator.build());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public CompletableFuture<FUtil.PaginationList<CoreProtectAPI.ParseResult>> lookupForPlayer(Block block, Player player)
|
||||
{
|
||||
cooldownMap.put(player.getUniqueId(), System.currentTimeMillis());
|
||||
CoreProtectAPI api = getCoreProtectAPI();
|
||||
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
{
|
||||
historyMap.remove(player.getUniqueId());
|
||||
FUtil.PaginationList<CoreProtectAPI.ParseResult> pages = new FUtil.PaginationList<>(10);
|
||||
api.blockLookup(block, -1).forEach(stringArray -> pages.add(api.parseResult(stringArray)));
|
||||
historyMap.put(player.getUniqueId(), pages);
|
||||
return pages;
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onInteract(PlayerInteractEvent event)
|
||||
{
|
||||
// The inspector only works if we have CoreProtect installed
|
||||
if (!isEnabled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if ((event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||
&& plugin.pl.getData(player.getUniqueId()).hasInspection())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
Block block = event.getClickedBlock();
|
||||
Optional<Long> cooldown = Optional.ofNullable(cooldownMap.get(player.getUniqueId()));
|
||||
|
||||
if (cooldown.isPresent() && getSecondsLeft(cooldown.get(), 3) > 0L)
|
||||
{
|
||||
player.sendMessage(prefix.append(Component.text("You need to wait ")
|
||||
.append(Component.text(getSecondsLeft(cooldown.get(), 3)))
|
||||
.append(Component.text(" seconds before you can make another query."))
|
||||
.color(NamedTextColor.WHITE)));
|
||||
return;
|
||||
}
|
||||
|
||||
// Time to do a look-up.
|
||||
if (block != null)
|
||||
{
|
||||
/* This is a hack to make it so that when you right-click, the coordinates that get used depend on
|
||||
* what's in your hand. Non-blocks use the block you clicked directly, but blocks use wherever the
|
||||
* block was supposed to be placed. */
|
||||
ItemStack hand = player.getInventory().getItemInMainHand();
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && hand.getType().isBlock() && hand.getType() != Material.AIR)
|
||||
{
|
||||
block = block.getRelative(event.getBlockFace()).getState().getBlock();
|
||||
}
|
||||
|
||||
lookupForPlayer(block, player).thenAccept(results ->
|
||||
{
|
||||
if (results.isEmpty())
|
||||
{
|
||||
player.sendMessage(prefix.append(Component.text("No results were found.").color(NamedTextColor.WHITE)));
|
||||
}
|
||||
else
|
||||
{
|
||||
showPageToPlayer(player, results, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -4,7 +4,7 @@ import com.earth2me.essentials.Essentials;
|
||||
import com.earth2me.essentials.User;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.rank.DisplayableGroup;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
@ -28,11 +28,13 @@ public class EssentialsBridge extends FreedomService
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
// This is completely useless, but it's here to make sure the service is loaded.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
essentialsPlugin = null;
|
||||
}
|
||||
|
||||
public Essentials getEssentialsPlugin()
|
||||
@ -43,9 +45,9 @@ public class EssentialsBridge extends FreedomService
|
||||
{
|
||||
final Plugin essentials = server.getPluginManager().getPlugin("Essentials");
|
||||
assert essentials != null;
|
||||
if (essentials instanceof Essentials)
|
||||
if (essentials instanceof Essentials e)
|
||||
{
|
||||
essentialsPlugin = (Essentials)essentials;
|
||||
essentialsPlugin = e;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -114,8 +116,7 @@ public class EssentialsBridge extends FreedomService
|
||||
User user = getEssentialsUser(username);
|
||||
if (user != null)
|
||||
{
|
||||
Long l = FUtil.getField(user, "lastActivity");
|
||||
return (l != null) ? l : 0L;
|
||||
return user.getLastOnlineActivity();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -155,9 +156,9 @@ public class EssentialsBridge extends FreedomService
|
||||
if (inventoryHolder instanceof HumanEntity)
|
||||
{
|
||||
Player invOwner = (Player)inventoryHolder;
|
||||
Rank recieverRank = plugin.rm.getRank(player);
|
||||
Rank playerRank = plugin.rm.getRank(invOwner);
|
||||
if (playerRank.ordinal() >= recieverRank.ordinal() || !invOwner.isOnline())
|
||||
DisplayableGroup recieverRank = plugin.rm.getRank(player);
|
||||
DisplayableGroup playerRank = plugin.rm.getRank(invOwner);
|
||||
if (playerRank.getWeight() >= recieverRank.getWeight() || !invOwner.isOnline())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
refreshPlayer = player;
|
||||
@ -205,13 +206,6 @@ public class EssentialsBridge extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Actually use this for something or remove it.
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerQuit(PlayerQuitEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
}
|
||||
|
||||
public boolean isEnabled()
|
||||
{
|
||||
final Essentials ess = getEssentialsPlugin();
|
@ -5,12 +5,13 @@ import me.libraryaddict.disguise.DisguiseAPI;
|
||||
import me.libraryaddict.disguise.LibsDisguises;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class LibsDisguisesBridge extends FreedomService
|
||||
{
|
||||
private LibsDisguises libsDisguisesPlugin = null;
|
||||
private static LibsDisguises libsDisguisesPlugin = null;
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
@ -22,22 +23,18 @@ public class LibsDisguisesBridge extends FreedomService
|
||||
{
|
||||
}
|
||||
|
||||
public LibsDisguises getLibsDisguisesPlugin()
|
||||
public static LibsDisguises getLibsDisguisesPlugin()
|
||||
{
|
||||
if (libsDisguisesPlugin == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Plugin libsDisguises = server.getPluginManager().getPlugin("LibsDisguises");
|
||||
if (libsDisguises != null)
|
||||
{
|
||||
final Plugin libsDisguises = Bukkit.getServer().getPluginManager().getPlugin("LibsDisguises");
|
||||
if (libsDisguises instanceof LibsDisguises)
|
||||
{
|
||||
libsDisguisesPlugin = (LibsDisguises) libsDisguises;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
} catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
@ -68,8 +65,7 @@ public class LibsDisguisesBridge extends FreedomService
|
||||
DisguiseAPI.undisguiseToAll(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
} catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
@ -80,7 +76,7 @@ public class LibsDisguisesBridge extends FreedomService
|
||||
return !BlockedDisguises.disabled;
|
||||
}
|
||||
|
||||
public void setDisguisesEnabled(boolean state)
|
||||
public static void setDisguisesEnabled(boolean state)
|
||||
{
|
||||
final LibsDisguises libsDisguises = getLibsDisguisesPlugin();
|
||||
|
@ -0,0 +1,59 @@
|
||||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.GroupProvider;
|
||||
import net.luckperms.api.LuckPerms;
|
||||
import net.luckperms.api.track.TrackManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.UnknownDependencyException;
|
||||
|
||||
public class LuckPermsBridge
|
||||
{
|
||||
private final LuckPerms luckPerms;
|
||||
|
||||
public LuckPermsBridge()
|
||||
{
|
||||
RegisteredServiceProvider<LuckPerms> provider = Bukkit.getServicesManager()
|
||||
.getRegistration(LuckPerms.class);
|
||||
|
||||
if (provider == null) throw new UnknownDependencyException("LuckPerms must be present!");
|
||||
|
||||
this.luckPerms = provider.getProvider();
|
||||
|
||||
setupTracks();
|
||||
}
|
||||
|
||||
public LuckPerms getAPI()
|
||||
{
|
||||
return luckPerms;
|
||||
}
|
||||
|
||||
public void setupTracks()
|
||||
{
|
||||
TrackManager trackManager = getAPI().getTrackManager();
|
||||
|
||||
if (!trackManager.isLoaded("fakeOp"))
|
||||
{
|
||||
trackManager.createAndLoadTrack("fakeOp").whenComplete((track, exception) ->
|
||||
{
|
||||
track.appendGroup(GroupProvider.NON_OP.getGroup().getLuckPermsGroup());
|
||||
track.appendGroup(GroupProvider.OP.getGroup().getLuckPermsGroup());
|
||||
});
|
||||
}
|
||||
|
||||
if (!trackManager.isLoaded("admin"))
|
||||
{
|
||||
trackManager.createAndLoadTrack("admin").whenComplete((track, exception) ->
|
||||
{
|
||||
track.appendGroup(GroupProvider.ADMIN.getGroup().getLuckPermsGroup());
|
||||
track.appendGroup(GroupProvider.SENIOR_ADMIN.getGroup().getLuckPermsGroup());
|
||||
});
|
||||
}
|
||||
|
||||
if (!trackManager.isLoaded("builder"))
|
||||
{
|
||||
trackManager.createAndLoadTrack("builder").whenComplete((track, exception) ->
|
||||
track.appendGroup(GroupProvider.MASTER_BUILDER.getGroup().getLuckPermsGroup()));
|
||||
}
|
||||
}
|
||||
}
|
@ -48,52 +48,6 @@ public class WorldEditBridge extends FreedomService
|
||||
return worldeditPlugin;
|
||||
}
|
||||
|
||||
public void undo(Player player, int count)
|
||||
{
|
||||
try
|
||||
{
|
||||
LocalSession session = getPlayerSession(player);
|
||||
if (session != null)
|
||||
{
|
||||
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||
if (bukkitPlayer != null)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
session.undo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void redo(Player player, int count)
|
||||
{
|
||||
try
|
||||
{
|
||||
LocalSession session = getPlayerSession(player);
|
||||
if (session != null)
|
||||
{
|
||||
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||
if (bukkitPlayer != null)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
session.redo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimit(Player player, int limit)
|
||||
{
|
||||
try
|
||||
@ -153,23 +107,4 @@ public class WorldEditBridge extends FreedomService
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private BukkitPlayer getBukkitPlayer(Player player)
|
||||
{
|
||||
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||
if (wep == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return wep.wrapPlayer(player);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -124,7 +124,7 @@ public class CageData
|
||||
this.location = location;
|
||||
this.outerMaterial = outer;
|
||||
this.innerMaterial = inner;
|
||||
input = null;
|
||||
input = null; // TODO: Remove static variable declaration in a non-static block.
|
||||
|
||||
buildHistory(location);
|
||||
regenerate();
|
||||
@ -141,7 +141,7 @@ public class CageData
|
||||
this.location = location;
|
||||
this.outerMaterial = outer;
|
||||
this.innerMaterial = inner;
|
||||
CageData.input = input;
|
||||
CageData.input = input; // TODO: Remove static variable declaration in a non-static block.
|
||||
|
||||
buildHistory(location);
|
||||
regenerate();
|
@ -1,13 +1,18 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.api.event.AdminChatEvent;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "adminchat", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Talk privately with other admins on the server.", usage = "/<command> [message]", aliases = "o,sc,ac,staffchat")
|
||||
public class Command_adminchat extends FreedomCommand
|
||||
{
|
||||
@ -19,15 +24,14 @@ public class Command_adminchat extends FreedomCommand
|
||||
{
|
||||
if (senderIsConsole)
|
||||
{
|
||||
msg("You must be in-game to toggle admin chat, it cannot be toggled via CONSOLE or Telnet.");
|
||||
msgNew("<red>You must be in-game to toggle admin chat, it cannot be toggled via CONSOLE or Telnet.");
|
||||
return true;
|
||||
}
|
||||
|
||||
FPlayer userinfo = plugin.pl.getPlayer(playerSender);
|
||||
userinfo.setAdminChat(!userinfo.inAdminChat());
|
||||
msg("Admin chat turned " + (userinfo.inAdminChat() ? "on" : "off") + ".");
|
||||
}
|
||||
else
|
||||
msgNew("Admin chat turned <status>.", Placeholder.unparsed("status", userinfo.inAdminChat() ? "on" : "off"));
|
||||
} else
|
||||
{
|
||||
plugin.cm.adminChat(sender, StringUtils.join(args, " "));
|
||||
}
|
@ -1,16 +1,17 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "admininfo", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Information on how to apply for admin.", usage = "/<command>", aliases = "si,ai,staffinfo")
|
||||
public class Command_admininfo extends FreedomCommand
|
||||
{
|
||||
@ -22,12 +23,13 @@ public class Command_admininfo extends FreedomCommand
|
||||
|
||||
if (adminInfo.isEmpty())
|
||||
{
|
||||
msg("The admin information section of the config.yml file has not been configured.", ChatColor.RED);
|
||||
msgNew("<red>The admin information section of the config.yml file has not been configured.");
|
||||
}
|
||||
else
|
||||
{
|
||||
msg(FUtil.colorize(StringUtils.join(adminInfo, "\n")));
|
||||
adminInfo.forEach(this::msgNew);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -3,14 +3,19 @@ package me.totalfreedom.totalfreedommod.command;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "adminmode", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Denies joining of operators and only allows admins to join.", usage = "/<command> [on | off]", aliases = "staffmode")
|
||||
public class Command_adminmode extends FreedomCommand
|
||||
{
|
||||
@ -33,13 +38,8 @@ public class Command_adminmode extends FreedomCommand
|
||||
{
|
||||
ConfigEntry.ADMIN_ONLY_MODE.setBoolean(true);
|
||||
FUtil.adminAction(sender.getName(), "Closing the server to non-admins", true);
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (!isAdmin(player))
|
||||
{
|
||||
player.kickPlayer("Server is now closed to non-admins.");
|
||||
}
|
||||
}
|
||||
server.getOnlinePlayers().stream().filter(player -> !isAdmin(player)).forEach(player ->
|
||||
player.kick(Component.text("The server is now closed to non-admins.")));
|
||||
return true;
|
||||
}
|
||||
|
@ -4,15 +4,20 @@ import io.papermc.lib.PaperLib;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.world.WorldTime;
|
||||
import me.totalfreedom.totalfreedommod.world.WorldWeather;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "adminworld", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Allows for admins to configure time, and weather of the AdminWorld, and allows for admins and ops to go to the AdminWorld.",
|
||||
usage = "/<command> [time <morning | noon | evening | night> | weather <off | rain | storm>]",
|
||||
aliases = "sw,aw,staffworld")
|
||||
@ -49,7 +54,7 @@ public class Command_adminworld extends FreedomCommand
|
||||
{
|
||||
switch (commandMode)
|
||||
{
|
||||
case TELEPORT:
|
||||
case TELEPORT ->
|
||||
{
|
||||
if (!(sender instanceof Player) || playerSender == null)
|
||||
{
|
||||
@ -60,24 +65,21 @@ public class Command_adminworld extends FreedomCommand
|
||||
try
|
||||
{
|
||||
adminWorld = plugin.wm.adminworld.getWorld();
|
||||
}
|
||||
catch (Exception ignored)
|
||||
} catch (Exception ignored)
|
||||
{
|
||||
}
|
||||
|
||||
if (adminWorld == null || playerSender.getWorld() == adminWorld)
|
||||
{
|
||||
msg("Going to the main world.");
|
||||
msgNew("Going to the main world.");
|
||||
PaperLib.teleportAsync(playerSender, server.getWorlds().get(0).getSpawnLocation());
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
msg("Going to the AdminWorld.");
|
||||
msgNew("Going to the AdminWorld.");
|
||||
plugin.wm.adminworld.sendToWorld(playerSender);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TIME:
|
||||
case TIME ->
|
||||
{
|
||||
assertCommandPerms(sender, playerSender);
|
||||
|
||||
@ -87,21 +89,18 @@ public class Command_adminworld extends FreedomCommand
|
||||
if (timeOfDay != null)
|
||||
{
|
||||
plugin.wm.adminworld.setTimeOfDay(timeOfDay);
|
||||
msg("AdminWorld time set to: " + timeOfDay.name());
|
||||
}
|
||||
else
|
||||
msgNew("AdminWorld time set to: <time>", Placeholder.unparsed("time", timeOfDay.name()));
|
||||
} else
|
||||
{
|
||||
msg("Invalid time of day. Can be: sunrise, noon, sunset, midnight");
|
||||
msgNew("<red>Invalid time of day. Can be: sunrise, noon, sunset, midnight");
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case WEATHER:
|
||||
case WEATHER ->
|
||||
{
|
||||
assertCommandPerms(sender, playerSender);
|
||||
|
||||
@ -111,21 +110,18 @@ public class Command_adminworld extends FreedomCommand
|
||||
if (weatherMode != null)
|
||||
{
|
||||
plugin.wm.adminworld.setWeatherMode(weatherMode);
|
||||
msg("AdminWorld weather set to: " + weatherMode.name());
|
||||
}
|
||||
else
|
||||
msgNew("AdminWorld weather set to <mode>.", Placeholder.unparsed("mode", weatherMode.name()));
|
||||
} else
|
||||
{
|
||||
msg("Invalid weather mode. Can be: off, rain, storm");
|
||||
msgNew("<red>Invalid weather mode. Can be: off, rain, storm");
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
default ->
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -137,7 +133,7 @@ public class Command_adminworld extends FreedomCommand
|
||||
{
|
||||
return noPerms();
|
||||
}
|
||||
msg(ex.getMessage());
|
||||
msgNew("<red>" + ex.getMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -147,7 +143,7 @@ public class Command_adminworld extends FreedomCommand
|
||||
// TODO: Redo this properly
|
||||
private void assertCommandPerms(CommandSender sender, Player playerSender) throws PermissionDeniedException
|
||||
{
|
||||
if (!(sender instanceof Player) || playerSender == null || !isAdmin(sender))
|
||||
if (!(sender instanceof Player) || playerSender == null || !sender.hasPermission("tfm.adminworld.manage"))
|
||||
{
|
||||
throw new PermissionDeniedException();
|
||||
}
|
@ -1,12 +1,15 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "announce", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Make an announcement anonymously to operators.", usage = "/<command> <message>")
|
||||
public class Command_announce extends FreedomCommand
|
||||
{
|
@ -1,11 +1,15 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "autoclear", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Toggle whether or not a player has their inventory automatically cleared when they join", usage = "/<command> <player>")
|
||||
public class Command_autoclear extends FreedomCommand
|
||||
{
|
||||
@ -29,7 +33,8 @@ public class Command_autoclear extends FreedomCommand
|
||||
plugin.lp.CLEAR_ON_JOIN.add(args[0]);
|
||||
}
|
||||
|
||||
msg(args[0] + " will " + (enabled ? "no longer" : "now") + " have their inventory cleared when they join.");
|
||||
msgNew("<player> will <status> have their inventory cleared when they join.",
|
||||
Placeholder.unparsed("player", args[0]), Placeholder.unparsed("status", enabled ? "no longer" : "now"));
|
||||
|
||||
return true;
|
||||
}
|
@ -1,11 +1,15 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "autotp", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Toggle whether or not a player is automatically teleported when they join", usage = "/<command> <player>")
|
||||
public class Command_autotp extends FreedomCommand
|
||||
{
|
||||
@ -29,8 +33,8 @@ public class Command_autotp extends FreedomCommand
|
||||
plugin.lp.TELEPORT_ON_JOIN.add(args[0]);
|
||||
}
|
||||
|
||||
msg(args[0] + " will " + (enabled ? "no longer" : "now") + " be automatically teleported when they join.");
|
||||
|
||||
msgNew("<player> will <status> be automatically teleported when they join.",
|
||||
Placeholder.unparsed("player", args[0]), Placeholder.unparsed("status", enabled ? "no longer" : "now"));
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,17 +1,17 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import com.earth2me.essentials.User;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.*;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
@ -19,7 +19,8 @@ import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true)
|
||||
@Intercept("ban")
|
||||
@CommandPermissions(permission = "ban", source = SourceType.BOTH, blockHostConsole = true)
|
||||
@CommandParameters(description = "Bans the specified player.", usage = "/<command> <username> [reason] [-nrb | -q]", aliases = "gtfo")
|
||||
public class Command_ban extends FreedomCommand
|
||||
{
|
||||
@ -60,28 +61,39 @@ public class Command_ban extends FreedomCommand
|
||||
}
|
||||
|
||||
final String username;
|
||||
final List<String> ips = new ArrayList<>();
|
||||
final String ip;
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
if (player == null)
|
||||
{
|
||||
final PlayerData entry = plugin.pl.getData(args[0]);
|
||||
|
||||
// Gets the IP using Essentials data if available
|
||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
||||
{
|
||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
||||
//
|
||||
username = essUser.getName();
|
||||
ip = essUser.getLastLoginAddress();
|
||||
}
|
||||
// Last resort - Getting the first result from the username itself
|
||||
else
|
||||
{
|
||||
PlayerData entry = plugin.pl.getData(args[0]);
|
||||
if (entry == null)
|
||||
{
|
||||
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
username = entry.getName();
|
||||
ips.addAll(entry.getIps());
|
||||
}
|
||||
else
|
||||
{
|
||||
final PlayerData entry = plugin.pl.getData(player);
|
||||
username = entry.getName();
|
||||
ip = entry.getIps().get(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
username = player.getName();
|
||||
//ips.addAll(entry.getIps());/
|
||||
ips.add(FUtil.getIp(player));
|
||||
ip = FUtil.getIp(player);
|
||||
|
||||
// Deop
|
||||
player.setOp(false);
|
||||
@ -107,7 +119,7 @@ public class Command_ban extends FreedomCommand
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Banned " + player.getName() + " quietly.");
|
||||
msgNew("Banned <player> quietly.", Placeholder.unparsed("player", player.getName()));
|
||||
}
|
||||
// Kill player
|
||||
player.setHealth(0.0);
|
||||
@ -126,7 +138,6 @@ public class Command_ban extends FreedomCommand
|
||||
|
||||
// Ban player
|
||||
Ban ban;
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
ban = Ban.forPlayer(player, sender, null, reason);
|
||||
@ -135,12 +146,8 @@ public class Command_ban extends FreedomCommand
|
||||
{
|
||||
ban = Ban.forPlayerName(username, sender, null, reason);
|
||||
}
|
||||
|
||||
for (String ip : ips)
|
||||
{
|
||||
ban.addIp(ip);
|
||||
ban.addIp(FUtil.getFuzzyIp(ip));
|
||||
}
|
||||
|
||||
plugin.bm.addBan(ban);
|
||||
|
||||
|
||||
@ -154,7 +161,9 @@ public class Command_ban extends FreedomCommand
|
||||
{
|
||||
bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason);
|
||||
}
|
||||
msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", "));
|
||||
msgNew("<name> has been banned and their IP is <ip>.",
|
||||
Placeholder.unparsed("name", username),
|
||||
Placeholder.unparsed("ip", ip));
|
||||
FUtil.adminAction(sender.getName(), bcast.toString(), true);
|
||||
}
|
||||
|
||||
@ -162,17 +171,13 @@ public class Command_ban extends FreedomCommand
|
||||
if (player != null)
|
||||
{
|
||||
player.kickPlayer(ban.bakeKickMessage());
|
||||
for (Player p : Bukkit.getOnlinePlayers())
|
||||
{
|
||||
if (FUtil.getIp(p).equals(FUtil.getIp(player)))
|
||||
{
|
||||
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
|
||||
}
|
||||
}
|
||||
|
||||
server.getOnlinePlayers().stream().filter(pl -> FUtil.getIp(pl).equalsIgnoreCase(ip)).forEach(pl ->
|
||||
player.kickPlayer(ban.bakeKickMessage()));
|
||||
}
|
||||
|
||||
// Log ban
|
||||
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, reason));
|
||||
plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.BAN, reason));
|
||||
|
||||
return true;
|
||||
}
|
@ -1,17 +1,17 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.*;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true)
|
||||
@Intercept("banip")
|
||||
@CommandPermissions(permission = "banip", source = SourceType.BOTH, blockHostConsole = true)
|
||||
@CommandParameters(description = "Bans the specified ip.", usage = "/<command> <ip> [reason] [-q]")
|
||||
public class Command_banip extends FreedomCommand
|
||||
{
|
||||
@ -32,13 +32,13 @@ public class Command_banip extends FreedomCommand
|
||||
|
||||
if (FUtil.isValidIPv4(ip))
|
||||
{
|
||||
msg(ip + " is not a valid IP address", ChatColor.RED);
|
||||
msgNew("<red><ip> is not a valid IP address.", Placeholder.unparsed("ip", ip));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (plugin.bm.getByIp(ip) != null)
|
||||
{
|
||||
msg("The IP " + ip + " is already banned", ChatColor.RED);
|
||||
msgNew("<red>The IP <ip> is already banned.", Placeholder.unparsed("ip", ip));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -61,20 +61,13 @@ public class Command_banip extends FreedomCommand
|
||||
plugin.bm.addBan(ban);
|
||||
|
||||
// Kick player and handle others on IP
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (FUtil.getIp(player).equals(ip))
|
||||
{
|
||||
player.kickPlayer(ban.bakeKickMessage());
|
||||
}
|
||||
server.getOnlinePlayers().stream().filter(player -> FUtil.getIp(player).equalsIgnoreCase(ip)).forEach(player ->
|
||||
player.kickPlayer(ban.bakeKickMessage()));
|
||||
|
||||
// Broadcasts the message
|
||||
if (!silent)
|
||||
{
|
||||
// Broadcast
|
||||
FLog.info(ChatColor.RED + sender.getName() + " - Banned the IP " + ip);
|
||||
String message = sender.getName() + " - Banned " + (plugin.al.isAdmin(player) ? "the IP " + ip : "an IP");
|
||||
msg(player, message, ChatColor.RED);
|
||||
}
|
||||
plugin.cm.broadcastSplit("<red><sender> - Banned the IP <ip>", "<red><sender> - Banned an IP", Placeholder.unparsed("ip", ip));
|
||||
}
|
||||
|
||||
return true;
|
@ -0,0 +1,45 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.*;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@Intercept("banlist")
|
||||
@CommandPermissions(permission = "banlist", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Shows all banned player names. Admins may optionally use 'purge' to clear the list.", usage = "/<command> [purge]")
|
||||
public class Command_banlist extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length > 0)
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("purge"))
|
||||
{
|
||||
checkPermission("tfm.banlist.purge");
|
||||
FUtil.adminAction(sender.getName(), "Purging the ban list", true);
|
||||
msgNew("<green>Purged <amount> player bans.", Placeholder.unparsed("amount", String.valueOf(plugin.bm.purge())));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
msgNew("<total> player bans (<usernames> usernames, <ips> IPs)",
|
||||
Placeholder.unparsed("total", String.valueOf(plugin.bm.getAllBans().size())),
|
||||
Placeholder.unparsed("usernames", String.valueOf(plugin.bm.getUsernameBans())),
|
||||
Placeholder.unparsed("ips", String.valueOf(plugin.bm.getIpBans().size())));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
return args.length == 1 && sender.hasPermission("tfm.banlist.purge") ? Collections.singletonList("purge") : Collections.emptyList();
|
||||
}
|
||||
}
|
@ -1,16 +1,19 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true)
|
||||
@CommandPermissions(permission = "banname", source = SourceType.BOTH, blockHostConsole = true)
|
||||
@CommandParameters(description = "Bans the specified name.", usage = "/<command> <name> [reason] [-q]")
|
||||
public class Command_banname extends FreedomCommand
|
||||
{
|
||||
@ -31,7 +34,7 @@ public class Command_banname extends FreedomCommand
|
||||
|
||||
if (plugin.bm.getByUsername(name) != null)
|
||||
{
|
||||
msg("The name " + name + " is already banned", ChatColor.RED);
|
||||
msgNew("<red>The name <name> is already banned.", Placeholder.unparsed("name", name));
|
||||
return true;
|
||||
}
|
||||
|
@ -3,14 +3,18 @@ package me.totalfreedom.totalfreedommod.command;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.SplittableRandom;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandPermissions(permission = "bird", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Spawns a random type of fish at your location.", usage = "/<command>")
|
||||
public class Command_bird extends FreedomCommand
|
||||
{
|
||||
@ -20,7 +24,7 @@ public class Command_bird extends FreedomCommand
|
||||
{
|
||||
Location location = playerSender.getTargetBlock(null, 15).getLocation().add(0, 1, 0);
|
||||
playerSender.getWorld().spawnEntity(location, getRandomFish());
|
||||
msg(":goodbird:");
|
||||
msgNew("<rainbow>:goodbird:");
|
||||
return true;
|
||||
}
|
||||
|
@ -1,16 +1,19 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "blockcmd", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Block all commands for everyone on the server, or a specific player.", usage = "/<command> <-a | purge | <player>>", aliases = "blockcommands,blockcommand,bc,bcmd")
|
||||
public class Command_blockcmd extends FreedomCommand
|
||||
{
|
||||
@ -36,7 +39,8 @@ public class Command_blockcmd extends FreedomCommand
|
||||
playerdata.setCommandsBlocked(false);
|
||||
}
|
||||
}
|
||||
msg("Unblocked commands for " + counter + " players.");
|
||||
|
||||
msgNew("Unblocked commands for <count> players.", Placeholder.unparsed("count", String.valueOf(counter)));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -53,10 +57,10 @@ public class Command_blockcmd extends FreedomCommand
|
||||
|
||||
counter += 1;
|
||||
plugin.pl.getPlayer(player).setCommandsBlocked(true);
|
||||
msg(player, "Your commands have been blocked by an admin.", ChatColor.RED);
|
||||
msgNew(player, "<red>Your commands have been blocked by an admin.");
|
||||
}
|
||||
|
||||
msg("Blocked commands for " + counter + " players.");
|
||||
msgNew("Blocked commands for <count> players.", Placeholder.unparsed("count", String.valueOf(counter)));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -64,13 +68,13 @@ public class Command_blockcmd extends FreedomCommand
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
msg(FreedomCommand.PLAYER_NOT_FOUND);
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isAdmin(player))
|
||||
{
|
||||
msg(player.getName() + " is an admin, and cannot have their commands blocked.");
|
||||
msgNew("<player> is an admin, and cannot have their commands blocked.", Placeholder.unparsed("player", player.getName()));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -79,13 +83,13 @@ public class Command_blockcmd extends FreedomCommand
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
|
||||
playerdata.setCommandsBlocked(true);
|
||||
msg("Blocked commands for " + player.getName() + ".");
|
||||
msgNew("Blocked commands for <player>.", Placeholder.unparsed("player", player.getName()));
|
||||
|
||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.BLOCKCMD, null));
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("That players commands are already blocked.", ChatColor.RED);
|
||||
msgNew("<red>That player's commands are already blocked.");
|
||||
}
|
||||
return true;
|
||||
}
|
@ -0,0 +1,117 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@CommandPermissions(permission = "blockedit", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Restricts/restores block modification abilities for everyone on the server or a certain player.", usage = "/<command> [<player> [reason] | list | purge | all]")
|
||||
public class Command_blockedit extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, String[] args, final boolean senderIsConsole)
|
||||
{
|
||||
if (args.length > 0)
|
||||
{
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "list" ->
|
||||
{
|
||||
List<? extends Player> list = server.getOnlinePlayers().stream().filter(player ->
|
||||
plugin.pl.getPlayer(player).isEditBlocked()).sorted().toList();
|
||||
|
||||
boolean plural = list.size() != 1;
|
||||
msgNew("There <grammar> <count> player<plural> online with restricted block modification abilities: <players>",
|
||||
Placeholder.unparsed("grammar", plural ? "are" : "is"),
|
||||
Placeholder.unparsed("count", String.valueOf(list.size())),
|
||||
Placeholder.unparsed("plural", plural ? "s" : ""),
|
||||
Placeholder.unparsed("colon", list.size() > 0 ? ":" : "."),
|
||||
Placeholder.unparsed("players", FUtil.listToString(list.stream().map(HumanEntity::getName).toList())));
|
||||
}
|
||||
case "purge" ->
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Restoring block modification abilities for all players", true);
|
||||
|
||||
List<? extends Player> list = server.getOnlinePlayers().stream().filter(player ->
|
||||
plugin.pl.getPlayer(player).isEditBlocked()).toList();
|
||||
|
||||
list.forEach(player ->
|
||||
{
|
||||
plugin.pl.getPlayer(player).setEditBlocked(false);
|
||||
msgNew(player, "<green>Your block modification abilities have been restored.");
|
||||
});
|
||||
|
||||
msgNew("Restored block modification abilities for <count> player<plural>.",
|
||||
Placeholder.unparsed("count", String.valueOf(list.size())),
|
||||
Placeholder.unparsed("plural", list.size() != 1 ? "s" : ""));
|
||||
}
|
||||
case "all", "-a" ->
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Restricting block modification abilities for all non-admins", true);
|
||||
|
||||
List<? extends Player> list = server.getOnlinePlayers().stream().filter(player ->
|
||||
!plugin.al.isAdmin(player)).toList();
|
||||
|
||||
list.forEach(player ->
|
||||
{
|
||||
plugin.pl.getPlayer(player).setEditBlocked(true);
|
||||
msgNew(player, "<red>Your block modification abilities have been restricted.");
|
||||
});
|
||||
|
||||
msgNew("Restricted block modification abilities for <count> player<plural>.",
|
||||
Placeholder.unparsed("count", String.valueOf(list.size())),
|
||||
Placeholder.unparsed("plural", list.size() != 1 ? "s" : ""));
|
||||
}
|
||||
default -> Optional.ofNullable(getPlayer(args[0])).ifPresentOrElse(player ->
|
||||
{
|
||||
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
|
||||
if (fPlayer.isEditBlocked())
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Restoring block modification abilities for " + player.getName(), true);
|
||||
fPlayer.setEditBlocked(false);
|
||||
msgNew("Restored block modification abilities for <player>.", Placeholder.unparsed("player", player.getName()));
|
||||
msgNew(player, "<green>Your block modification abilities have been restored.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (plugin.al.isAdmin(player))
|
||||
{
|
||||
msgNew("<red><player> is an admin, and as such cannot have their block modification abilities restricted.", Placeholder.unparsed("player", player.getName()));
|
||||
}
|
||||
else
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Restricting block modification abilities for " + player.getName(), true);
|
||||
fPlayer.setEditBlocked(true);
|
||||
msgNew("Restricted block modification abilities for <player>.", Placeholder.unparsed("player", player.getName()));
|
||||
msgNew(player, "<red>Your block modification abilities have been restricted.");
|
||||
|
||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player),
|
||||
sender.getName(), PunishmentType.BLOCKEDIT, null));
|
||||
}
|
||||
}
|
||||
|
||||
}, () -> msg(PLAYER_NOT_FOUND));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,115 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@CommandPermissions(permission = "blockpvp", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Toggle PVP mode for everyone or a certain player.", usage = "/<command> [<player> | list | purge | all]", aliases = "pvpblock,pvpmode")
|
||||
public class Command_blockpvp extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, String[] args, final boolean senderIsConsole)
|
||||
{
|
||||
if (args.length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
// List
|
||||
case "list" ->
|
||||
{
|
||||
List<String> restricted = server.getOnlinePlayers().stream().filter(player ->
|
||||
plugin.pl.getPlayer(player).isPvpBlocked()).map(Player::getName).toList();
|
||||
|
||||
if (restricted.isEmpty())
|
||||
{
|
||||
msgNew("Nobody currently has their PVP abilities restricted.");
|
||||
}
|
||||
else
|
||||
{
|
||||
msgNew("PVP abilities are restricted for these player(s): <players>",
|
||||
Placeholder.unparsed("players", FUtil.listToString(restricted)));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Purge
|
||||
case "purge" ->
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Restoring PVP abilities for all players", true);
|
||||
List<? extends Player> affected = server.getOnlinePlayers().stream().filter(player -> plugin.pl.getPlayer(player).isPvpBlocked()).toList();
|
||||
affected.forEach(player ->
|
||||
{
|
||||
msgNew(player, "<green>Your PVP abilities have been restored.");
|
||||
plugin.pl.getPlayer(player).setPvpBlocked(false);
|
||||
});
|
||||
msgNew("Restored PVP abilities for <count> players.", Placeholder.unparsed("count", String.valueOf(affected.size())));
|
||||
}
|
||||
|
||||
// All
|
||||
case "all" ->
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Restricting PVP capabilities for all non-admins", true);
|
||||
List<? extends Player> affected = server.getOnlinePlayers().stream().filter(player -> !plugin.al.isAdmin(player)).toList();
|
||||
affected.forEach(player ->
|
||||
{
|
||||
msgNew(player, "<red>Your PVP abilities have been restricted.");
|
||||
plugin.pl.getPlayer(player).setPvpBlocked(true);
|
||||
});
|
||||
msgNew("Restricted PVP abilities for <count> players.", Placeholder.unparsed("count", String.valueOf(affected.size())));
|
||||
}
|
||||
|
||||
// Specific players
|
||||
default ->
|
||||
{
|
||||
final Player p = getPlayer(args[0]);
|
||||
if (p == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
final FPlayer pd = plugin.pl.getPlayer(p);
|
||||
if (pd.isPvpBlocked())
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Restoring PVP capabilities for " + p.getName(), true);
|
||||
pd.setPvpBlocked(false);
|
||||
msgNew("Enabled the ability to PVP for <player>.", Placeholder.unparsed("player", p.getName()));
|
||||
msgNew(p, "<green>Your PVP abilities have been restored.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (plugin.al.isAdmin(p))
|
||||
{
|
||||
msgNew("<red><player> is an admin, and cannot have their PVP disabled.", Placeholder.unparsed("player", p.getName()));
|
||||
return true;
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Restricting PVP for " + p.getName(), true);
|
||||
pd.setPvpBlocked(true);
|
||||
plugin.pul.logPunishment(new Punishment(p.getName(), FUtil.getIp(p), sender.getName(), PunishmentType.BLOCKPVP, null));
|
||||
|
||||
msgNew(p, "<red>Your PVP abilities have been restricted.");
|
||||
msgNew("Restricted PVP abilities for <player>. ", Placeholder.unparsed("player", p.getName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,14 +1,17 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "blockredstone", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Blocks redstone on the server.", usage = "/<command>", aliases = "bre")
|
||||
public class Command_blockredstone extends FreedomCommand
|
||||
{
|
@ -4,12 +4,15 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -17,11 +20,11 @@ import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "cage", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Place a cage around someone with certain blocks, or someone's player head.", usage = "/<command> <purge | <partialname> [head | block] [playername | blockname]")
|
||||
public class Command_cage extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole)
|
||||
{
|
||||
if (args.length == 0)
|
||||
@ -33,11 +36,8 @@ public class Command_cage extends FreedomCommand
|
||||
if (args[0].equalsIgnoreCase("purge"))
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Uncaging all players", true);
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
fPlayer.getCageData().setCaged(false);
|
||||
}
|
||||
server.getOnlinePlayers().stream().map(player -> plugin.pl.getPlayer(player)).forEach(fPlayer ->
|
||||
fPlayer.getCageData().setCaged(false));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -51,7 +51,7 @@ public class Command_cage extends FreedomCommand
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
if (fPlayer.getCageData().isCaged())
|
||||
{
|
||||
msg("That player is already caged.", ChatColor.RED);
|
||||
msgNew("<red>That player is already caged.");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -62,7 +62,7 @@ public class Command_cage extends FreedomCommand
|
||||
final String s = args[1];
|
||||
switch (s)
|
||||
{
|
||||
case "head":
|
||||
case "head" ->
|
||||
{
|
||||
outerMaterial = Material.PLAYER_HEAD;
|
||||
if (args.length >= 3)
|
||||
@ -73,9 +73,8 @@ public class Command_cage extends FreedomCommand
|
||||
{
|
||||
outerMaterial = Material.SKELETON_SKULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "block":
|
||||
case "block" ->
|
||||
{
|
||||
if (args.length >= 3)
|
||||
{
|
||||
@ -85,11 +84,10 @@ public class Command_cage extends FreedomCommand
|
||||
if (Material.matchMaterial(args[2]) != null && Material.matchMaterial(args[2]).isBlock())
|
||||
{
|
||||
outerMaterial = Material.matchMaterial(args[2]);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Invalid block!", ChatColor.RED);
|
||||
msgNew("<red>Invalid block!");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -98,7 +96,7 @@ public class Command_cage extends FreedomCommand
|
||||
return false;
|
||||
}
|
||||
}
|
||||
default:
|
||||
default ->
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -156,7 +154,7 @@ public class Command_cage extends FreedomCommand
|
||||
{
|
||||
if (args[1].equals("block"))
|
||||
{
|
||||
return FUtil.getAllMaterialNames();
|
||||
return Arrays.stream(Material.values()).map(Enum::name).toList();
|
||||
}
|
||||
else if (args[1].equals("head"))
|
||||
{
|
@ -1,8 +1,10 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -10,39 +12,20 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "cake", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "For the people that are still alive - gives a cake to everyone on the server.", usage = "/<command>")
|
||||
public class Command_cake extends FreedomCommand
|
||||
{
|
||||
|
||||
public static final String CAKE_LYRICS = "But there's no sense crying over every mistake. You just keep on trying till you run out of cake.";
|
||||
|
||||
@Override
|
||||
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole)
|
||||
{
|
||||
final StringBuilder output = new StringBuilder();
|
||||
|
||||
for (final String word : CAKE_LYRICS.split(" "))
|
||||
{
|
||||
output.append(FUtil.randomChatColor()).append(word).append(" ");
|
||||
}
|
||||
|
||||
final ItemStack heldItem = new ItemStack(Material.CAKE);
|
||||
final ItemMeta heldItemMeta = heldItem.getItemMeta();
|
||||
assert heldItemMeta != null;
|
||||
heldItemMeta.setDisplayName(ChatColor.WHITE + "The " + ChatColor.DARK_GRAY + "Lie");
|
||||
heldItemMeta.displayName(FUtil.miniMessage("<white>The <dark_gray>Lie"));
|
||||
heldItem.setItemMeta(heldItemMeta);
|
||||
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
final int firstEmpty = player.getInventory().firstEmpty();
|
||||
if (firstEmpty >= 0)
|
||||
{
|
||||
player.getInventory().setItem(firstEmpty, heldItem);
|
||||
}
|
||||
}
|
||||
|
||||
FUtil.bcastMsg(output.toString());
|
||||
server.getOnlinePlayers().forEach(player -> player.getInventory().addItem(heldItem));
|
||||
server.broadcast(FUtil.miniMessage("<rainbow>But there's no sense crying over every mistake. You just keep on trying till you run out of cake."));
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,29 +1,30 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "cleanchat", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Clears the chat.", usage = "/<command>", aliases = "cc")
|
||||
public class Command_cleanchat extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (!plugin.al.isAdmin(player))
|
||||
server.getOnlinePlayers().stream().filter(player -> !plugin.al.isAdmin(player)).forEach(player ->
|
||||
{
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
msg(player, "");
|
||||
}
|
||||
}
|
||||
msg(player, Component.space());
|
||||
}
|
||||
});
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Cleared chat", true);
|
||||
return true;
|
||||
}
|
@ -1,20 +1,27 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.*;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_CONSOLE)
|
||||
@CommandParameters(description = "Clear the discord message queue.", usage = "/<command>")
|
||||
@CommandDependencies({"TFD4J"})
|
||||
@CommandPermissions(permission = "cleardiscordqueue", source = SourceType.ONLY_CONSOLE)
|
||||
@CommandParameters(description = "Clear the Discord message queue.", usage = "/<command>")
|
||||
public class Command_cleardiscordqueue extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (plugin.dc == null)
|
||||
{
|
||||
msgNew("<red>Discord is not enabled.");
|
||||
return true;
|
||||
}
|
||||
|
||||
plugin.dc.clearQueue();
|
||||
msg("Cleared the discord message queue.");
|
||||
msgNew("<green>Cleared the Discord message queue.");
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.api.ShopItem;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.*;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandDependencies({"TF-Shoppe"})
|
||||
@CommandPermissions(permission = "clownfish", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Obtain a clown fish", usage = "/<command>")
|
||||
public class Command_clownfish extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (plugin.sh == null)
|
||||
{
|
||||
msgNew("<red>Shop is currently disabled.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (plugin.pl.getData(playerSender).hasItem(ShopItem.CLOWN_FISH))
|
||||
{
|
||||
playerSender.getInventory().addItem(plugin.sh.getClownFish());
|
||||
msgNew("<green>You have been given a <name>.", Placeholder.unparsed("name", ShopItem.CLOWN_FISH.getName()));
|
||||
}
|
||||
else if (plugin.pl.getPlayer(playerSender).isClownfishDisabled())
|
||||
{
|
||||
msgNew("<red>An admin has disabled your ability to use the <name>. Guess you were the clown after all.",
|
||||
Placeholder.unparsed("name", ShopItem.CLOWN_FISH.getName()));
|
||||
}
|
||||
else
|
||||
{
|
||||
msgNew("<red>You don't own a <name>! Purchase one from the shop.", Placeholder.unparsed("name", ShopItem.CLOWN_FISH.getName()));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,12 +1,16 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandPermissions(permission = "cmdspy", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Spy on commands", usage = "/<command>", aliases = "commandspy")
|
||||
public class Command_cmdspy extends FreedomCommand
|
||||
{
|
||||
@ -16,7 +20,7 @@ public class Command_cmdspy extends FreedomCommand
|
||||
{
|
||||
Admin admin = plugin.al.getAdmin(playerSender);
|
||||
admin.setCommandSpy(!admin.getCommandSpy());
|
||||
msg("CommandSpy " + (admin.getCommandSpy() ? "enabled." : "disabled."));
|
||||
msgNew("CommandSpy <status>.", Placeholder.unparsed("status", admin.getCommandSpy() ? "enabled." : "disabled."));
|
||||
plugin.al.save(admin);
|
||||
plugin.al.updateTables();
|
||||
return true;
|
@ -0,0 +1,152 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.*;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@CommandDependencies({"TF-Shoppe"})
|
||||
@CommandPermissions(permission = "coins", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Shows the amount of coins you or another player has. Also allows you to give coins to other players.", usage = "/<command> [player] | pay <player> <amount>")
|
||||
public class Command_coins extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (plugin.sh == null || !ConfigEntry.SHOP_ENABLED.getBoolean())
|
||||
{
|
||||
msgNew("<red>The shop is currently disabled!");
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (args.length)
|
||||
{
|
||||
// Mode for seeing how many coins the sender has (doesn't work from console)
|
||||
case 0 ->
|
||||
{
|
||||
if (senderIsConsole)
|
||||
{
|
||||
msgNew("When used from the console, you must define a target player.");
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerData playerData = getData(playerSender);
|
||||
msgNew("<green>You have <gold><coins></gold> coin<plural>.",
|
||||
Placeholder.unparsed("coins", String.valueOf(playerData.getCoins())),
|
||||
Placeholder.unparsed("plural", playerData.getCoins() > 1 ? "s" : ""));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Mode for seeing how many coins a player has.
|
||||
case 1 ->
|
||||
{
|
||||
Player target = getPlayer(args[0]);
|
||||
|
||||
if (target == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerData playerData = getData(target);
|
||||
msgNew("<green><gold><player></gold> has <gold><coins></gold> coin<plural>.",
|
||||
Placeholder.unparsed("player", target.getName()),
|
||||
Placeholder.unparsed("coins", String.valueOf(playerData.getCoins())),
|
||||
Placeholder.unparsed("plural", playerData.getCoins() > 1 ? "s" : ""));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Mode for paying another player coins
|
||||
case 3 ->
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("pay"))
|
||||
{
|
||||
checkPlayer();
|
||||
|
||||
final Player target = getPlayer(args[1]);
|
||||
final PlayerData senderData = getData(playerSender);
|
||||
|
||||
int coinsToTransfer;
|
||||
|
||||
// Processes args[2]
|
||||
try
|
||||
{
|
||||
// Prevents players from trying to be cheeky with negative numbers.
|
||||
coinsToTransfer = Math.max(Math.abs(Integer.parseInt(args[2])), 1);
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msgNew("<red>Invalid number: <num>", Placeholder.unparsed("num", args[2]));
|
||||
return true;
|
||||
}
|
||||
|
||||
// Prevents players from performing transactions they can't afford to do.
|
||||
if (senderData.getCoins() < coinsToTransfer)
|
||||
{
|
||||
msgNew("<red>You don't have enough coins to perform this transaction.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (target == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerData playerData = getData(target);
|
||||
playerData.setCoins(playerData.getCoins() + coinsToTransfer);
|
||||
senderData.setCoins(senderData.getCoins() - coinsToTransfer);
|
||||
|
||||
boolean plural = coinsToTransfer > 1;
|
||||
|
||||
msgNew(target, "<green><gold><sender></gold> has given you <gold><coins></gold> coin<plural>!",
|
||||
Placeholder.unparsed("sender", sender.getName()),
|
||||
Placeholder.unparsed("coins", String.valueOf(coinsToTransfer)),
|
||||
Placeholder.unparsed("plural", plural ? "s" : ""));
|
||||
|
||||
msgNew("<green>You have given <gold><coins></gold> coin<plural> to <gold><player></gold>.",
|
||||
Placeholder.unparsed("player", target.getName()),
|
||||
Placeholder.unparsed("coins", String.valueOf(coinsToTransfer)),
|
||||
Placeholder.unparsed("plural", plural ? "s" : ""));
|
||||
|
||||
plugin.pl.save(playerData);
|
||||
plugin.pl.save(senderData);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
default ->
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
List<String> options = new ArrayList<>(FUtil.getPlayerList());
|
||||
|
||||
options.add("pay");
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
return FUtil.getPlayerList();
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(permission = "consolesay", source = SourceType.ONLY_CONSOLE)
|
||||
@CommandParameters(description = "Telnet/Console command - Send a chat message with chat formatting over telnet.", usage = "/<command> <message>", aliases = "csay")
|
||||
public class Command_consolesay extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
server.broadcast(FUtil.miniMessage("<gray>[CONSOLE] <red><sender> <dark_gray>» <white><message>",
|
||||
Placeholder.unparsed("sender", sender.getName()),
|
||||
Placeholder.unparsed("message", StringUtils.join(args, " "))));
|
||||
|
||||
if (plugin.dc != null)
|
||||
{
|
||||
String message = StringUtils.join(args, " ");
|
||||
plugin.dc.messageChatChannel("[CONSOLE] " + sender.getName() + " \u00BB " + ChatColor.stripColor(message), true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Random;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
@CommandPermissions(permission = "cookie", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "For those who have no friends - gives a cookie to everyone on the server.", usage = "/<command>")
|
||||
public class Command_cookie extends FreedomCommand
|
||||
{
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player sender_p, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
final ItemStack heldItem = new ItemStack(Material.COOKIE);
|
||||
final ItemMeta heldItemMeta = heldItem.getItemMeta();
|
||||
assert heldItemMeta != null;
|
||||
heldItemMeta.displayName(FUtil.miniMessage("<rainbow>Cookie"));
|
||||
heldItemMeta.lore(Collections.singletonList(FUtil.miniMessage("<rainbow>But, you can have a cookie anyways,\nsince you are sad you are have no friends.")));
|
||||
heldItem.setItemMeta(heldItemMeta);
|
||||
|
||||
server.getOnlinePlayers().forEach(player -> player.getInventory().addItem(heldItem));
|
||||
server.broadcast(FUtil.miniMessage("<rainbow:" + RANDOM.nextInt() + ">Imagine that you have zero cookies and you split them evenly among zero friends. How many cookies does each person get? See? It doesn't make sense. And Cookie Monster is sad that there are no cookies, and you are sad that you have no friends."));
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,7 +1,11 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.SplittableRandom;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.command.Command;
|
||||
@ -9,7 +13,7 @@ import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandPermissions(permission = "deafen", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Makes random sounds.", usage = "/<command>")
|
||||
public class Command_deafen extends FreedomCommand
|
||||
{
|
@ -0,0 +1,40 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
@CommandPermissions(permission = "debugstick", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Get a stick of happiness.", usage = "/<command>")
|
||||
public class Command_debugstick extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
ItemStack itemStack = new ItemStack(Material.DEBUG_STICK);
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
assert itemMeta != null;
|
||||
itemMeta.displayName(Component.text("Stick of Happiness", NamedTextColor.GOLD).decorate(TextDecoration.BOLD));
|
||||
itemMeta.lore(Arrays.asList(
|
||||
Component.text("This is the most powerful stick in the game.", NamedTextColor.RED),
|
||||
Component.text("You can left click to select what you want to change.", NamedTextColor.DARK_BLUE),
|
||||
Component.text("And then you can right click to change it!", NamedTextColor.DARK_GREEN),
|
||||
Component.text("Isn't technology amazing?", NamedTextColor.DARK_PURPLE)
|
||||
));
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
playerSender.getInventory().addItem(itemStack);
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,12 +1,15 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "denick", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Essentials Interface Command - Remove the nickname of all players on the server.", usage = "/<command>")
|
||||
public class Command_denick extends FreedomCommand
|
||||
{
|
||||
@ -16,17 +19,12 @@ public class Command_denick extends FreedomCommand
|
||||
{
|
||||
if (!plugin.esb.isEnabled())
|
||||
{
|
||||
msg("Essentials is not enabled on this server.");
|
||||
msgNew("<red>Essentials is not enabled on this server.");
|
||||
return true;
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Removing all nicknames", false);
|
||||
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
plugin.esb.setNickname(player.getName(), null);
|
||||
}
|
||||
|
||||
server.getOnlinePlayers().forEach(player -> plugin.esb.setNickname(player.getName(), null));
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.*;
|
||||
import me.totalfreedom.totalfreedommod.rank.Hierarchy;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@Intercept("deop")
|
||||
@CommandPermissions(permission = "deop", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Deop a player", usage = "/<command> <partialname>")
|
||||
public class Command_deop extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean silent = false;
|
||||
if (args.length == 2)
|
||||
{
|
||||
silent = args[1].equalsIgnoreCase("-s");
|
||||
}
|
||||
|
||||
Player player = Bukkit.getServer().getPlayer(args[0]);
|
||||
|
||||
if (player == null || plugin.al.isVanished(player.getUniqueId()))
|
||||
{
|
||||
msg(sender, PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
AtomicBoolean atomicBoolean = new AtomicBoolean(silent);
|
||||
Hierarchy.getHierarchy().demoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((result, throwable) ->
|
||||
{
|
||||
if (throwable != null)
|
||||
{
|
||||
msgNew("<red>Could not demote <player> to non-OP. Check the logs for more details.", player(player));
|
||||
FLog.severe("Error while demoting " + player.getName() + " to non-OP:");
|
||||
FLog.severe(throwable);
|
||||
return;
|
||||
}
|
||||
|
||||
if (result == null || !result.wasSuccessful()) {
|
||||
msgNew("<red><player> is already non-op.", Placeholder.unparsed("player", player.getName()));
|
||||
return;
|
||||
}
|
||||
|
||||
msg(player, YOU_ARE_NOT_OP);
|
||||
|
||||
if (!atomicBoolean.get())
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "De-opping " + player.getName(), false);
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Hierarchy;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(permission = "deop.all", source = SourceType.BOTH, blockHostConsole = true)
|
||||
@CommandParameters(description = "Deop everyone on the server.", usage = "/<command>")
|
||||
public class Command_deopall extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "De-opping all players on the server", true);
|
||||
|
||||
server.getOnlinePlayers().forEach(player ->
|
||||
Hierarchy.getHierarchy().demoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((result, ex) ->
|
||||
{
|
||||
if (ex != null)
|
||||
{
|
||||
msgNew("<red>Could not demote <player> to non-OP. Check the logs for more details.", player(player));
|
||||
FLog.severe("Failed to demote " + player.getName() + " to non-OP:");
|
||||
FLog.severe(ex);
|
||||
return;
|
||||
}
|
||||
|
||||
if (result == null || !result.wasSuccessful()) {
|
||||
msgNew("<red><player> is already non-OP.", Placeholder.unparsed("player", player.getName()));
|
||||
return;
|
||||
}
|
||||
|
||||
msg(player, YOU_ARE_NOT_OP);
|
||||
}));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -2,8 +2,13 @@ package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -15,7 +20,7 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandPermissions(permission = "dispfill", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Fill nearby dispensers with a set of items of your choice.", usage = "/<command> <radius> <comma,separated,items>")
|
||||
public class Command_dispfill extends FreedomCommand
|
||||
{
|
||||
@ -43,7 +48,7 @@ public class Command_dispfill extends FreedomCommand
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("Invalid radius.");
|
||||
msgNew("<red>Invalid radius: <amount>", Placeholder.unparsed("amount", args[0]));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -60,7 +65,7 @@ public class Command_dispfill extends FreedomCommand
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Skipping invalid item: " + searchItem);
|
||||
msgNew("Skipping invalid item: <item>", Placeholder.unparsed("item", searchItem));
|
||||
}
|
||||
}
|
||||
|
||||
@ -76,21 +81,23 @@ public class Command_dispfill extends FreedomCommand
|
||||
for (int zOffset = -radius; zOffset <= radius; zOffset++)
|
||||
{
|
||||
final Block targetBlock = centerBlock.getRelative(xOffset, yOffset, zOffset);
|
||||
if (targetBlock.getLocation().distanceSquared(centerLocation) < (radius * radius))
|
||||
if (targetBlock.getLocation().distanceSquared(centerLocation) < (radius * radius) && targetBlock.getType().equals(Material.DISPENSER))
|
||||
{
|
||||
if (targetBlock.getType().equals(Material.DISPENSER))
|
||||
msgNew("Filling dispenser @ <location>", Placeholder.unparsed("location", FUtil.formatLocation(targetBlock.getLocation())));
|
||||
|
||||
if (plugin.cpb.isEnabled())
|
||||
{
|
||||
msg("Filling dispenser @ " + FUtil.formatLocation(targetBlock.getLocation()));
|
||||
plugin.cpb.getCoreProtectAPI().logContainerTransaction(sender.getName(), targetBlock.getLocation());
|
||||
}
|
||||
|
||||
setDispenserContents(targetBlock, itemsArray);
|
||||
affected++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
msg("Done. " + affected + " dispenser(s) filled.");
|
||||
msgNew("Done. <amount> dispenser(s) filled.", Placeholder.unparsed("amount", String.valueOf(affected)));
|
||||
}
|
||||
else
|
||||
{
|
@ -1,14 +1,16 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.discord.Discord;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -19,7 +21,7 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true)
|
||||
@CommandPermissions(permission = "doom", source = SourceType.ONLY_CONSOLE, blockHostConsole = true)
|
||||
@CommandParameters(description = "Sends the specified player to their doom.", usage = "/<command> <playername> [reason]")
|
||||
public class Command_doom extends FreedomCommand
|
||||
{
|
||||
@ -43,7 +45,7 @@ public class Command_doom extends FreedomCommand
|
||||
FUtil.adminAction(sender.getName(), "Casting oblivion over " + player.getName(), true);
|
||||
FUtil.bcastMsg(player.getName() + " will be completely obliviated!", ChatColor.RED);
|
||||
|
||||
final String ip = Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim();
|
||||
final String ip = FUtil.getIp(player);
|
||||
|
||||
// Remove from admin
|
||||
Admin admin = getAdmin(player);
|
||||
@ -53,10 +55,9 @@ public class Command_doom extends FreedomCommand
|
||||
admin.setActive(false);
|
||||
plugin.al.save(admin);
|
||||
plugin.al.updateTables();
|
||||
plugin.ptero.updateAccountStatus(admin);
|
||||
if (plugin.dc.enabled && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
|
||||
if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
|
||||
{
|
||||
Discord.syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID());
|
||||
plugin.dc.syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID());
|
||||
}
|
||||
}
|
||||
|
||||
@ -76,10 +77,7 @@ public class Command_doom extends FreedomCommand
|
||||
// Ban player
|
||||
Ban ban = Ban.forPlayer(player, sender);
|
||||
ban.setReason((reason == null ? "FUCKOFF" : reason));
|
||||
for (String playerIp : plugin.pl.getData(player).getIps())
|
||||
{
|
||||
ban.addIp(playerIp);
|
||||
}
|
||||
ban.addIp(ip);
|
||||
plugin.bm.addBan(ban);
|
||||
|
||||
// Set gamemode to survival
|
||||
@ -123,7 +121,10 @@ public class Command_doom extends FreedomCommand
|
||||
{
|
||||
// message
|
||||
FUtil.adminAction(sender.getName(), "Banning " + player.getName(), true);
|
||||
msg(sender, player.getName() + " has been banned and IP is: " + ip);
|
||||
|
||||
msgNew("<name> has been banned and their IP is <ip>.",
|
||||
Placeholder.unparsed("name", player.getName()),
|
||||
Placeholder.unparsed("ip", ip));
|
||||
|
||||
// generate explosion
|
||||
player.getWorld().createExplosion(player.getLocation(), 0F, false);
|
@ -0,0 +1,55 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(permission = "eject", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Eject any entities that are riding you.", usage = "/<command>")
|
||||
public class Command_eject extends FreedomCommand
|
||||
{
|
||||
/* Player.getShoulderEntityLeft() and Player.getShoulderEntityRight() are deprecated, however unless
|
||||
Player.getPassengers() also includes shoulders (which isn't likely, given the official documentation doesn't
|
||||
state an alternative method to use instead), these methods will continue to be used here. */
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
// Uses the size of the return value of Player.getPassengers() as the starting number of entities ejected
|
||||
int count = playerSender.getPassengers().size();
|
||||
|
||||
// Removes any entities from the sender's shoulders
|
||||
if (playerSender.getShoulderEntityLeft() != null)
|
||||
{
|
||||
playerSender.setShoulderEntityLeft(null);
|
||||
count++;
|
||||
}
|
||||
if (playerSender.getShoulderEntityRight() != null)
|
||||
{
|
||||
playerSender.setShoulderEntityLeft(null);
|
||||
count++;
|
||||
}
|
||||
|
||||
// Removes anything riding the sender
|
||||
playerSender.eject();
|
||||
|
||||
if (count != 0)
|
||||
{
|
||||
msgNew("<green><count> entit<grammar> ejected.",
|
||||
Placeholder.unparsed("count", String.valueOf(count)),
|
||||
Placeholder.unparsed("grammar", count == 1 ? "y was" : "ies were"));
|
||||
}
|
||||
else
|
||||
{
|
||||
msgNew("<green>Nothing was ejected.");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -5,9 +5,15 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.bukkit.ChatColor;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -15,22 +21,10 @@ import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandPermissions(permission = "enchant", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Enchant items.", usage = "/<command> <list | addall | reset | add <name> [level] | remove <name>>")
|
||||
public class Command_enchant extends FreedomCommand
|
||||
{
|
||||
|
||||
public static List<String> stringNumberRange(int min, int max)
|
||||
{
|
||||
List<String> range = new ArrayList<>();
|
||||
for (int i = min; i <= max; i++)
|
||||
{
|
||||
range.add(String.valueOf(i));
|
||||
}
|
||||
|
||||
return range;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
@ -44,60 +38,42 @@ public class Command_enchant extends FreedomCommand
|
||||
|
||||
if (item.getType() == Material.AIR)
|
||||
{
|
||||
msg("You have to hold an item to enchant it");
|
||||
msgNew("<red>You have to hold an item to enchant it.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase("list"))
|
||||
{
|
||||
boolean has_enchantments = false;
|
||||
List<String> enchants = Arrays.stream(Enchantment.values()).filter(enchantment -> enchantment.canEnchantItem(item)).map(enchantment -> enchantment.getName()).toList();
|
||||
|
||||
StringBuilder possible_ench = new StringBuilder("Possible enchantments for held item: ");
|
||||
for (Enchantment ench : Enchantment.values())
|
||||
if (enchants.isEmpty())
|
||||
{
|
||||
if (ench.canEnchantItem(item))
|
||||
{
|
||||
has_enchantments = true;
|
||||
possible_ench.append(ench.getName()).append(", ");
|
||||
}
|
||||
}
|
||||
|
||||
if (has_enchantments)
|
||||
{
|
||||
msg(possible_ench.toString());
|
||||
msgNew("<red>There are no enchantments that work with this item.");
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("The held item has no enchantments.");
|
||||
msgNew("Possible enchantments for this item: <enchants>", Placeholder.unparsed("enchants", FUtil.listToString(enchants)));
|
||||
}
|
||||
}
|
||||
else if (args[0].equalsIgnoreCase("addall"))
|
||||
{
|
||||
for (Enchantment ench : Enchantment.values())
|
||||
Arrays.stream(Enchantment.values()).filter(enchantment -> enchantment.canEnchantItem(item)).forEach(ench ->
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ench.canEnchantItem(item))
|
||||
{
|
||||
item.addEnchantment(ench, ench.getMaxLevel());
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
catch (Exception ignored)
|
||||
{
|
||||
msg("Could not add enchantment: " + ench.getName());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
msg("Added all possible enchantments for this item.");
|
||||
msgNew("<green>Added all possible enchantments for this item.");
|
||||
}
|
||||
else if (args[0].equalsIgnoreCase("reset"))
|
||||
{
|
||||
for (Enchantment ench : item.getEnchantments().keySet())
|
||||
{
|
||||
item.removeEnchantment(ench);
|
||||
}
|
||||
|
||||
msg("Removed all enchantments.");
|
||||
item.getEnchantments().keySet().forEach(item::removeEnchantment);
|
||||
msgNew("<green>Removed all enchantments.");
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -106,19 +82,11 @@ public class Command_enchant extends FreedomCommand
|
||||
return false;
|
||||
}
|
||||
|
||||
Enchantment ench = null;
|
||||
|
||||
try
|
||||
{
|
||||
ench = Enchantment.getByName(args[1].toUpperCase());
|
||||
}
|
||||
catch (Exception ignored)
|
||||
{
|
||||
}
|
||||
Enchantment ench = Enchantment.getByName(args[1].toUpperCase());
|
||||
|
||||
if (ench == null)
|
||||
{
|
||||
msg(args[1] + " is an invalid enchantment for the held item. Type \"/enchant list\" for valid enchantments for this item.");
|
||||
msgNew("<red><enchant> is an invalid enchantment for the held item. Type \"/enchant list\" for valid enchantments for this item.", Placeholder.unparsed("enchant", args[1]));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -126,7 +94,7 @@ public class Command_enchant extends FreedomCommand
|
||||
{
|
||||
if (!ench.canEnchantItem(item) && !ConfigEntry.ALLOW_UNSAFE_ENCHANTMENTS.getBoolean())
|
||||
{
|
||||
msg("Can't use this enchantment on held item.");
|
||||
msgNew("<red>Can't use this enchantment on that item.");
|
||||
return true;
|
||||
}
|
||||
int level = ench.getMaxLevel();
|
||||
@ -145,7 +113,7 @@ public class Command_enchant extends FreedomCommand
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("\"" + args[2] + "\" is not a valid number", ChatColor.RED);
|
||||
msgNew("Invalid number: <number>", Placeholder.unparsed("number", args[2]));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -158,13 +126,13 @@ public class Command_enchant extends FreedomCommand
|
||||
item.addUnsafeEnchantment(ench, level);
|
||||
}
|
||||
|
||||
msg("Added enchantment: " + ench.getName());
|
||||
msgNew("<green>Added enchantment: <enchantment>", Placeholder.unparsed("enchantment", ench.getName()));
|
||||
}
|
||||
else if (args[0].equals("remove"))
|
||||
{
|
||||
item.removeEnchantment(ench);
|
||||
|
||||
msg("Removed enchantment: " + ench.getName());
|
||||
msgNew("<green>Removed enchantment: <enchantment>", Placeholder.unparsed("enchantment", ench.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -251,16 +219,14 @@ public class Command_enchant extends FreedomCommand
|
||||
return getEnchantments(item);
|
||||
}
|
||||
}
|
||||
else if (args.length == 3)
|
||||
{
|
||||
if (args[0].equals("add"))
|
||||
else if (args.length == 3 && args[0].equals("add"))
|
||||
{
|
||||
Enchantment enchantment = Enchantment.getByName(args[1].toUpperCase());
|
||||
if (enchantment != null)
|
||||
{
|
||||
if (!unsafe)
|
||||
{
|
||||
return stringNumberRange(1, enchantment.getMaxLevel());
|
||||
return IntStream.rangeClosed(1, enchantment.getMaxLevel()).mapToObj(String::valueOf).toList();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -268,7 +234,6 @@ public class Command_enchant extends FreedomCommand
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
@ -1,11 +1,14 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.NON_OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandPermissions(permission = "end", source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Go to \"The End\".", usage = "/<command>")
|
||||
public class Command_end extends FreedomCommand
|
||||
{
|
@ -3,16 +3,21 @@ package me.totalfreedom.totalfreedommod.command;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandPermissions(permission = "entitywipe", source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Remove various server entities that may cause lag, such as dropped items, minecarts, and boats.", usage = "/<command> [name | -a]", aliases = "ew,rd")
|
||||
public class Command_entitywipe extends FreedomCommand
|
||||
{
|
||||
@ -93,13 +98,16 @@ public class Command_entitywipe extends FreedomCommand
|
||||
{
|
||||
count = plugin.ew.wipeEntities(bypassBlacklist);
|
||||
}
|
||||
|
||||
if (count == 1)
|
||||
{
|
||||
msg(count + " " + (type != null ? entityName : "entity") + " removed.");
|
||||
msgNew("<count> <name> removed.", Placeholder.unparsed("count", String.valueOf(count)),
|
||||
Placeholder.unparsed("name", type != null ? entityName : "entity"));
|
||||
}
|
||||
else
|
||||
{
|
||||
msg(count + " " + (type != null ? entityName : "entitie") + FUtil.showS(count) + " removed.");
|
||||
msgNew("<count> <name>s removed.", Placeholder.unparsed("count", String.valueOf(count)),
|
||||
Placeholder.unparsed("name", type != null ? entityName : "entitie"));
|
||||
}
|
||||
return true;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user