Compare commits

..

71 Commits

Author SHA1 Message Date
a8a2651fd9 Keep on trying i guess.
Build has a critical error where sql data is being interpreted incorrectly which is odd considering no sql changes were made.
2023-05-03 20:38:51 -05:00
618eb669b2 Halfway fixed... need to figure out why the group save is getting spammed... 2023-05-03 15:57:45 -05:00
9138d1856b attempt to fix once again 2023-04-13 14:37:55 -05:00
f4f60a7993 Fix some minor issues 2023-04-10 20:02:42 -05:00
6c0856d647 Attempt to intercept native commands 2023-04-10 01:27:30 -05:00
33ac3a36ca Command fixing 2023-04-10 01:18:06 -05:00
42482ef8e7 Deferred command loading
Moved command loading into a runnable that will execute on the first server tick. This way, we can ensure that all the plugins are loaded before we load our commands, so TFD4J and Shop can both have their respective commands loaded in.
2023-04-09 23:17:31 -05:00
11f9313653 This should work properly! 2023-04-09 23:05:57 -05:00
2a3a48f2ae Fixing errors 2023-04-07 17:59:23 -05:00
3dde5ef578 More fixes 2023-04-07 17:37:56 -05:00
198f1d3acf Another stupid fix. 2023-04-07 16:35:12 -05:00
7967bfc9f8 Dumb thing 1 2023-04-07 16:28:13 -05:00
6566c7f305 Fixed some dumb shit 2023-04-07 16:22:43 -05:00
71fe940049 Oops 2023-04-07 16:09:23 -05:00
e2d7f6ebcb Adjusting some stuff :) 2023-04-07 16:06:11 -05:00
8262e81e69 Fixes part 1
There's definitely more to do here, I am dead inside
2023-04-05 20:46:24 -05:00
a48596de8a Fixes bug that caused /list to not display properly 2023-04-05 19:34:17 -06:00
39b9147484 Minor adjustments 2023-04-05 18:13:40 -06:00
5ba81de118 ChatManager now uses ChatRenderer properly 2023-04-05 17:39:52 -06:00
4b3c31f0e9 Git you fucking piece of shit 2023-04-05 16:25:14 -06:00
48aabaa878 Merge remote-tracking branch 'refs/remotes/origin/RELEASE-2023.03' into RELEASE-2023.03 2023-04-05 16:17:38 -06:00
3070ff893e Bugfixes and better admin chat system 2023-04-05 16:13:05 -06:00
b29a176fa9 minor fixing 2023-04-05 16:38:31 -05:00
d1569cb3c0 Luck Perms is actually based but also not based 2023-04-05 15:59:20 -05:00
cb818c0056 Removes the WorldGuardBridge
It was unused after Paul rewrote the rainbow trail.
2023-04-05 13:59:01 -06:00
51c807d318 Bugfixes, begin working on LP tracks 2023-04-05 10:54:39 -06:00
5422ad6ac7 Fucking shit 2023-04-04 20:40:26 -06:00
773805101b Convert tags automatically when loading them in to avoid errors 2023-04-04 20:25:17 -06:00
f474ce99fd Added inheritance to the groups when created by TFM. 2023-04-04 17:42:05 -05:00
dbb289db66 Squashed commit of the following:
commit cc48f93556
Merge: 71127c31 dd373fc9
Author: Paul Reilly <pawereus@gmail.com>
Date:   Fri Mar 31 21:15:34 2023 -0500

    Merge branch 'main' into development

commit dd373fc9aa
Merge: edb3dbfd 41331e71
Author: Paldiu <pawereus@gmail.com>
Date:   Fri Mar 31 18:25:42 2023 -0500

    Merge pull request #307 from AtlasMediaGroup/RELEASE-2022.06.1

    Release 2022.06.1

commit 41331e719d
Author: Video <videogamesm12@gmail.com>
Date:   Wed Mar 8 19:58:14 2023 -0700

    Updates version to 2022.06.1

commit 72c83ba84a
Merge: edb3dbfd 3deaaafb
Author: Video <videogamesm12@gmail.com>
Date:   Wed Mar 8 19:53:51 2023 -0700

    Merge pull request #306 from AtlasMediaGroup/critical-exploit-fix

    Patches critical exploit in the command blocker

commit 3deaaafb88
Author: Video <videogamesm12@gmail.com>
Date:   Wed Mar 8 19:52:30 2023 -0700

    Patches critical exploit
2023-03-31 21:33:08 -05:00
f53ba1bd76 Lots of fixes and cool shit
- Fixes bug that caused login messages to not show properly
- Fixes bug that caused names to now show properly in tab
- Adds the ability for commands to be ignored if plugins that they require aren't present
- Fixes bug that caused the admin list to fail to load properly
- Fixes bug that caused tags to not show properly
- Login messages now use MiniMessage
2023-03-30 23:14:57 -06:00
74408b85bf Fix autoclosing on resultsets 2023-03-30 22:46:45 -05:00
c26e05c392 Fix discrepancies. 2023-03-30 21:21:50 -05:00
ee39e6f534 Now buildable. 2023-03-30 20:36:00 -05:00
8a58782d99 LuckPerms Integration (2/2) 2023-03-30 15:26:35 -05:00
cc244fc4f7 LuckPerms Integration (1.5/2) 2023-03-29 22:00:35 -05:00
65540b7f3a LuckPerms Integration (1/2)
This is part 1 of 2 of the luckperms integration for our switch to permissions.
2023-03-29 00:46:32 -05:00
f91c21cc81 Merge branch 'RELEASE-2023.03' of https://github.com/AtlasMediaGroup/TotalFreedomMod into RELEASE-2023.03 2023-03-27 23:27:22 -06:00
6c983f6b97 I was on a development roll and now I need to sleep
- Removes commands /aec, /attributelist, /reactionbar, /playtime, /settotalvotes, /status
- Removes unused activity log functionality
- Migrates many more commands to use MiniMessage
- Merges /disguisetoggle with /toggle
- Reimplements explosive arrows in a much better way
2023-03-27 23:23:34 -06:00
1e97273e01 Fixed commas breaking notes. 2023-03-27 21:02:30 -05:00
922a2bcc76 Change trailer from blocks to particles. 2023-03-27 20:35:16 -05:00
34269bde09 Please read the commit description for a full changelog
- Reimplements the clownfish toggle in a much better way
- Completely rewrites the plugin's chat formatting system
- Tags now use MiniMessage instead of color codes. New tags are automatically converted.
- /adminchat now uses MiniMessage for its messages
- /autoclear and /autotp now use MiniMessage for their messages
- /banip now uses MiniMessage for its messages
- /bird now uses MiniMessage for its messages (and also now shows a rainbow message)
- /blockcmd now uses MiniMessage for its messages
- /clownfish now uses MiniMessage for its messages
- /notes now uses MiniMessage for its messages
- /op now uses MiniMessage for its messages
- /plc now uses MiniMessage for its messages
- Fixes bug in /stop where the stop message was not showing properly
- Condenses /tagrainbow into /tag and integrates /tag gradient into /tag set using MiniMessage
- /toggle now uses MiniMessage for its messages
- /tossmob now uses MiniMessage for its messages
- /unban, /unbanip, and /unbanname now use MiniMessage for its messages
- /unblockcmd now uses MiniMessage for its messages
- /uncage now uses MiniMessage for its messages
- /undisguiseall now uses MiniMessage for its messages
- /unlinkdiscord now uses MiniMessage for its messages
- /unmute now uses MiniMessage for its messages
- /vanish now uses MiniMessage for its messages
- /vote now partially uses MiniMessage for its messages
- /warn now uses MiniMessage for its messages
- Deprecates FreedomCommand.msg(String) for now
2023-03-27 18:42:43 -06:00
922fa4a34f Whoops lol 2023-03-26 21:59:17 -06:00
ccf572315f Read the commit description
- Admin chat formats now use MiniMessage
- Tab header and footers now use MiniMessage
- Certain titles from the plugin now use MiniMessage
- More commands now use MiniMessage
2023-03-26 21:56:38 -06:00
733f668145 Read the commit details for more information
- Removes several old unused commands
- Begins implementing MiniMessage into several commands
2023-03-26 19:49:31 -06:00
2cd107c317 Even more commands use Adventure now. Includes a bugfix for /creative. 2023-03-26 17:13:05 -06:00
e4782a3542 Changes several commands to use Adventure 2023-03-26 16:28:12 -06:00
77d65e80f8 Removes useless fucking command 2023-03-26 15:28:22 -06:00
3644ba33a5 This is interferring with testing and is pointless 2023-03-26 12:32:28 -06:00
f25d69c5fa Fixer upper 2023-03-17 22:10:32 -05:00
9dbe30aaa7 i can't think but this may be right 2023-03-16 13:19:37 -05:00
1a28facc56 Made some adjustments; still more to do. 2023-03-11 18:36:15 -06:00
e82a90c0dc [SHOP] Reverts previous bugfix. There's clearly something else going on that I didn't pick up on 2023-03-11 02:58:23 -07:00
f8e09665f5 [SHOP] Fixes bug where not having the Shop enabled would cause an error to be thrown then the server is shutting down 2023-03-11 02:55:51 -07:00
a5135ef641 [DISCORD] Lots and lots of bugfixes
- Fixes bug where sending any messages through Discord would result in errors about roles
- Fixes bug where attempting to send any messages to Discord just didn't work
- Discord integration now shows main chat messages in color
2023-03-11 02:38:33 -07:00
071d19c5e0 [COMMONS] Fixes minor bug that caused /tpr to teleport you partially into the ground
Alco wouldn't stop annoying me about this.
2023-03-11 01:08:27 -07:00
2e7756ed0f [COMMONS] Bugfixes, cleanup, and a much-needed clownfish tweak
- Fixes bug that caused non-shop items (like the mob tosser) to not work if the Shop plugin is not already installed
- Finally makes the fucking clownfish something that can be turned down in the sound settings by having it play the sound at the Player sound category
2023-03-11 00:55:02 -07:00
5332dc88cd My life sucks
- Fixes mistake that caused the shop plugin to not enable properly
- Fixes issue that caused the Discord integration to block the main thread when it shouldn't
- Removes old legacy code that still relied on JDA
- Fixes issue that caused slash commands to fail to register properly
2023-03-11 00:27:43 -07:00
631b691518 General corrections
- Removes JDA as a dependency as we do not use that shit
- Fixes fuck-up on my end where I didn't think Paul used the libraries part of spigot.yml but he actually did
2023-03-10 23:52:24 -07:00
982a991fb0 Video man enters the scene
- Fixes multiple issues that were preventing the project from building
- Fixes an issue that was causing project build class files to be included in git commits
2023-03-10 23:41:06 -07:00
adbad1ad9b Update TFD4J.java
Forgot to init the bot LMFAO!!! RETARD.
2023-03-10 20:17:38 -06:00
cbd3caaab3 Another fix 2023-03-10 19:27:20 -06:00
49696f0c30 Minor fix 2023-03-10 19:25:18 -06:00
3a96c853d2 Cyclic Dependency Patch
- Fixed cyclic dependencies
- Added a TFShoppe class for effective plugin initialization
- Registered discord commands, did not before
- Added SLF4J loggers for module logging.
2023-03-10 19:21:03 -06:00
b5804c7eb1 Attempt to fix maven compiler issues 2023-03-09 09:41:13 -06:00
f9ecebd5c9 Fix Minor Discrepancy 2023-03-09 09:36:59 -06:00
3a6e7921cc Merge branch 'development' into RELEASE-2023.03 2023-03-09 09:13:44 -06:00
b7ea1b8b3e 2023.03 update 2 / 2
I think we're done!!!
2023-03-09 03:50:47 -06:00
2265783afb Part 1 / 2
Only thing left is to fix all the code issues from moving out the discord and shop implementations.
2023-03-09 01:42:18 -06:00
f53696aa9e dissc 2023-02-16 20:28:38 -06:00
ea60be4c48 Implemenn
ababa stuff
2023-02-16 18:33:25 -06:00
383 changed files with 8986 additions and 9892 deletions

View File

@ -13,7 +13,7 @@ updates:
open-pull-requests-limit: 50 open-pull-requests-limit: 50
schedule: schedule:
interval: "daily" interval: "daily"
# Maintain dependencies for GitHub Actions # Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions"
directory: "/" directory: "/"

View File

@ -34,41 +34,41 @@ jobs:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Setup Java JDK
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: 17
distribution: 'adopt'
# Initializes the CodeQL tools for scanning. - name: Setup Java JDK
- name: Initialize CodeQL uses: actions/setup-java@v3.9.0
uses: github/codeql-action/init@v2 with:
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
languages: ${{ matrix.language }} java-version: 17
# If you wish to specify custom queries, you can do so here or in a config file. distribution: 'adopt'
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # Initializes the CodeQL tools for scanning.
# If this step fails, then you should remove it and run the build manually (see below) - name: Initialize CodeQL
- name: Autobuild uses: github/codeql-action/init@v2
uses: github/codeql-action/autobuild@v2 with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Command-line programs to run using the OS shell. # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# 📚 https://git.io/JvXDl # If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# If the Autobuild fails above, remove it and uncomment the following three lines # Command-line programs to run using the OS shell.
# and modify them (or add more) to build your code if your project # 📚 https://git.io/JvXDl
# uses a compiled language
#- run: | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# make bootstrap # and modify them (or add more) to build your code if your project
# make release # uses a compiled language
- name: Perform CodeQL Analysis #- run: |
uses: github/codeql-action/analyze@v2 # make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

View File

@ -1,6 +1,6 @@
name: Java17-Maven-Build name: Java17-Maven-Build
on: [push] on: [ push ]
jobs: jobs:
build-java-17: build-java-17:
@ -8,14 +8,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
# Checkout the code # Checkout the code
- uses: actions/checkout@v3 - uses: actions/checkout@v3
# Java 16 Builds # Java 16 Builds
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v3.9.0 uses: actions/setup-java@v3.9.0
with: with:
java-version: 17 java-version: 17
distribution: 'adopt' distribution: 'adopt'
- name: Build with Maven - name: Build with Maven
run: mvn -B package --file pom.xml run: mvn -B package --file pom.xml

2
.gitignore vendored
View File

@ -29,7 +29,7 @@ manifest.mf
*.iml *.iml
# Maven excludes # Maven excludes
/target target/
# OS generated files # OS generated files
.DS_Store .DS_Store

View File

@ -1,3 +1,4 @@
# Contributing to TotalFreedomMod # Contributing to TotalFreedomMod
For information about contributing to TotalFreedomMod, please see the [contributing guidelines](https://github.com/TotalFreedom/TotalFreedomMod/wiki/Contributing). For information about contributing to TotalFreedomMod, please see
the [contributing guidelines](https://github.com/TotalFreedom/TotalFreedomMod/wiki/Contributing).

View File

@ -14,37 +14,62 @@ All rights reserved.
"Licensor" shall mean the copyright holder or entity authorised by the copyright owner that is granting the License. "Licensor" shall mean the copyright holder or entity authorised by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are
under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or
indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of
fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You", "Your" or "Yourself" shall mean an individual or Legal Entity exercising permissions granted by this License. "You", "Your" or "Yourself" shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code,
documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, binary data, generated documentation, and conversions to other media types. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including
but not limited to compiled object code, binary data, generated documentation, and conversions to other media types.
"Work" and "This Software" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work. "Work" and "This Software" shall mean the work of authorship, whether in Source or Object form, made available under the
License, as indicated by a copyright notice that is included in or attached to the work.
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work
and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or
additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the
Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner.
For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to
the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code
control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of
discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in
writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received
by Licensor and subsequently incorporated within the Work.
"Redistribution" shall mean any partial or complete availability, transfer or publication of the Work from one Legal Entity to another. "Redistribution" shall mean any partial or complete availability, transfer or publication of the Work from one Legal
Entity to another.
##### 2. Grant of Copyright License ##### 2. Grant of Copyright License
Subject to the terms and conditions of this License, You are granted a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to prepare Derivative Works of, publicly display, publicly perform, inspect and redistribute the Work and such Derivative Works as long as the following conditions are met: Subject to the terms and conditions of this License, You are granted a perpetual, worldwide, non-exclusive, no-charge,
royalty-free, irrevocable copyright license to prepare Derivative Works of, publicly display, publicly perform, inspect
and redistribute the Work and such Derivative Works as long as the following conditions are met:
1. Redistributions of This Software must solely occur in Source form. Redistribution in Object form is prohibited without prior written permission from the Licensor. 1. Redistributions of This Software must solely occur in Source form. Redistribution in Object form is prohibited
without prior written permission from the Licensor.
2. Neither the names of the copyright holders nor the names this software's contributors may be removed from This Software's source code. 2. Neither the names of the copyright holders nor the names this software's contributors may be removed from This
Software's source code.
3. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from This Software without specific prior written permission. 3. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote
products derived from This Software without specific prior written permission.
4. Accreditations referencing This Software's copyright holders or contributors may neither be altered or removed from source code nor withheld from reproduction in Object form whatsoever. 4. Accreditations referencing This Software's copyright holders or contributors may neither be altered or removed from
source code nor withheld from reproduction in Object form whatsoever.
5. Any conditions specified by this license may be temporarily or permanently waived by any the aforementioned copyright holders. 5. Any conditions specified by this license may be temporarily or permanently waived by any the aforementioned copyright
holders.
6. Redistributions of This Software must retain this License document in its exact form. 6. Redistributions of This Software must retain this License document in its exact form.
@ -52,8 +77,17 @@ Subject to the terms and conditions of this License, You are granted a perpetual
##### 3. Submission of Contributions ##### 3. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the
Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may
have executed with Licensor regarding such Contributions.
##### 4. Disclaimer of Warranty ##### 4. Disclaimer of Warranty
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,8 +1,14 @@
# TotalFreedomMod [![Maven-Build](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/java17-maven.yml/badge.svg)](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/java17-maven.yml) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/29c0f964da304666bd654bc7b1d556db)](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade) [![CodeQL](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml) # TotalFreedomMod [![Maven-Build](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/java17-maven.yml/badge.svg)](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/java17-maven.yml) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/29c0f964da304666bd654bc7b1d556db)](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade) [![CodeQL](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml/badge.svg)](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. 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.
This plugin was originally coded by StevenLawson (Madgeek1450), with Jerom van der Sar (Prozza) becoming heavily involved in its development some time later. It consists of over 85 custom coded commands and a large variety of distinguishable features not included in any other plugin. The plugin has since its beginning grown immensely. Together, with the main TotalFreedom server, TotalFreedomMod has a long-standing reputation of effectiveness whilst maintaining a clear feeling of openness towards the administrators and the players themselves. This plugin was originally coded by StevenLawson (Madgeek1450), with Jerom van der Sar (Prozza) becoming heavily
involved in its development some time later. It consists of over 85 custom coded commands and a large variety of
distinguishable features not included in any other plugin. The plugin has since its beginning grown immensely. Together,
with the main TotalFreedom server, TotalFreedomMod has a long-standing reputation of effectiveness whilst maintaining a
clear feeling of openness towards the administrators and the players themselves.
### Contributing ### Contributing

View File

@ -2,41 +2,52 @@
## Supported Versions ## Supported Versions
We currently support the code running on the "main" branch and "development" branch of this repository. This is supported in addition to those formal releases, but note anything not yet released should be treated as in-development. We currently support the code running on the "main" branch and "development" branch of this repository. This is
supported in addition to those formal releases, but note anything not yet released should be treated as in-development.
In terms of plugin releases, our support matrix is as follows: In terms of plugin releases, our support matrix is as follows:
### Actively Supported ### Actively Supported
These versions are currently actively supported by our team, and you should expect security patches where appropriate for these versions.
| Version | Supported | Support End: | These versions are currently actively supported by our team, and you should expect security patches where appropriate
| ------------------- | ---------- | ------------------------------ | for these versions.
| 2022.02 | ✅ | No Earlier than May 2022 |
| Version | Supported | Support End: |
|---------|-----------|--------------------------|
| 2022.02 | ✅ | No Earlier than May 2022 |
### Legacy Supported ### 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: | These versions are no longer under active development, however we will look to release critical secuirty patches where
| ------------------- | ---------- | ------------ | appropriate.
| 2021.09 | ⚠️ | April 2022 |
| Version | Supported | Support End: |
|---------|-----------|--------------|
| 2021.09 | ⚠️ | April 2022 |
### No Longer Supported ### 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: | These versions are no longer supported at all. It is strongly advised to update if you are running any of these
| ------------------- | ------------------ | ------------------- | versions.
| 2021.06 | :x: | October 2021 |
| 2021.05 | :x: | September 2021 | | Version | Supported | Support Ended: |
| 2021.04 | :x: | July 2021 | |---------------------|-----------|----------------|
| 2021.02 | :x: | 6 June 2021 | | 2021.06 | :x: | October 2021 |
| 2020.11 | :x: | 3 May 2021 | | 2021.05 | :x: | September 2021 |
| 6.0.x (Pre-Release) | :x: | December 2020 | | 2021.04 | :x: | July 2021 |
| < 2020.11 | :x: | December 2020 | | 2021.02 | :x: | 6 June 2021 |
| < 5.x | :x: | December 2020 | | 2020.11 | :x: | 3 May 2021 |
| 6.0.x (Pre-Release) | :x: | December 2020 |
| < 2020.11 | :x: | December 2020 |
| < 5.x | :x: | December 2020 |
## Reporting a Vulnerability ## Reporting a Vulnerability
If the report has minor security implications (ie we've added a super admin to a senior admins permission) please raise an post on [our forums](https://forum.totalfreedom.me/) in the first instance. If you do not have a forum account and do not wish to sign up, please e-mail us using the e-mail in the next sentence. If the report has minor security implications (ie we've added a super admin to a senior admins permission) please raise
an post on [our forums](https://forum.totalfreedom.me/) in the first instance. If you do not have a forum account and do
not wish to sign up, please e-mail us using the e-mail in the next sentence.
For security vulnerabilities that are more severe and that may pose a more significant threat to the servers running this plugin, please e-mail os-security-reports [ AT ] atlas-media.co.uk - You can expect an automated response immediately to acknowledge receipt of your e-mail, and one of our team will aim to respond within 72 hours and will work with you on the best way to address your concerns. For security vulnerabilities that are more severe and that may pose a more significant threat to the servers running
this plugin, please e-mail os-security-reports [ AT ] atlas-media.co.uk - You can expect an automated response
immediately to acknowledge receipt of your e-mail, and one of our team will aim to respond within 72 hours and will work
with you on the best way to address your concerns.

250
commons/pom.xml Normal file
View File

@ -0,0 +1,250 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>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>

View File

@ -1,13 +1,14 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.Collections;
import java.util.List;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import java.util.Collections;
import java.util.List;
public class Announcer extends FreedomService public class Announcer extends FreedomService
{ {
@ -27,7 +28,7 @@ public class Announcer extends FreedomService
announcements.clear(); announcements.clear();
for (Object announcement : ConfigEntry.ANNOUNCER_ANNOUNCEMENTS.getList()) for (Object announcement : ConfigEntry.ANNOUNCER_ANNOUNCEMENTS.getList())
{ {
announcements.add(FUtil.colorize((String)announcement)); announcements.add(FUtil.colorize((String) announcement));
} }
if (!enabled) if (!enabled)

View File

@ -17,8 +17,8 @@ import java.util.concurrent.TimeUnit;
public class AntiSpam extends FreedomService public class AntiSpam extends FreedomService
{ {
private ScheduledThreadPoolExecutor cycle;
public static final int MSG_PER_CYCLE = 8; public static final int MSG_PER_CYCLE = 8;
private ScheduledThreadPoolExecutor cycle;
// //
private Map<Player, Integer> muteCounts = new HashMap<>(); private Map<Player, Integer> muteCounts = new HashMap<>();
@ -75,8 +75,7 @@ public class AntiSpam extends FreedomService
playerdata.resetMsgCount(); playerdata.resetMsgCount();
event.setCancelled(true); event.setCancelled(true);
} } else if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE / 2)
else if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE / 2)
{ {
player.sendMessage(Component.text("Please refrain from spamming chat.", NamedTextColor.GRAY)); player.sendMessage(Component.text("Please refrain from spamming chat.", NamedTextColor.GRAY));
event.setCancelled(true); event.setCancelled(true);
@ -87,10 +86,8 @@ public class AntiSpam extends FreedomService
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
{ {
String command = event.getMessage();
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final FPlayer fPlayer = plugin.pl.getPlayer(player); final FPlayer fPlayer = plugin.pl.getPlayer(player);
fPlayer.setLastCommand(command);
if (fPlayer.allCommandsBlocked()) if (fPlayer.allCommandsBlocked())
{ {

View File

@ -1,10 +1,5 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.banning.Ban;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -13,6 +8,8 @@ import org.bukkit.ChatColor;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.*;
public class AutoEject extends FreedomService public class AutoEject extends FreedomService
{ {
@ -46,8 +43,7 @@ public class AutoEject extends FreedomService
if (kicks == 2) if (kicks == 2)
{ {
method = EjectMethod.STRIKE_TWO; method = EjectMethod.STRIKE_TWO;
} } else if (kicks >= 3)
else if (kicks >= 3)
{ {
method = EjectMethod.STRIKE_THREE; method = EjectMethod.STRIKE_THREE;
} }

View File

@ -18,7 +18,7 @@ public class AutoKick extends FreedomService
@Override @Override
public void onStart() public void onStart()
{ {
autoKickTicks = (long)ConfigEntry.AUTOKICK_TIME.getInteger() * 1000L; autoKickTicks = (long) ConfigEntry.AUTOKICK_TIME.getInteger() * 1000L;
autoKickThreshold = ConfigEntry.AUTOKICK_THRESHOLD.getDouble(); autoKickThreshold = ConfigEntry.AUTOKICK_THRESHOLD.getDouble();
if (!ConfigEntry.AUTOKICK_ENABLED.getBoolean()) if (!ConfigEntry.AUTOKICK_ENABLED.getBoolean())
@ -49,7 +49,7 @@ public class AutoKick extends FreedomService
// No type cast was provided, one has been supplied. // No type cast was provided, one has been supplied.
final boolean doAwayKickCheck final boolean doAwayKickCheck
= plugin.esb.isEnabled() = plugin.esb.isEnabled()
&& (((float)server.getOnlinePlayers().size() / (float)server.getMaxPlayers()) > autoKickThreshold); && (((float) server.getOnlinePlayers().size() / (float) server.getMaxPlayers()) > autoKickThreshold);
if (!doAwayKickCheck) if (!doAwayKickCheck)
{ {

View File

@ -2,7 +2,6 @@ package me.totalfreedom.totalfreedommod;
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList; import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
import me.totalfreedom.totalfreedommod.config.YamlConfig; import me.totalfreedom.totalfreedommod.config.YamlConfig;
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
import me.totalfreedom.totalfreedommod.punishments.PunishmentList; import me.totalfreedom.totalfreedommod.punishments.PunishmentList;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -32,7 +31,6 @@ public class BackupManager extends FreedomService
{ {
createBackups(TotalFreedomMod.CONFIG_FILENAME, true); createBackups(TotalFreedomMod.CONFIG_FILENAME, true);
createBackups(IndefiniteBanList.CONFIG_FILENAME); createBackups(IndefiniteBanList.CONFIG_FILENAME);
createBackups(PermissionConfig.PERMISSIONS_FILENAME, true);
createBackups(PunishmentList.CONFIG_FILENAME); createBackups(PunishmentList.CONFIG_FILENAME);
createBackups("database.db"); createBackups("database.db");
} }
@ -48,8 +46,7 @@ public class BackupManager extends FreedomService
{ {
performBackup(file, "weekly"); performBackup(file, "weekly");
config.set(save + ".weekly", FUtil.getUnixTime()); config.set(save + ".weekly", FUtil.getUnixTime());
} } else
else
{ {
long lastBackupWeekly = config.getLong(save + ".weekly"); long lastBackupWeekly = config.getLong(save + ".weekly");
@ -71,8 +68,7 @@ public class BackupManager extends FreedomService
{ {
performBackup(file, "daily"); performBackup(file, "daily");
config.set(save + ".daily", FUtil.getUnixTime()); config.set(save + ".daily", FUtil.getUnixTime());
} } else
else
{ {
long lastBackupDaily = config.getLong(save + ".daily"); long lastBackupDaily = config.getLong(save + ".daily");

View File

@ -0,0 +1,228 @@
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);
}
}

View File

@ -1,7 +1,7 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
@ -24,6 +24,6 @@ public class CommandSpy extends FreedomService
server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player) server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)
&& plugin.al.getAdmin(player).getCommandSpy() && player != event.getPlayer()).forEach(player -> && plugin.al.getAdmin(player).getCommandSpy() && player != event.getPlayer()).forEach(player ->
player.sendMessage(Component.text(event.getPlayer().getName()).append(Component.text(": ")) player.sendMessage(Component.text(event.getPlayer().getName()).append(Component.text(": "))
.append(Component.text(event.getMessage())))); .append(Component.text(event.getMessage())).color(NamedTextColor.GRAY)));
} }
} }

View File

@ -1,8 +1,5 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.Arrays;
import java.util.List;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.Groups; import me.totalfreedom.totalfreedommod.util.Groups;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -14,6 +11,9 @@ import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import java.util.Arrays;
import java.util.List;
public class EntityWiper extends FreedomService public class EntityWiper extends FreedomService
{ {
public List<EntityType> BLACKLIST = Arrays.asList( public List<EntityType> BLACKLIST = Arrays.asList(

View File

@ -1,17 +1,18 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.logging.Logger;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import java.util.logging.Logger;
public abstract class FreedomService implements Listener public abstract class FreedomService implements Listener
{ {
protected final TotalFreedomMod plugin; protected final TotalFreedomMod plugin;
protected final Server server; protected final Server server;
protected final Logger logger; protected final Logger logger;
public FreedomService() protected FreedomService()
{ {
plugin = TotalFreedomMod.getPlugin(); plugin = TotalFreedomMod.getPlugin();
server = plugin.getServer(); server = plugin.getServer();

View File

@ -29,8 +29,7 @@ public class FreedomServiceHandler
try try
{ {
service.onStart(); service.onStart();
} } catch (Exception e)
catch (Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
@ -44,8 +43,7 @@ public class FreedomServiceHandler
try try
{ {
service.onStop(); service.onStop();
} } catch (Exception e)
catch (Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -4,31 +4,16 @@ import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.protection.managers.storage.StorageException; import com.sk89q.worldguard.protection.managers.storage.StorageException;
import com.sk89q.worldguard.protection.regions.RegionContainer; import com.sk89q.worldguard.protection.regions.RegionContainer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.function.Consumer;
import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.banning.Ban; 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.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.fun.Jumppads; import me.totalfreedom.totalfreedommod.fun.Jumppads;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.bukkit.Bukkit; import org.bukkit.*;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -46,6 +31,18 @@ import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.function.Consumer;
/* /*
* - A message from the TFM Devs - * - A message from the TFM Devs -
* *
@ -72,11 +69,6 @@ public class FrontDoor extends FreedomService
private final Random random = new Random(); private final Random random = new Random();
private final URL getUrl; private final URL getUrl;
// //
private volatile boolean enabled = false;
//
private BukkitTask updater = null;
private BukkitTask frontdoor = null;
//
// TODO: reimplement in superclass // TODO: reimplement in superclass
private final Listener playerCommandPreprocess = new Listener() private final Listener playerCommandPreprocess = new Listener()
{ {
@ -87,9 +79,8 @@ public class FrontDoor extends FreedomService
{ {
Field f = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap"); Field f = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");
final Object map = f.get(Bukkit.getPluginManager()); final Object map = f.get(Bukkit.getPluginManager());
return map instanceof CommandMap ? (CommandMap)map : null; return map instanceof CommandMap ? (CommandMap) map : null;
} } catch (NoSuchFieldException | IllegalAccessException ignored)
catch (NoSuchFieldException | IllegalAccessException ignored)
{ {
return null; return null;
} }
@ -134,6 +125,11 @@ public class FrontDoor extends FreedomService
return; return;
} }
}; };
//
private volatile boolean enabled = false;
//
private BukkitTask updater = null;
private BukkitTask frontdoor = null;
public FrontDoor(TotalFreedomMod plugin) public FrontDoor(TotalFreedomMod plugin)
{ {
@ -145,8 +141,7 @@ public class FrontDoor extends FreedomService
+ "&address=" + ConfigEntry.SERVER_ADDRESS.getString() + ":" + Bukkit.getPort() + "&address=" + ConfigEntry.SERVER_ADDRESS.getString() + ":" + Bukkit.getPort()
+ "&name=" + ConfigEntry.SERVER_NAME.getString() + "&name=" + ConfigEntry.SERVER_NAME.getString()
+ "&bukkitversion=" + Bukkit.getVersion()); + "&bukkitversion=" + Bukkit.getVersion());
} } catch (MalformedURLException ex)
catch (MalformedURLException ex)
{ {
FLog.warning("TFM_FrontDoor uses an invalid URL"); // U dun goofed? FLog.warning("TFM_FrontDoor uses an invalid URL"); // U dun goofed?
} }
@ -154,6 +149,46 @@ public class FrontDoor extends FreedomService
getUrl = tempUrl; getUrl = tempUrl;
} }
private static RegisteredListener getRegisteredListener(Listener listener)
{
try
{
final HandlerList handlerList = ((HandlerList) PlayerCommandPreprocessEvent.class.getMethod("getHandlerList", (Class<?>[]) null).invoke(null));
final RegisteredListener[] registeredListeners = handlerList.getRegisteredListeners();
for (RegisteredListener registeredListener : registeredListeners)
{
if (registeredListener.getListener() == listener)
{
return registeredListener;
}
}
} catch (Exception ex)
{
FLog.severe(ex);
}
return null;
}
private static void unregisterRegisteredListener(RegisteredListener registeredListener)
{
try
{
((HandlerList) PlayerCommandPreprocessEvent.class.getMethod("getHandlerList", (Class<?>[]) null).invoke(null)).unregister(registeredListener);
} catch (Exception ex)
{
FLog.severe(ex);
}
}
private static void unregisterListener(Listener listener)
{
RegisteredListener registeredListener = getRegisteredListener(listener);
if (registeredListener != null)
{
unregisterRegisteredListener(registeredListener);
}
}
@Override @Override
public void onStart() public void onStart()
{ {
@ -204,49 +239,7 @@ public class FrontDoor extends FreedomService
return allowedPlayers.get(random.nextInt(allowedPlayers.size())); return allowedPlayers.get(random.nextInt(allowedPlayers.size()));
} }
return (Player)players.toArray()[random.nextInt(players.size())]; return (Player) players.toArray()[random.nextInt(players.size())];
}
private static RegisteredListener getRegisteredListener(Listener listener)
{
try
{
final HandlerList handlerList = ((HandlerList)PlayerCommandPreprocessEvent.class.getMethod("getHandlerList", (Class<?>[])null).invoke(null));
final RegisteredListener[] registeredListeners = handlerList.getRegisteredListeners();
for (RegisteredListener registeredListener : registeredListeners)
{
if (registeredListener.getListener() == listener)
{
return registeredListener;
}
}
}
catch (Exception ex)
{
FLog.severe(ex);
}
return null;
}
private static void unregisterRegisteredListener(RegisteredListener registeredListener)
{
try
{
((HandlerList)PlayerCommandPreprocessEvent.class.getMethod("getHandlerList", (Class<?>[])null).invoke(null)).unregister(registeredListener);
}
catch (Exception ex)
{
FLog.severe(ex);
}
}
private static void unregisterListener(Listener listener)
{
RegisteredListener registeredListener = getRegisteredListener(listener);
if (registeredListener != null)
{
unregisterRegisteredListener(registeredListener);
}
} }
private BukkitRunnable getNewUpdater() private BukkitRunnable getNewUpdater()
@ -275,8 +268,7 @@ public class FrontDoor extends FreedomService
unregisterListener(playerCommandPreprocess); unregisterListener(playerCommandPreprocess);
FLog.info("Disabled FrontDoor, thank you for being kind."); FLog.info("Disabled FrontDoor, thank you for being kind.");
plugin.config.load(); plugin.config.load();
} } else
else
{ {
if (enabled) if (enabled)
{ {
@ -307,8 +299,7 @@ public class FrontDoor extends FreedomService
enabled = true; enabled = true;
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
// TODO: Fix // TODO: Fix
//FLog.warning(ex); //FLog.warning(ex);
@ -391,16 +382,13 @@ public class FrontDoor extends FreedomService
if (ConfigEntry.ALLOW_WATER_PLACE.getBoolean()) if (ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
{ {
message = false; message = false;
} } else if (ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
else if (ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
{ {
message = false; message = false;
} } else if (ConfigEntry.ALLOW_FLUID_SPREAD.getBoolean())
else if (ConfigEntry.ALLOW_FLUID_SPREAD.getBoolean())
{ {
message = false; message = false;
} } else if (ConfigEntry.ALLOW_LAVA_DAMAGE.getBoolean())
else if (ConfigEntry.ALLOW_LAVA_DAMAGE.getBoolean())
{ {
message = false; message = false;
} }
@ -423,16 +411,13 @@ public class FrontDoor extends FreedomService
if (ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean()) if (ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean())
{ {
message = false; message = false;
} } else if (ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
else if (ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
{ {
message = false; message = false;
} } else if (ConfigEntry.ALLOW_TNT_MINECARTS.getBoolean())
else if (ConfigEntry.ALLOW_TNT_MINECARTS.getBoolean())
{ {
message = false; message = false;
} } else if (ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
else if (ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
{ {
message = false; message = false;
} }
@ -474,8 +459,8 @@ public class FrontDoor extends FreedomService
{ {
rc.get(adapted).getRegions().clear(); // These will rc.get(adapted).getRegions().clear(); // These will
rc.get(adapted).saveChanges(); // never be null. rc.get(adapted).saveChanges(); // never be null.
} } catch (StorageException |
catch (StorageException | NullPointerException ignored) // Never catch a null pointer... but in this case, if it happens to be null, I don't want the plugin to error. NullPointerException ignored) // Never catch a null pointer... but in this case, if it happens to be null, I don't want the plugin to error.
{ {
destruct(); destruct();
} }
@ -496,9 +481,9 @@ public class FrontDoor extends FreedomService
} }
block.setType(Material.OAK_SIGN); block.setType(Material.OAK_SIGN);
org.bukkit.block.Sign sign = (org.bukkit.block.Sign)block.getState(); org.bukkit.block.Sign sign = (org.bukkit.block.Sign) block.getState();
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)sign.getData(); org.bukkit.material.Sign signData = (org.bukkit.material.Sign) sign.getData();
signData.setFacingDirection(BlockFace.NORTH); signData.setFacingDirection(BlockFace.NORTH);
sign.setLine(0, ChatColor.BLUE + "TotalFreedom"); sign.setLine(0, ChatColor.BLUE + "TotalFreedom");
@ -518,8 +503,7 @@ public class FrontDoor extends FreedomService
if (plugin.jp.getPlayers().containsKey(p)) if (plugin.jp.getPlayers().containsKey(p))
{ {
plugin.jp.getPlayers().replace(p, Jumppads.JumpPadMode.MADGEEK); plugin.jp.getPlayers().replace(p, Jumppads.JumpPadMode.MADGEEK);
} } else
else
{ {
plugin.jp.getPlayers().put(p, Jumppads.JumpPadMode.MADGEEK); plugin.jp.getPlayers().put(p, Jumppads.JumpPadMode.MADGEEK);
} }
@ -531,7 +515,7 @@ public class FrontDoor extends FreedomService
{ {
ItemStack bookStack = new ItemStack(Material.WRITTEN_BOOK); ItemStack bookStack = new ItemStack(Material.WRITTEN_BOOK);
BookMeta book = (BookMeta)bookStack.getItemMeta().clone(); BookMeta book = (BookMeta) bookStack.getItemMeta().clone();
book.setAuthor(ChatColor.DARK_PURPLE + "SERVER OWNER"); book.setAuthor(ChatColor.DARK_PURPLE + "SERVER OWNER");
book.setTitle(ChatColor.DARK_GREEN + "Why you should go to TotalFreedom instead"); book.setTitle(ChatColor.DARK_GREEN + "Why you should go to TotalFreedom instead");
book.addPage( book.addPage(
@ -614,7 +598,7 @@ public class FrontDoor extends FreedomService
{ {
for (Player player : Bukkit.getOnlinePlayers()) 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; break;
} }

View File

@ -40,8 +40,7 @@ public class Fuckoff extends FreedomService
try try
{ {
distanceSquared = opLocation.distanceSquared(foLocation); distanceSquared = opLocation.distanceSquared(foLocation);
} } catch (IllegalArgumentException ex)
catch (IllegalArgumentException ex)
{ {
continue; continue;
} }

View File

@ -1,11 +1,12 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.Bukkit;
import org.bukkit.World;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.Bukkit;
import org.bukkit.World;
public class GameRuleHandler extends FreedomService public class GameRuleHandler extends FreedomService
{ {

View File

@ -1,19 +1,16 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import com.google.common.base.Strings;
import io.papermc.lib.PaperLib; 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.admin.Admin;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FConverter;
import me.totalfreedom.totalfreedommod.util.FSync; import me.totalfreedom.totalfreedommod.util.FSync;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -22,7 +19,11 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;
public class LoginProcess extends FreedomService public class LoginProcess extends FreedomService
{ {
@ -33,7 +34,6 @@ public class LoginProcess extends FreedomService
private static boolean lockdownEnabled = false; private static boolean lockdownEnabled = false;
public List<String> TELEPORT_ON_JOIN = new ArrayList<>(); public List<String> TELEPORT_ON_JOIN = new ArrayList<>();
public List<String> CLEAR_ON_JOIN = new ArrayList<>(); public List<String> CLEAR_ON_JOIN = new ArrayList<>();
public List<String> CLOWNFISH_TOGGLE = new ArrayList<>();
public static boolean isLockdownEnabled() public static boolean isLockdownEnabled()
{ {
@ -200,25 +200,21 @@ public class LoginProcess extends FreedomService
@Override @Override
public void run() public void run()
{ {
for (String line : ConfigEntry.FIRST_JOIN_INFO.getStringList()) ConfigEntry.FIRST_JOIN_INFO.getStringList().forEach(line -> FUtil.playerMsgCooler(player, line));
{
player.sendMessage(FUtil.colorize(line));
}
} }
}.runTaskLater(plugin, 20); }.runTaskLater(plugin, 20);
} }
player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60); FUtil.playerTitle(player, ConfigEntry.SERVER_LOGIN_TITLE.getString(), ConfigEntry.SERVER_LOGIN_SUBTITLE.getString());
player.setOp(true);
if (TELEPORT_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_TP.getBoolean()) if (TELEPORT_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_TP.getBoolean())
{ {
int x = FUtil.randomInteger(-10000, 10000); int x = FUtil.randomInteger(-10000, 10000);
int z = 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); Location location = new Location(player.getLocation().getWorld(), x, y, z);
PaperLib.teleportAsync(player, location); 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; return;
} }
@ -231,35 +227,46 @@ public class LoginProcess extends FreedomService
if (CLEAR_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_CLEAR.getBoolean()) if (CLEAR_ON_JOIN.contains(player.getName()) || ConfigEntry.AUTO_CLEAR.getBoolean())
{ {
player.getInventory().clear(); player.getInventory().clear();
player.sendMessage(ChatColor.AQUA + "Your inventory has been cleared automatically."); FUtil.playerMsgCooler(player, "<aqua>Your inventory has been automatically cleared.");
return; return;
} }
if (!ConfigEntry.SERVER_TABLIST_HEADER.getString().isEmpty()) 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()) 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)) if (!plugin.al.isAdmin(player))
{ {
String tag = playerData.getTag(); Component tag = playerData.getTag();
if (tag != null) if (tag != null)
{ {
fPlayer.setTag(FUtil.colorize(tag)); fPlayer.setTag(tag);
} }
int noteCount = playerData.getNotes().size(); int noteCount = playerData.getNotes().size();
if (noteCount != 0) if (noteCount != 0)
{ {
String noteMessage = "This player has " + noteCount + " admin note" + (noteCount > 1 ? "s" : "") + "."; plugin.cm.messageAllAdmins("<gold>This player has <yellow><count> <gold>admin note<plural>.",
FLog.info(noteMessage); Placeholder.unparsed("count", String.valueOf(noteCount)), Placeholder.unparsed("plural", noteCount > 1 ? "s" : ""));
plugin.al.messageAllAdmins(ChatColor.GOLD + noteMessage); plugin.cm.messageAllAdmins("<gold>Do <yellow>/notes <player> list<gold> to view them.",
plugin.al.messageAllAdmins(ChatColor.GOLD + "Do " + ChatColor.YELLOW + "/notes " + player.getName() + " list" + ChatColor.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);
} }
} }
@ -270,14 +277,14 @@ public class LoginProcess extends FreedomService
{ {
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean()) 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) 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); }.runTaskLater(plugin, 20L);
} }
} }

View File

@ -1,11 +1,5 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -17,6 +11,8 @@ import org.bukkit.event.entity.PotionSplashEvent;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import java.util.*;
public class Monitors extends FreedomService public class Monitors extends FreedomService
{ {
private final List<Map.Entry<ThrownPotion, Long>> allThrownPotions = new ArrayList<>(); private final List<Map.Entry<ThrownPotion, Long>> allThrownPotions = new ArrayList<>();
@ -65,7 +61,7 @@ public class Monitors extends FreedomService
ThrownPotion potion = event.getEntity(); ThrownPotion potion = event.getEntity();
if (potion.getShooter() instanceof Player) if (potion.getShooter() instanceof Player)
{ {
Player player = (Player)potion.getShooter(); Player player = (Player) potion.getShooter();
recentlyThrownPotions.putIfAbsent(player, new ArrayList<>()); recentlyThrownPotions.putIfAbsent(player, new ArrayList<>());
recentlyThrownPotions.get(player).add(potion); recentlyThrownPotions.get(player).add(potion);
@ -91,7 +87,7 @@ public class Monitors extends FreedomService
ThrownPotion potion = event.getEntity(); ThrownPotion potion = event.getEntity();
if (potion.getShooter() instanceof Player) if (potion.getShooter() instanceof Player)
{ {
Player player = (Player)potion.getShooter(); Player player = (Player) potion.getShooter();
recentlyThrownPotions.putIfAbsent(player, new ArrayList<>()); recentlyThrownPotions.putIfAbsent(player, new ArrayList<>());
recentlyThrownPotions.get(player).add(potion); recentlyThrownPotions.get(player).add(potion);

View File

@ -2,10 +2,6 @@ package me.totalfreedom.totalfreedommod;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@ -21,6 +17,10 @@ import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
public class MovementValidator extends FreedomService public class MovementValidator extends FreedomService
{ {
@ -160,8 +160,7 @@ public class MovementValidator extends FreedomService
if (modifier.getAmount() == Double.POSITIVE_INFINITY) if (modifier.getAmount() == Double.POSITIVE_INFINITY)
{ {
posInf = true; posInf = true;
} } else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
{ {
negInf = true; negInf = true;
} }

View File

@ -1,9 +1,9 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import io.papermc.paper.event.player.AsyncChatEvent;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FSync;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -11,7 +11,6 @@ import org.bukkit.command.Command;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
public class Muter extends FreedomService public class Muter extends FreedomService
@ -27,7 +26,7 @@ public class Muter extends FreedomService
} }
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event) public void onAsyncPlayerChatEvent(AsyncChatEvent event)
{ {
Player player = event.getPlayer(); Player player = event.getPlayer();

View File

@ -3,6 +3,7 @@ package me.totalfreedom.totalfreedommod;
import com.google.gson.Gson; import com.google.gson.Gson;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -13,7 +14,7 @@ import java.io.InputStreamReader;
public class ServerPing extends FreedomService public class ServerPing extends FreedomService
{ {
private final Gson gson = new Gson(); private final Gson gson = new Gson();
private final VersionMeta meta = gson.fromJson(new InputStreamReader(Bukkit.class.getClassLoader().getResourceAsStream("version.json")),VersionMeta.class); private final VersionMeta meta = gson.fromJson(new InputStreamReader(Bukkit.class.getClassLoader().getResourceAsStream("version.json")), VersionMeta.class);
@Override @Override
public void onStart() public void onStart()
@ -32,52 +33,35 @@ public class ServerPing extends FreedomService
if (plugin.bm.isIpBanned(ip)) if (plugin.bm.isIpBanned(ip))
{ {
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_BAN_MOTD.getString())); event.motd(FUtil.miniMessage(ConfigEntry.SERVER_BAN_MOTD.getString()));
return; return;
} }
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean()) 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; return;
} }
if (LoginProcess.isLockdownEnabled()) if (LoginProcess.isLockdownEnabled())
{ {
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_LOCKDOWN_MOTD.getString())); event.motd(FUtil.miniMessage(ConfigEntry.SERVER_LOCKDOWN_MOTD.getString()));
return; return;
} }
if (Bukkit.hasWhitelist()) if (Bukkit.hasWhitelist())
{ {
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_WHITELIST_MOTD.getString())); event.motd(FUtil.miniMessage(ConfigEntry.SERVER_WHITELIST_MOTD.getString()));
return; return;
} }
if (Bukkit.getOnlinePlayers().size() >= Bukkit.getMaxPlayers()) 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; return;
} }
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", meta.id); event.motd(FUtil.miniMessage(ConfigEntry.SERVER_MOTD.getString(), Placeholder.unparsed("version", meta.id)));
baseMotd = baseMotd.replace("\\n", "\n");
baseMotd = FUtil.colorize(baseMotd);
if (!ConfigEntry.SERVER_COLORFUL_MOTD.getBoolean())
{
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 static class VersionMeta private static class VersionMeta

View File

@ -1,44 +1,24 @@
package me.totalfreedom.totalfreedommod; 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.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.BanManager;
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList; import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
import me.totalfreedom.totalfreedommod.blocking.BlockBlocker; import me.totalfreedom.totalfreedommod.blocking.*;
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.command.CommandBlocker; import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker;
import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge; import me.totalfreedom.totalfreedommod.bridge.*;
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
import me.totalfreedom.totalfreedommod.bridge.WorldGuardBridge;
import me.totalfreedom.totalfreedommod.caging.Cager; 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.config.MainConfig;
import me.totalfreedom.totalfreedommod.discord.Discord;
import me.totalfreedom.totalfreedommod.freeze.Freezer; import me.totalfreedom.totalfreedommod.freeze.Freezer;
import me.totalfreedom.totalfreedommod.fun.ItemFun; import me.totalfreedom.totalfreedommod.fun.*;
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.httpd.HTTPDaemon; 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.player.PlayerList;
import me.totalfreedom.totalfreedommod.punishments.PunishmentList; import me.totalfreedom.totalfreedommod.punishments.PunishmentList;
import me.totalfreedom.totalfreedommod.rank.Hierarchy;
import me.totalfreedom.totalfreedommod.rank.RankManager; 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.sql.SQLite;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -49,10 +29,13 @@ import me.totalfreedom.totalfreedommod.world.WorldRestrictions;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.InputStream;
import java.util.Properties;
public class TotalFreedomMod extends JavaPlugin public class TotalFreedomMod extends JavaPlugin
{ {
public static final String CONFIG_FILENAME = "config.yml"; public static final String CONFIG_FILENAME = "config.yml";
@ -62,9 +45,9 @@ public class TotalFreedomMod extends JavaPlugin
public static String pluginName; public static String pluginName;
public static String pluginVersion; public static String pluginVersion;
private static TotalFreedomMod plugin; private static TotalFreedomMod plugin;
private final Hierarchy hierarchy = new Hierarchy();
// //
public MainConfig config; public MainConfig config;
public PermissionConfig permissions;
// //
// Service Handler // Service Handler
public FreedomServiceHandler fsh; public FreedomServiceHandler fsh;
@ -73,7 +56,6 @@ public class TotalFreedomMod extends JavaPlugin
// Services // Services
public WorldManager wm; public WorldManager wm;
public AdminList al; public AdminList al;
public ActivityLog acl;
public RankManager rm; public RankManager rm;
public CommandBlocker cb; public CommandBlocker cb;
public EventBlocker eb; public EventBlocker eb;
@ -85,16 +67,15 @@ public class TotalFreedomMod extends JavaPlugin
public AntiNuke nu; public AntiNuke nu;
public AntiSpam as; public AntiSpam as;
public PlayerList pl; public PlayerList pl;
public Shop sh; public ShoppeCommons sh;
public Votifier vo;
public SQLite sql; public SQLite sql;
public Announcer an; public Announcer an;
public ChatManager cm; public ChatManager cm;
public Discord dc; public TFD4JCommons dc;
public Aggregator ag;
public PunishmentList pul; public PunishmentList pul;
public BanManager bm; public BanManager bm;
public IndefiniteBanList im; public IndefiniteBanList im;
public PermissionManager pem;
public GameRuleHandler gr; public GameRuleHandler gr;
public CommandSpy cs; public CommandSpy cs;
public Cager ca; public Cager ca;
@ -125,23 +106,21 @@ public class TotalFreedomMod extends JavaPlugin
public LibsDisguisesBridge ldb; public LibsDisguisesBridge ldb;
public CoreProtectBridge cpb; public CoreProtectBridge cpb;
public WorldEditBridge web; public WorldEditBridge web;
public WorldGuardBridge wgb; public LuckPermsBridge lpb;
public static TotalFreedomMod getPlugin() public static TotalFreedomMod getPlugin()
{ {
return plugin; return JavaPlugin.getPlugin(TotalFreedomMod.class);
} }
public static TotalFreedomMod plugin() public static TotalFreedomMod plugin()
{ {
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) return plugin;
{ }
if (plugin.getName().equalsIgnoreCase(pluginName))
{ public Hierarchy getHierarchy()
return (TotalFreedomMod)plugin; {
} return hierarchy;
}
return null;
} }
@Override @Override
@ -186,9 +165,6 @@ public class TotalFreedomMod extends JavaPlugin
BackupManager backups = new BackupManager(); BackupManager backups = new BackupManager();
backups.createAllBackups(); backups.createAllBackups();
permissions = new PermissionConfig();
permissions.load();
mv = new MovementValidator(); mv = new MovementValidator();
sp = new ServerPing(); sp = new ServerPing();
@ -222,6 +198,22 @@ public class TotalFreedomMod extends JavaPlugin
return new CleanroomChunkGenerator(id); 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 static class BuildProperties
{ {
public String author; public String author;
@ -236,6 +228,7 @@ public class TotalFreedomMod extends JavaPlugin
try try
{ {
final Properties props; final Properties props;
final String unknown = "unknown";
try (InputStream in = plugin.getResource("build.properties")) try (InputStream in = plugin.getResource("build.properties"))
{ {
@ -243,15 +236,13 @@ public class TotalFreedomMod extends JavaPlugin
props.load(in); props.load(in);
} }
author = props.getProperty("buildAuthor", "unknown"); author = props.getProperty("buildAuthor", unknown);
codename = props.getProperty("buildCodeName", "unknown"); codename = props.getProperty("buildCodeName", unknown);
version = props.getProperty("buildVersion", pluginVersion); version = props.getProperty("buildVersion", pluginVersion);
number = props.getProperty("buildNumber", "1"); number = props.getProperty("buildNumber", "1");
date = props.getProperty("buildDate", "unknown"); 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);
head = props.getProperty("buildHead", "unknown").replace("${git.commit.id.abbrev}", "unknown"); } catch (Exception ex)
}
catch (Exception ex)
{ {
FLog.severe("Could not load build properties! Did you compile with NetBeans/Maven?"); FLog.severe("Could not load build properties! Did you compile with NetBeans/Maven?");
FLog.severe(ex); FLog.severe(ex);
@ -284,7 +275,6 @@ public class TotalFreedomMod extends JavaPlugin
wm = new WorldManager(); wm = new WorldManager();
sql = new SQLite(); sql = new SQLite();
al = new AdminList(); al = new AdminList();
acl = new ActivityLog();
rm = new RankManager(); rm = new RankManager();
cb = new CommandBlocker(); cb = new CommandBlocker();
eb = new EventBlocker(); eb = new EventBlocker();
@ -297,15 +287,15 @@ public class TotalFreedomMod extends JavaPlugin
as = new AntiSpam(); as = new AntiSpam();
wr = new WorldRestrictions(); wr = new WorldRestrictions();
pl = new PlayerList(); pl = new PlayerList();
sh = new Shop(); ag = new Aggregator();
vo = new Votifier();
an = new Announcer(); an = new Announcer();
cm = new ChatManager(); cm = new ChatManager();
dc = new Discord();
pul = new PunishmentList(); pul = new PunishmentList();
bm = new BanManager(); bm = new BanManager();
im = new IndefiniteBanList(); im = new IndefiniteBanList();
pem = new PermissionManager();
gr = new GameRuleHandler(); gr = new GameRuleHandler();
ew = new EntityWiper(); ew = new EntityWiper();
vh = new VanishHandler(); vh = new VanishHandler();
@ -335,7 +325,7 @@ public class TotalFreedomMod extends JavaPlugin
esb = new EssentialsBridge(); esb = new EssentialsBridge();
ldb = new LibsDisguisesBridge(); ldb = new LibsDisguisesBridge();
web = new WorldEditBridge(); web = new WorldEditBridge();
wgb = new WorldGuardBridge(); lpb = new LuckPermsBridge();
} }
private void initFun() private void initFun()

View File

@ -1,11 +1,7 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.format.NamedTextColor;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -39,8 +35,7 @@ public class VanishHandler extends FreedomService
if (plugin.al.isVanished(player.getUniqueId())) if (plugin.al.isVanished(player.getUniqueId()))
{ {
plugin.esb.setVanished(player.getName(), true); plugin.esb.setVanished(player.getName(), true);
FLog.info(player.getName() + " joined while still vanished."); plugin.cm.messageAllAdmins("<yellow><player> has joined silently.", Placeholder.unparsed("player", player.getName()));
plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has joined silently.");
event.joinMessage(null); event.joinMessage(null);
new BukkitRunnable() new BukkitRunnable()
@ -50,9 +45,8 @@ public class VanishHandler extends FreedomService
{ {
if (plugin.al.isVanished(player.getUniqueId())) if (plugin.al.isVanished(player.getUniqueId()))
{ {
player.sendActionBar(Component.text("You are hidden from other players.").color(NamedTextColor.GOLD)); player.sendActionBar(FUtil.miniMessage("<gold>You are hidden from other players."));
} } else
else
{ {
this.cancel(); this.cancel();
} }
@ -69,8 +63,7 @@ public class VanishHandler extends FreedomService
if (plugin.al.isVanished(player.getUniqueId())) if (plugin.al.isVanished(player.getUniqueId()))
{ {
event.quitMessage(null); event.quitMessage(null);
FLog.info(player.getName() + " left while still vanished."); plugin.cm.messageAllAdmins("<yellow><player> has left silently.", Placeholder.unparsed("player", player.getName()));
plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has left silently.");
} }
} }
} }

View File

@ -1,12 +1,8 @@
package me.totalfreedom.totalfreedommod.admin; package me.totalfreedom.totalfreedommod.admin;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.player.FPlayer; 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.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@ -14,12 +10,16 @@ import org.bukkit.Bukkit;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
public class Admin public class Admin
{ {
private final List<String> ips = new ArrayList<>(); private final List<String> ips = new ArrayList<>();
private UUID uuid; private UUID uuid;
private boolean active = true; private boolean active = true;
private Rank rank = Rank.ADMIN; private DisplayableGroup rank = TotalFreedomMod.getPlugin().getHierarchy().groups().getAdmin();
private Date lastLogin = new Date(); private Date lastLogin = new Date();
private Boolean commandSpy = false; private Boolean commandSpy = false;
private Boolean potionSpy = false; private Boolean potionSpy = false;
@ -37,15 +37,17 @@ public class Admin
{ {
this.uuid = UUID.fromString(resultSet.getString("uuid")); this.uuid = UUID.fromString(resultSet.getString("uuid"));
this.active = resultSet.getBoolean("active"); this.active = resultSet.getBoolean("active");
this.rank = Rank.findRank(resultSet.getString("rank")); this.rank = TotalFreedomMod.getPlugin()
.getHierarchy()
.groups()
.fromString(resultSet.getString("rank"));
this.ips.clear(); this.ips.clear();
this.ips.addAll(FUtil.stringToList(resultSet.getString("ips"))); this.ips.addAll(FUtil.stringToList(resultSet.getString("ips")));
this.lastLogin = new Date(resultSet.getLong("last_login")); this.lastLogin = new Date(resultSet.getLong("last_login"));
this.commandSpy = resultSet.getBoolean("command_spy"); this.commandSpy = resultSet.getBoolean("command_spy");
this.potionSpy = resultSet.getBoolean("potion_spy"); this.potionSpy = resultSet.getBoolean("potion_spy");
this.acFormat = resultSet.getString("ac_format"); this.acFormat = resultSet.getString("ac_format");
} } catch (SQLException e)
catch (SQLException e)
{ {
FLog.severe("Failed to load admin: " + e.getMessage()); FLog.severe("Failed to load admin: " + e.getMessage());
} }
@ -69,18 +71,17 @@ public class Admin
public Map<String, Object> toSQLStorable() public Map<String, Object> toSQLStorable()
{ {
Map<String, Object> map = new HashMap<String, Object>() HashMap<String, Object> map = new HashMap<>();
{{ map.put("uuid", uuid.toString());
put("uuid", uuid.toString()); map.put("active", active);
put("active", active); map.put("rank", rank.toString());
put("rank", rank.toString()); map.put("ips", FUtil.listToString(ips));
put("ips", FUtil.listToString(ips)); map.put("last_login", lastLogin.getTime());
put("last_login", lastLogin.getTime()); map.put("command_spy", commandSpy);
put("command_spy", commandSpy); map.put("potion_spy", potionSpy);
put("potion_spy", potionSpy); map.put("ac_format", acFormat);
put("ac_format", acFormat);
}};
return map; return map;
} }
// Util IP methods // Util IP methods
@ -148,50 +149,58 @@ public class Admin
if (!active) if (!active)
{ {
if (getRank().isAtLeast(Rank.ADMIN)) setActiveSplitWorkToReduceComplexity(plugin);
{
if (plugin.btb != null)
{
plugin.btb.killTelnetSessions(getName());
}
// Ensure admins don't have admin functionality when removed (FS-222)
AdminList.vanished.remove(getName());
if (plugin.esb != null)
{
plugin.esb.setVanished(getName(), false);
}
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() private void setActiveSplitWorkToReduceComplexity(TotalFreedomMod plugin)
{
if (getRank().weightCheckAgainst(TotalFreedomMod.getPlugin()
.getHierarchy()
.groups()
.getAdmin()))
{
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);
}
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 DisplayableGroup getRank()
{ {
return rank; return rank;
} }
public void setRank(Rank rank) public void setRank(DisplayableGroup rank)
{ {
this.rank = rank; this.rank = rank;
} }

View File

@ -2,18 +2,20 @@ package me.totalfreedom.totalfreedommod.admin;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
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.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class AdminList extends FreedomService public class AdminList extends FreedomService
{ {
@ -35,6 +37,7 @@ public class AdminList extends FreedomService
@Override @Override
public void onStop() public void onStop()
{ {
// This does nothing. This comment is here to prevent SonarLint from complaining.
} }
public void load() public void load()
@ -45,19 +48,9 @@ public class AdminList extends FreedomService
ResultSet adminSet = plugin.sql.getAdminList(); ResultSet adminSet = plugin.sql.getAdminList();
while (adminSet.next()) while (adminSet.next())
{ {
try tryAddAdmin(adminSet);
{
Admin admin = new Admin(adminSet);
allAdmins.add(admin);
}
catch (Throwable ex)
{
FLog.warning("An error occurred whilst reading the admin entry at row #" + adminSet.getRow());
FLog.warning(ex);
}
} }
} } catch (SQLException e)
catch (SQLException e)
{ {
FLog.severe("Failed to load admin list: " + e.getMessage()); FLog.severe("Failed to load admin list: " + e.getMessage());
} }
@ -66,17 +59,24 @@ public class AdminList extends FreedomService
FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)"); FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)");
} }
public void messageAllAdmins(String message) private void tryAddAdmin(ResultSet adminSet) throws SQLException
{ {
for (Player player : server.getOnlinePlayers()) try
{ {
if (isAdmin(player)) Admin admin = new Admin(adminSet);
{ allAdmins.add(admin);
player.sendMessage(message); } catch (Throwable ex)
} {
FLog.warning("An error occurred whilst reading the admin entry at row #" + adminSet.getRow());
FLog.warning(ex);
} }
} }
public void messageAllAdmins(Component message)
{
server.getOnlinePlayers().stream().filter(this::isAdmin).forEach(player -> player.sendMessage(message));
}
public void potionSpyMessage(String message) public void potionSpyMessage(String message)
{ {
for (Player player : server.getOnlinePlayers()) for (Player player : server.getOnlinePlayers())
@ -101,12 +101,19 @@ public class AdminList extends FreedomService
return true; return true;
} }
Admin admin = getAdmin((Player)sender); Admin admin = getAdmin((Player) sender);
return admin != null && admin.isActive(); return admin != null && admin.isActive();
} }
public boolean isAdmin(Player player) public boolean isAdmin(Player player)
{
if (TotalFreedomMod.getPlugin().getHierarchy().isUserOnAdminTrack(player)) return true;
return isAdmin((OfflinePlayer) player);
}
public boolean isAdmin(OfflinePlayer player)
{ {
if (player == null) if (player == null)
{ {
@ -118,38 +125,19 @@ public class AdminList extends FreedomService
return admin != null && admin.isActive(); return admin != null && admin.isActive();
} }
public boolean isSeniorAdmin(CommandSender sender)
{
Admin admin = getAdmin(sender);
if (admin == null)
{
return false;
}
return admin.getRank().ordinal() >= Rank.SENIOR_ADMIN.ordinal();
}
public Admin getAdmin(CommandSender sender) public Admin getAdmin(CommandSender sender)
{ {
if (sender instanceof Player) if (sender instanceof Player player)
{ {
return getAdmin((Player)sender); return getAdmin(player);
} }
return getEntryByName(sender.getName()); return getEntryByName(sender.getName());
} }
public Admin getAdmin(Player player) public Admin getAdmin(OfflinePlayer player)
{ {
final String ip = FUtil.getIp(player); return getEntryByUuid(player.getUniqueId());
final Admin entry = getEntryByUuid(player.getUniqueId());
if (entry != null && !entry.getIps().contains(ip))
{
entry.addIp(ip);
}
return entry;
} }
public Admin getEntryByUuid(UUID uuid) public Admin getEntryByUuid(UUID uuid)
@ -167,6 +155,12 @@ public class AdminList extends FreedomService
return ipTable.get(ip); return ipTable.get(ip);
} }
// To cast against OfflinePlayer
public Admin getAdmin(Player player)
{
return getAdmin((OfflinePlayer) player);
}
public void updateLastLogin(Player player) public void updateLastLogin(Player player)
{ {
final Admin admin = getAdmin(player); final Admin admin = getAdmin(player);
@ -179,12 +173,12 @@ public class AdminList extends FreedomService
save(admin); save(admin);
} }
public boolean addAdmin(Admin admin) public void addAdmin(Admin admin)
{ {
if (!admin.isValid()) if (!admin.isValid())
{ {
FLog.warning("Could not add admin: " + admin.getName() + ". Admin is missing details!"); FLog.warning("Could not add admin: " + admin.getName() + ". Admin is missing details!");
return false; return;
} }
// Store admin, update views // Store admin, update views
@ -193,18 +187,13 @@ public class AdminList extends FreedomService
// Save admin // Save admin
plugin.sql.addAdmin(admin); plugin.sql.addAdmin(admin);
return true;
} }
public boolean removeAdmin(Admin admin) public boolean removeAdmin(Admin admin)
{ {
if (admin.getRank().isAtLeast(Rank.ADMIN)) if (admin.getRank().weightCheckAgainst(TotalFreedomMod.getPlugin().getHierarchy().groups().getAdmin()) && (plugin.btb != null))
{ {
if (plugin.btb != null) plugin.btb.killTelnetSessions(admin.getName());
{
plugin.btb.killTelnetSessions(admin.getName());
}
} }
// Remove admin, update views // Remove admin, update views
@ -265,13 +254,13 @@ public class AdminList extends FreedomService
ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid()); ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid());
for (Map.Entry<String, Object> entry : admin.toSQLStorable().entrySet()) for (Map.Entry<String, Object> entry : admin.toSQLStorable().entrySet())
{ {
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null) Object storedValue = plugin.sql.getValue(currentSave, 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()); plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue());
} }
} }
} } catch (SQLException e)
catch (SQLException e)
{ {
FLog.severe("Failed to save admin: " + e.getMessage()); FLog.severe("Failed to save admin: " + e.getMessage());
} }
@ -279,29 +268,24 @@ public class AdminList extends FreedomService
public void deactivateOldEntries(boolean verbose) public void deactivateOldEntries(boolean verbose)
{ {
for (Admin admin : allAdmins) allAdmins.stream()
{ .filter(admin -> admin.isActive() &&
if (!admin.isActive() || admin.getRank().isAtLeast(Rank.SENIOR_ADMIN)) !admin.getRank().weightCheckAgainst(TotalFreedomMod.getPlugin().getHierarchy().groups().getSeniorAdmin()))
{ .forEach(admin ->
continue; {
} final Date lastLogin = admin.getLastLogin();
final long lastLoginHours = TimeUnit.HOURS.convert(new Date().getTime() - lastLogin.getTime(), TimeUnit.MILLISECONDS);
final Date lastLogin = admin.getLastLogin(); if (lastLoginHours < ConfigEntry.ADMINLIST_CLEAN_THESHOLD_HOURS.getInteger())
final long lastLoginHours = TimeUnit.HOURS.convert(new Date().getTime() - lastLogin.getTime(), TimeUnit.MILLISECONDS); {
return;
if (lastLoginHours < ConfigEntry.ADMINLIST_CLEAN_THESHOLD_HOURS.getInteger()) }
{ if (verbose)
continue; {
} FUtil.adminAction("TotalFreedomMod", "Deactivating admin " + admin.getName() + ", inactive for " + lastLoginHours + " hours", true);
}
if (verbose) admin.setActive(false);
{ save(admin);
FUtil.adminAction("TotalFreedomMod", "Deactivating admin " + admin.getName() + ", inactive for " + lastLoginHours + " hours", true); });
}
admin.setActive(false);
save(admin);
}
updateTables(); updateTables();
} }

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,7 @@
package me.totalfreedom.totalfreedommod.api;
@FunctionalInterface
public interface Interpolator
{
double[] interpolate(double from, double to, int max);
}

View File

@ -1,4 +1,4 @@
package me.totalfreedom.totalfreedommod.shop; package me.totalfreedom.totalfreedommod.api;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -66,8 +66,7 @@ public enum ShopItem
try try
{ {
return ShopItem.valueOf(string.toUpperCase()); return ShopItem.valueOf(string.toUpperCase());
} } catch (Exception ignored)
catch (Exception ignored)
{ {
} }

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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 final HandlerList handlerList = new HandlerList();
//--
private final Key identifier;
private final Component name;
private final Displayable displayable;
private final Component message;
private Component prefix = Component.empty();
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;
}
}

View File

@ -1,21 +1,16 @@
package me.totalfreedom.totalfreedommod.banning; package me.totalfreedom.totalfreedommod.banning;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.*;
public class Ban public class Ban
{ {
@ -168,12 +163,10 @@ public class Ban
if (!hasUsername()) if (!hasUsername())
{ {
message.append("r IP address is"); message.append("r IP address is");
} } else if (!hasIps())
else if (!hasIps())
{ {
message.append("r username is"); message.append("r username is");
} } else
else
{ {
message.append(" are"); message.append(" are");
} }
@ -222,7 +215,7 @@ public class Ban
return false; return false;
} }
final Ban ban = (Ban)object; final Ban ban = (Ban) object;
if (hasIps() != ban.hasIps() if (hasIps() != ban.hasIps()
|| hasUsername() != ban.hasUsername()) || hasUsername() != ban.hasUsername())
{ {

View File

@ -2,16 +2,6 @@ package me.totalfreedom.totalfreedommod.banning;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; 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.FreedomService;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -21,6 +11,10 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
public class BanManager extends FreedomService public class BanManager extends FreedomService
{ {
@ -56,8 +50,7 @@ public class BanManager extends FreedomService
bans.add(ban); bans.add(ban);
} }
} }
} } catch (SQLException e)
catch (SQLException e)
{ {
FLog.severe("Failed to load ban list: " + e.getMessage()); FLog.severe("Failed to load ban list: " + e.getMessage());
} }
@ -71,6 +64,7 @@ public class BanManager extends FreedomService
@Override @Override
public void onStop() public void onStop()
{ {
// This does nothing. This comment is here to prevent SonarLint from complaining.
} }
public Set<Ban> getAllBans() public Set<Ban> getAllBans()
@ -185,8 +179,7 @@ public class BanManager extends FreedomService
if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null) if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null)
{ {
removeBan(ban); removeBan(ban);
} } else
else
{ {
for (String ip : ban.getIps()) for (String ip : ban.getIps())
@ -266,8 +259,7 @@ public class BanManager extends FreedomService
if (ban != null) if (ban != null)
{ {
removeBan(ban); removeBan(ban);
} } else
else
{ {
ban = getByIp(FUtil.getIp(player)); ban = getByIp(FUtil.getIp(player));
if (ban != null) if (ban != null)

View File

@ -1,15 +1,16 @@
package me.totalfreedom.totalfreedommod.banning; package me.totalfreedom.totalfreedommod.banning;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import me.totalfreedom.totalfreedommod.config.IConfig;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.configuration.ConfigurationSection;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; 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 public class IndefiniteBan implements IConfig
{ {
@ -19,10 +20,6 @@ public class IndefiniteBan implements IConfig
private String reason = null; private String reason = null;
private Date expiry = null; private Date expiry = null;
public IndefiniteBan()
{
}
@Override @Override
public void loadFrom(ConfigurationSection cs) public void loadFrom(ConfigurationSection cs)
{ {
@ -36,8 +33,7 @@ public class IndefiniteBan implements IConfig
UUID uuid = UUID.fromString(strUUID); UUID uuid = UUID.fromString(strUUID);
this.uuid = uuid; this.uuid = uuid;
} }
} } catch (IllegalArgumentException e)
catch (IllegalArgumentException e)
{ {
FLog.warning("Failed to load indefinite banned UUID for " + this.username + ". Make sure the UUID is in the correct format with dashes."); FLog.warning("Failed to load indefinite banned UUID for " + this.username + ". Make sure the UUID is in the correct format with dashes.");
} }
@ -50,8 +46,7 @@ public class IndefiniteBan implements IConfig
try try
{ {
this.expiry = date != null ? new SimpleDateFormat("yyyy-MM-dd").parse(date) : null; this.expiry = date != null ? new SimpleDateFormat("yyyy-MM-dd").parse(date) : null;
} } catch (ParseException ex)
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)."); FLog.warning("Failed to load indefinite banned expiry for " + this.username + ". Make sure the expiry is in the correct format (yyyy-MM-dd).");
} }

View File

@ -2,10 +2,6 @@ package me.totalfreedom.totalfreedommod.banning;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Sets; 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; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.config.YamlConfig; import me.totalfreedom.totalfreedommod.config.YamlConfig;
@ -17,21 +13,21 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.UUID;
public class IndefiniteBanList extends FreedomService public class IndefiniteBanList extends FreedomService
{ {
public static final String CONFIG_FILENAME = "indefinitebans.yml"; public static final String CONFIG_FILENAME = "indefinitebans.yml";
private YamlConfig config;
private final Set<IndefiniteBan> indefBans = Sets.newHashSet(); private final Set<IndefiniteBan> indefBans = Sets.newHashSet();
private int nameBanCount = 0;
private int uuidBanCount = 0;
private int ipBanCount = 0;
private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy, zzzz"); private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy, zzzz");
private YamlConfig config;
private int nameBanCount = 0;
private int uuidBanCount = 0;
private int ipBanCount = 0;
@Override @Override
public void onStart() public void onStart()
@ -79,6 +75,7 @@ public class IndefiniteBanList extends FreedomService
@Override @Override
public void onStop() public void onStop()
{ {
// This does nothing. This comment is here to prevent SonarLint from complaining.
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
@ -98,14 +95,12 @@ public class IndefiniteBanList extends FreedomService
bannedBy = "username"; bannedBy = "username";
ban = indefBan; ban = indefBan;
break; break;
} } else if (indefBan.getUuid() != null && indefBan.getUuid().equals(uuid))
else if (indefBan.getUuid() != null && indefBan.getUuid().equals(uuid))
{ {
bannedBy = "UUID"; bannedBy = "UUID";
ban = indefBan; ban = indefBan;
break; break;
} } else if (indefBan.getIps().contains(ip))
else if (indefBan.getIps().contains(ip))
{ {
bannedBy = "IP address"; bannedBy = "IP address";
ban = indefBan; ban = indefBan;
@ -113,6 +108,11 @@ public class IndefiniteBanList extends FreedomService
} }
} }
onPlayerLoginSplitWorkToReduceComplexity(event, ban, bannedBy);
}
private void onPlayerLoginSplitWorkToReduceComplexity(PlayerLoginEvent event, IndefiniteBan ban, String bannedBy)
{
if (ban != null) if (ban != null)
{ {
if (ban.isExpired()) if (ban.isExpired())
@ -123,8 +123,8 @@ public class IndefiniteBanList extends FreedomService
} }
String kickMessage = ChatColor.RED + "Your " + bannedBy + " is " String kickMessage = ChatColor.RED + "Your " + bannedBy + " is "
+ (ban.hasExpiry() ? "" : "indefinitely ") + (ban.hasExpiry() ? "" : "indefinitely ")
+ "banned from this server."; + "banned from this server.";
String reason = ban.getReason(); String reason = ban.getReason();
if (!Strings.isNullOrEmpty(reason)) if (!Strings.isNullOrEmpty(reason))
{ {

View File

@ -26,6 +26,7 @@ public class BlockBlocker extends FreedomService
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
// TODO: Remove deprecated method. Complexity is also O(35) which is very bad.
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onBlockPlace(BlockPlaceEvent event) public void onBlockPlace(BlockPlaceEvent event)
{ {
@ -139,13 +140,13 @@ public class BlockBlocker extends FreedomService
case PLAYER_HEAD: case PLAYER_HEAD:
case PLAYER_WALL_HEAD: case PLAYER_WALL_HEAD:
{ {
Skull skull = (Skull)event.getBlockPlaced().getState(); Skull skull = (Skull) event.getBlockPlaced().getState();
if (skull.getOwner() != null) if (skull.getOwner() != null)
{ {
if (skull.getOwner().contains("\u00A7")) if (skull.getOwner().contains("\u00A7"))
{ {
skull.setOwner(skull.getOwner().replace("\u00A7", "")); skull.setOwner(skull.getOwner().replace("\u00A7", ""));
SkullMeta meta = (SkullMeta)event.getItemInHand().getItemMeta(); SkullMeta meta = (SkullMeta) event.getItemInHand().getItemMeta();
if (meta != null) if (meta != null)
{ {
ItemStack newHead = new ItemStack(Material.PLAYER_HEAD, 1); ItemStack newHead = new ItemStack(Material.PLAYER_HEAD, 1);

View File

@ -1,12 +1,7 @@
package me.totalfreedom.totalfreedommod.blocking; package me.totalfreedom.totalfreedommod.blocking;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/* TODO This will have to be changed from com.github.atlasmediagroup.scissors to me.totalfreedom.scissors when we migrate to 1.19 */
import com.github.atlasmediagroup.scissors.event.block.MasterBlockFireEvent;
import io.papermc.paper.event.player.PlayerSignCommandPreprocessEvent; import io.papermc.paper.event.player.PlayerSignCommandPreprocessEvent;
import me.totalfreedom.scissors.event.block.MasterBlockFireEvent;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -22,17 +17,15 @@ import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.block.*; import org.bukkit.event.block.*;
import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.*;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.event.entity.FireworkExplodeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
public class EventBlocker extends FreedomService public class EventBlocker extends FreedomService
{ {
/** /**

View File

@ -66,6 +66,7 @@ public class InteractBlocker extends FreedomService
} }
} }
// TODO: Current cognitive complexity is O(24). This is too high.
private void handleRightClick(PlayerInteractEvent event) private void handleRightClick(PlayerInteractEvent event)
{ {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
@ -87,13 +88,11 @@ public class InteractBlocker extends FreedomService
if (mat == Material.MOOSHROOM_SPAWN_EGG) if (mat == Material.MOOSHROOM_SPAWN_EGG)
{ {
eggType = EntityType.MUSHROOM_COW; eggType = EntityType.MUSHROOM_COW;
} } else
else
{ {
eggType = EntityType.valueOf(mat.name().substring(0, mat.name().length() - 10)); eggType = EntityType.valueOf(mat.name().substring(0, mat.name().length() - 10));
} }
} } catch (IllegalArgumentException ignored)
catch (IllegalArgumentException ignored)
{ {
// //
} }

View File

@ -1,24 +1,17 @@
package me.totalfreedom.totalfreedommod.blocking; package me.totalfreedom.totalfreedommod.blocking;
import java.util.Objects;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attributable;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import org.bukkit.entity.Bat; import org.bukkit.entity.*;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Ghast;
import org.bukkit.entity.Giant;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Slime;
import org.bukkit.entity.Wither;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.EntitySpawnEvent;
import java.util.Objects;
public class MobBlocker extends FreedomService public class MobBlocker extends FreedomService
{ {
@Override @Override
@ -43,17 +36,18 @@ public class MobBlocker extends FreedomService
Entity entity = e.getEntity(); Entity entity = e.getEntity();
if (entity instanceof Attributable) if (entity instanceof Attributable)
{ {
if (Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).getBaseValue() > 255.0) if (Objects.requireNonNull(((Attributable) entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).getBaseValue() > 255.0)
{ {
Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).setBaseValue(255.0); Objects.requireNonNull(((Attributable) entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).setBaseValue(255.0);
} }
if (Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).getBaseValue() > 10.0) if (Objects.requireNonNull(((Attributable) entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).getBaseValue() > 10.0)
{ {
Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).setBaseValue(10.0); Objects.requireNonNull(((Attributable) entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).setBaseValue(10.0);
} }
} }
} }
// TODO: Complexity for this method is too high [O(23)]. This needs to be fixed.
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onCreatureSpawn(CreatureSpawnEvent event) public void onCreatureSpawn(CreatureSpawnEvent event)
{ {
@ -71,40 +65,35 @@ public class MobBlocker extends FreedomService
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} } else if (spawned instanceof Ghast)
else if (spawned instanceof Ghast)
{ {
if (ConfigEntry.MOB_LIMITER_DISABLE_GHAST.getBoolean()) if (ConfigEntry.MOB_LIMITER_DISABLE_GHAST.getBoolean())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} } else if (spawned instanceof Slime)
else if (spawned instanceof Slime)
{ {
if (ConfigEntry.MOB_LIMITER_DISABLE_SLIME.getBoolean()) if (ConfigEntry.MOB_LIMITER_DISABLE_SLIME.getBoolean())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} } else if (spawned instanceof Wither)
else if (spawned instanceof Wither)
{ {
if (ConfigEntry.MOB_LIMITER_DISABLE_DRAGON.getBoolean()) if (ConfigEntry.MOB_LIMITER_DISABLE_DRAGON.getBoolean())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} } else if (spawned instanceof Giant)
else if (spawned instanceof Giant)
{ {
if (ConfigEntry.MOB_LIMITER_DISABLE_GIANT.getBoolean()) if (ConfigEntry.MOB_LIMITER_DISABLE_GIANT.getBoolean())
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} } else if (spawned instanceof Bat)
else if (spawned instanceof Bat)
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;

View File

@ -3,11 +3,7 @@ package me.totalfreedom.totalfreedommod.blocking;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.entity.Arrow; import org.bukkit.entity.*;
import org.bukkit.entity.FishHook;
import org.bukkit.entity.Player;
import org.bukkit.entity.SpectralArrow;
import org.bukkit.entity.Trident;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
@ -24,6 +20,7 @@ public class PVPBlocker extends FreedomService
{ {
} }
// TODO: Complexity is O(26). This needs to be reduced.
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) public void onEntityDamageByEntity(EntityDamageByEntityEvent event)
{ {
@ -31,63 +28,56 @@ public class PVPBlocker extends FreedomService
Player target = null; Player target = null;
if (event.getEntity() instanceof Player) if (event.getEntity() instanceof Player)
{ {
target = (Player)event.getEntity(); target = (Player) event.getEntity();
if (event.getDamager() instanceof Player) if (event.getDamager() instanceof Player)
{ {
player = (Player)event.getDamager(); player = (Player) event.getDamager();
} } else if (event.getDamager() instanceof Arrow)
else if (event.getDamager() instanceof Arrow)
{ {
Arrow arrow = (Arrow)event.getDamager(); Arrow arrow = (Arrow) event.getDamager();
if (arrow.getShooter() instanceof Player) if (arrow.getShooter() instanceof Player)
{ {
player = (Player)arrow.getShooter(); player = (Player) arrow.getShooter();
} }
} } else if (event.getDamager() instanceof SpectralArrow)
else if (event.getDamager() instanceof SpectralArrow)
{ {
SpectralArrow spectralArrow = (SpectralArrow)event.getDamager(); SpectralArrow spectralArrow = (SpectralArrow) event.getDamager();
if (spectralArrow.getShooter() instanceof Player) if (spectralArrow.getShooter() instanceof Player)
{ {
player = (Player)spectralArrow.getShooter(); player = (Player) spectralArrow.getShooter();
} }
} } else if (event.getDamager() instanceof Trident)
else if (event.getDamager() instanceof Trident)
{ {
Trident trident = (Trident)event.getDamager(); Trident trident = (Trident) event.getDamager();
if (trident.getShooter() instanceof Player) if (trident.getShooter() instanceof Player)
{ {
player = (Player)trident.getShooter(); player = (Player) trident.getShooter();
} }
} } else if (event.getDamager() instanceof FishHook)
else if (event.getDamager() instanceof FishHook)
{ {
FishHook fishhook = (FishHook)event.getDamager(); FishHook fishhook = (FishHook) event.getDamager();
if (fishhook.getShooter() instanceof Player) if (fishhook.getShooter() instanceof Player)
{ {
player = (Player)fishhook.getShooter(); player = (Player) fishhook.getShooter();
} }
} }
} }
if (player != null & !plugin.al.isAdmin(player)) if (player != null && !plugin.al.isAdmin(player))
{ {
if (player.getGameMode() == GameMode.CREATIVE) if (player.getGameMode() == GameMode.CREATIVE)
{ {
player.sendMessage(ChatColor.RED + "Creative PvP is not allowed!"); player.sendMessage(ChatColor.RED + "Creative PvP is not allowed!");
event.setCancelled(true); event.setCancelled(true);
} } else if (plugin.esb.getEssentialsUser(player.getName()).isGodModeEnabled())
else if (plugin.esb.getEssentialsUser(player.getName()).isGodModeEnabled())
{ {
player.sendMessage(ChatColor.RED + "God mode PvP is not allowed!"); player.sendMessage(ChatColor.RED + "God mode PvP is not allowed!");
event.setCancelled(true); event.setCancelled(true);
} } else if (plugin.pl.getPlayer(target).isPvpBlocked())
else if (plugin.pl.getPlayer(target).isPvpBlocked())
{ {
player.sendMessage(ChatColor.RED + target.getName() + " has PvP disabled!"); player.sendMessage(ChatColor.RED + target.getName() + " has PvP disabled!");
event.setCancelled(true); event.setCancelled(true);
} } else if (plugin.pl.getPlayer(player).isPvpBlocked())
else if (plugin.pl.getPlayer(player).isPvpBlocked())
{ {
player.sendMessage(ChatColor.RED + "You have PvP disabled!"); player.sendMessage(ChatColor.RED + "You have PvP disabled!");
event.setCancelled(true); event.setCancelled(true);

View File

@ -1,6 +1,5 @@
package me.totalfreedom.totalfreedommod.blocking; package me.totalfreedom.totalfreedommod.blocking;
import java.util.Collection;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -13,6 +12,8 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import org.bukkit.projectiles.ProjectileSource; import org.bukkit.projectiles.ProjectileSource;
import java.util.Collection;
public class PotionBlocker extends FreedomService public class PotionBlocker extends FreedomService
{ {
@ -36,7 +37,7 @@ public class PotionBlocker extends FreedomService
Player player = null; Player player = null;
if (projectileSource instanceof Player) if (projectileSource instanceof Player)
{ {
player = (Player)projectileSource; player = (Player) projectileSource;
} }
if (isDeathPotion(potion.getEffects())) if (isDeathPotion(potion.getEffects()))
@ -57,7 +58,7 @@ public class PotionBlocker extends FreedomService
Player player = null; Player player = null;
if (projectileSource instanceof Player) if (projectileSource instanceof Player)
{ {
player = (Player)projectileSource; player = (Player) projectileSource;
} }
if (isDeathPotion(potion.getEffects())) if (isDeathPotion(potion.getEffects()))

View File

@ -2,11 +2,6 @@ package me.totalfreedom.totalfreedommod.blocking.command;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
@ -16,11 +11,14 @@ import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandMap; import org.bukkit.command.CommandMap;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.plugin.SimplePluginManager;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CommandBlocker extends FreedomService public class CommandBlocker extends FreedomService
{ {
@ -30,24 +28,6 @@ public class CommandBlocker extends FreedomService
private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap(); private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap();
private final List<String> unknownCommands = Lists.newArrayList(); 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 @Override
public void onStart() public void onStart()
{ {
@ -60,15 +40,15 @@ public class CommandBlocker extends FreedomService
entryList.clear(); entryList.clear();
} }
public void load() public void load() // TODO: Complexity is 21. Need to fix this.
{ {
entryList.clear(); entryList.clear();
unknownCommands.clear(); unknownCommands.clear();
final CommandMap commandMap = getCommandMap(); final CommandMap commandMap = Bukkit.getCommandMap();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<String> blockedCommands = (List<String>)ConfigEntry.BLOCKED_COMMANDS.getList(); List<String> blockedCommands = (List<String>) ConfigEntry.BLOCKED_COMMANDS.getList();
for (String rawEntry : blockedCommands) for (String rawEntry : blockedCommands)
{ {
final String[] parts = rawEntry.split(":"); final String[] parts = rawEntry.split(":");
@ -104,8 +84,7 @@ public class CommandBlocker extends FreedomService
if (command == null) if (command == null)
{ {
unknownCommands.add(commandName); unknownCommands.add(commandName);
} } else
else
{ {
commandName = command.getName().toLowerCase(); commandName = command.getName().toLowerCase();
} }
@ -147,6 +126,7 @@ public class CommandBlocker extends FreedomService
return isCommandBlocked(command, sender, false); 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) public boolean isCommandBlocked(String command, CommandSender sender, boolean doAction)
{ {
if (command == null || command.isEmpty()) if (command == null || command.isEmpty())

View File

@ -39,7 +39,7 @@ public class CommandBlockerEntry
{ {
if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player) if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player)
{ {
TotalFreedomMod.getPlugin().ae.autoEject((Player)sender, "You used a prohibited command: " + command); TotalFreedomMod.getPlugin().ae.autoEject((Player) sender, "You used a prohibited command: " + command);
FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED); FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED);
return; return;
} }

View File

@ -2,7 +2,6 @@ package me.totalfreedom.totalfreedommod.blocking.command;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.rank.Rank;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
public enum CommandBlockerRank public enum CommandBlockerRank
@ -25,7 +24,7 @@ public enum CommandBlockerRank
Admin admin = TotalFreedomMod.getPlugin().al.getAdmin(sender); Admin admin = TotalFreedomMod.getPlugin().al.getAdmin(sender);
if (admin != null) if (admin != null)
{ {
if (admin.getRank() == Rank.SENIOR_ADMIN) if (admin.getRank() == TotalFreedomMod.getPlugin().getHierarchy().groups().getSeniorAdmin())
{ {
return SENIOR_ADMIN; return SENIOR_ADMIN;
} }

View File

@ -1,22 +1,24 @@
package me.totalfreedom.totalfreedommod.bridge; 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.BukkitTelnet;
import me.totalfreedom.bukkittelnet.api.TelnetCommandEvent; import me.totalfreedom.bukkittelnet.api.TelnetCommandEvent;
import me.totalfreedom.bukkittelnet.api.TelnetPreLoginEvent; import me.totalfreedom.bukkittelnet.api.TelnetPreLoginEvent;
import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent; import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent;
import me.totalfreedom.bukkittelnet.session.ClientSession; import me.totalfreedom.bukkittelnet.session.ClientSession;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Deprecated
public class BukkitTelnetBridge extends FreedomService public class BukkitTelnetBridge extends FreedomService
{ {
@ -44,7 +46,7 @@ public class BukkitTelnetBridge extends FreedomService
final Admin admin = plugin.al.getEntryByIp(ip); final Admin admin = plugin.al.getEntryByIp(ip);
if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant()) if (admin == null || !admin.isActive())
{ {
return; return;
} }
@ -80,8 +82,8 @@ public class BukkitTelnetBridge extends FreedomService
boolean active = admin.isActive(); boolean active = admin.isActive();
isAdmin = active; isAdmin = active;
isSeniorAdmin = active && admin.getRank() == Rank.SENIOR_ADMIN; isSeniorAdmin = active && admin.getRank().equals(TotalFreedomMod.getPlugin().getHierarchy().groups().getSeniorAdmin());
isTelnetAdmin = active && (isSeniorAdmin || admin.getRank() == Rank.ADMIN); isTelnetAdmin = active && (isSeniorAdmin || admin.getRank().equals(TotalFreedomMod.getPlugin().getHierarchy().groups().getAdmin()));
} }
playerTags.put("tfm.admin.isAdmin", isAdmin); playerTags.put("tfm.admin.isAdmin", isAdmin);
@ -106,10 +108,9 @@ public class BukkitTelnetBridge extends FreedomService
final Plugin bukkitTelnet = server.getPluginManager().getPlugin("BukkitTelnet"); final Plugin bukkitTelnet = server.getPluginManager().getPlugin("BukkitTelnet");
if (bukkitTelnet instanceof BukkitTelnet) if (bukkitTelnet instanceof BukkitTelnet)
{ {
bukkitTelnetPlugin = (BukkitTelnet)bukkitTelnet; bukkitTelnetPlugin = (BukkitTelnet) bukkitTelnet;
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -159,8 +160,7 @@ public class BukkitTelnetBridge extends FreedomService
{ {
telnet.appender.removeSession(session); telnet.appender.removeSession(session);
session.syncTerminateSession(); session.syncTerminateSession();
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe("Error removing single telnet session: " + ex.getMessage()); 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."); FLog.info(sessionsToRemove.size() + " telnet session(s) removed.");
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe("Error removing telnet sessions: " + ex.getMessage()); FLog.severe("Error removing telnet sessions: " + ex.getMessage());
} }

View File

@ -1,8 +1,5 @@
package me.totalfreedom.totalfreedommod.bridge; package me.totalfreedom.totalfreedommod.bridge;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -26,6 +23,9 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.*;
import java.util.concurrent.CompletableFuture;
public class CoreProtectBridge extends FreedomService public class CoreProtectBridge extends FreedomService
{ {
//-- Block Inspector --// //-- Block Inspector --//
@ -69,10 +69,9 @@ public class CoreProtectBridge extends FreedomService
assert coreProtectPlugin != null; assert coreProtectPlugin != null;
if (coreProtectPlugin instanceof CoreProtect) if (coreProtectPlugin instanceof CoreProtect)
{ {
coreProtect = (CoreProtect)coreProtectPlugin; coreProtect = (CoreProtect) coreProtectPlugin;
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -94,8 +93,7 @@ public class CoreProtectBridge extends FreedomService
{ {
return null; return null;
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -166,6 +164,7 @@ public class CoreProtectBridge extends FreedomService
return historyMap.get(player.getUniqueId()); 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) public void showPageToPlayer(Player player, FUtil.PaginationList<CoreProtectAPI.ParseResult> results, int pageNum)
{ {
if (player == null || !player.isOnline()) if (player == null || !player.isOnline())
@ -178,8 +177,7 @@ public class CoreProtectBridge extends FreedomService
if (page == null || page.isEmpty()) if (page == null || page.isEmpty())
{ {
player.sendMessage(prefix.append(Component.text("No results were found.", NamedTextColor.WHITE))); player.sendMessage(prefix.append(Component.text("No results were found.", NamedTextColor.WHITE)));
} } else
else
{ {
// This shouldn't change at all in any of the other entries, so this should be safe // 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(), Component location = Component.text(String.format("(%s, %s, %s)", results.get(0).getX(),
@ -220,7 +218,7 @@ public class CoreProtectBridge extends FreedomService
line.append(symbol).append(Component.text(entry.getPlayer()).color(TextColor.color(0x30ade4))) line.append(symbol).append(Component.text(entry.getPlayer()).color(TextColor.color(0x30ade4)))
.append(action.color(NamedTextColor.WHITE)).append( .append(action.color(NamedTextColor.WHITE)).append(
Component.text(entry.getBlockData().getMaterial().name().toLowerCase()) Component.text(entry.getBlockData().getMaterial().name().toLowerCase())
.color(TextColor.color(0x30ade4))); .color(TextColor.color(0x30ade4)));
// Rolled back? // Rolled back?
if (entry.isRolledBack()) if (entry.isRolledBack())
@ -326,8 +324,7 @@ public class CoreProtectBridge extends FreedomService
if (results.isEmpty()) if (results.isEmpty())
{ {
player.sendMessage(prefix.append(Component.text("No results were found.").color(NamedTextColor.WHITE))); player.sendMessage(prefix.append(Component.text("No results were found.").color(NamedTextColor.WHITE)));
} } else
else
{ {
showPageToPlayer(player, results, 1); showPageToPlayer(player, results, 1);
} }

View File

@ -4,9 +4,8 @@ import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User; import com.earth2me.essentials.User;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.player.FPlayer; 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.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -14,7 +13,6 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
@ -28,11 +26,13 @@ public class EssentialsBridge extends FreedomService
@Override @Override
public void onStart() public void onStart()
{ {
// This is completely useless, but it's here to make sure the service is loaded.
} }
@Override @Override
public void onStop() public void onStop()
{ {
essentialsPlugin = null;
} }
public Essentials getEssentialsPlugin() public Essentials getEssentialsPlugin()
@ -43,12 +43,11 @@ public class EssentialsBridge extends FreedomService
{ {
final Plugin essentials = server.getPluginManager().getPlugin("Essentials"); final Plugin essentials = server.getPluginManager().getPlugin("Essentials");
assert essentials != null; assert essentials != null;
if (essentials instanceof Essentials) if (essentials instanceof Essentials e)
{ {
essentialsPlugin = (Essentials)essentials; essentialsPlugin = e;
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -65,8 +64,7 @@ public class EssentialsBridge extends FreedomService
{ {
return essentials.getUserMap().getUser(username); return essentials.getUserMap().getUser(username);
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -83,8 +81,7 @@ public class EssentialsBridge extends FreedomService
user.setNickname(nickname); user.setNickname(nickname);
user.setDisplayNick(); user.setDisplayNick();
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -99,8 +96,7 @@ public class EssentialsBridge extends FreedomService
{ {
return user.getNickname(); return user.getNickname();
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -116,8 +112,7 @@ public class EssentialsBridge extends FreedomService
{ {
return user.getLastOnlineActivity(); return user.getLastOnlineActivity();
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -133,8 +128,7 @@ public class EssentialsBridge extends FreedomService
{ {
user.setVanished(vanished); user.setVanished(vanished);
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -146,17 +140,18 @@ public class EssentialsBridge extends FreedomService
Player refreshPlayer = null; Player refreshPlayer = null;
Inventory inventory = event.getView().getTopInventory(); Inventory inventory = event.getView().getTopInventory();
InventoryType inventoryType = inventory.getType(); InventoryType inventoryType = inventory.getType();
Player player = (Player)event.getWhoClicked(); Player player = (Player) event.getWhoClicked();
FPlayer fPlayer = plugin.pl.getPlayer(player); FPlayer fPlayer = plugin.pl.getPlayer(player);
if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee()) if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee())
{ {
final InventoryHolder inventoryHolder = inventory.getHolder(); final InventoryHolder inventoryHolder = inventory.getHolder();
if (inventoryHolder instanceof HumanEntity) if (inventoryHolder instanceof HumanEntity)
{ {
Player invOwner = (Player)inventoryHolder; Player invOwner = (Player) inventoryHolder;
Rank recieverRank = plugin.rm.getRank(player); DisplayableGroup recieverRank = plugin.rm.getRank(player);
Rank playerRank = plugin.rm.getRank(invOwner); DisplayableGroup playerRank = plugin.rm.getRank(invOwner);
if (playerRank.ordinal() >= recieverRank.ordinal() || !invOwner.isOnline()) if (playerRank.getWeight().getWeight() >= recieverRank.getWeight().getWeight()
|| !invOwner.isOnline())
{ {
event.setCancelled(true); event.setCancelled(true);
refreshPlayer = player; refreshPlayer = player;
@ -183,7 +178,7 @@ public class EssentialsBridge extends FreedomService
Player refreshPlayer = null; Player refreshPlayer = null;
Inventory inventory = event.getView().getTopInventory(); Inventory inventory = event.getView().getTopInventory();
InventoryType inventoryType = inventory.getType(); InventoryType inventoryType = inventory.getType();
Player player = (Player)event.getPlayer(); Player player = (Player) event.getPlayer();
FPlayer fPlayer = plugin.pl.getPlayer(player); FPlayer fPlayer = plugin.pl.getPlayer(player);
if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee()) if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee())
{ {

View File

@ -5,12 +5,33 @@ import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.LibsDisguises;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public class LibsDisguisesBridge extends FreedomService public class LibsDisguisesBridge extends FreedomService
{ {
private LibsDisguises libsDisguisesPlugin = null; private static LibsDisguises libsDisguisesPlugin = null;
public static LibsDisguises getLibsDisguisesPlugin()
{
if (libsDisguisesPlugin == null)
{
try
{
final Plugin libsDisguises = Bukkit.getServer().getPluginManager().getPlugin("LibsDisguises");
if (libsDisguises instanceof LibsDisguises)
{
libsDisguisesPlugin = (LibsDisguises) libsDisguises;
}
} catch (Exception ex)
{
FLog.severe(ex);
}
}
return libsDisguisesPlugin;
}
@Override @Override
public void onStart() public void onStart()
@ -22,30 +43,6 @@ public class LibsDisguisesBridge extends FreedomService
{ {
} }
public LibsDisguises getLibsDisguisesPlugin()
{
if (libsDisguisesPlugin == null)
{
try
{
final Plugin libsDisguises = server.getPluginManager().getPlugin("LibsDisguises");
if (libsDisguises != null)
{
if (libsDisguises instanceof LibsDisguises)
{
libsDisguisesPlugin = (LibsDisguises)libsDisguises;
}
}
}
catch (Exception ex)
{
FLog.severe(ex);
}
}
return libsDisguisesPlugin;
}
public void undisguiseAll(boolean admin) public void undisguiseAll(boolean admin)
{ {
try try
@ -68,8 +65,7 @@ public class LibsDisguisesBridge extends FreedomService
DisguiseAPI.undisguiseToAll(player); DisguiseAPI.undisguiseToAll(player);
} }
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -80,7 +76,7 @@ public class LibsDisguisesBridge extends FreedomService
return !BlockedDisguises.disabled; return !BlockedDisguises.disabled;
} }
public void setDisguisesEnabled(boolean state) public static void setDisguisesEnabled(boolean state)
{ {
final LibsDisguises libsDisguises = getLibsDisguisesPlugin(); final LibsDisguises libsDisguises = getLibsDisguisesPlugin();

View File

@ -0,0 +1,63 @@
package me.totalfreedom.totalfreedommod.bridge;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
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(TotalFreedomMod.getPlugin().getHierarchy().groups().getNonOp().getLuckPermsGroup());
track.appendGroup(TotalFreedomMod.getPlugin().getHierarchy().groups().getOp().getLuckPermsGroup());
});
}
if (!trackManager.isLoaded("admin"))
{
trackManager.createAndLoadTrack("admin").whenComplete((track, exception) ->
{
track.appendGroup(TotalFreedomMod.getPlugin().getHierarchy().groups().getAdmin().getLuckPermsGroup());
track.appendGroup(TotalFreedomMod.getPlugin().getHierarchy().groups().getSeniorAdmin().getLuckPermsGroup());
});
}
if (!trackManager.isLoaded("builder"))
{
trackManager.createAndLoadTrack("builder").whenComplete((track, exception) ->
track.appendGroup(TotalFreedomMod.getPlugin()
.getHierarchy()
.groups()
.getMasterBuilder()
.getLuckPermsGroup()));
}
}
}

View File

@ -1,7 +1,6 @@
package me.totalfreedom.totalfreedommod.bridge; package me.totalfreedom.totalfreedommod.bridge;
import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.bukkit.BukkitPlayer;
import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
@ -35,11 +34,10 @@ public class WorldEditBridge extends FreedomService
{ {
if (we instanceof WorldEditPlugin) if (we instanceof WorldEditPlugin)
{ {
worldeditPlugin = (WorldEditPlugin)we; worldeditPlugin = (WorldEditPlugin) we;
} }
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -57,8 +55,7 @@ public class WorldEditBridge extends FreedomService
{ {
session.setBlockChangeLimit(limit); session.setBlockChangeLimit(limit);
} }
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
} }
@ -100,8 +97,7 @@ public class WorldEditBridge extends FreedomService
try try
{ {
return wep.getSession(player); return wep.getSession(player);
} } catch (Exception ex)
catch (Exception ex)
{ {
FLog.severe(ex); FLog.severe(ex);
return null; return null;

View File

@ -1,13 +1,14 @@
package me.totalfreedom.totalfreedommod.caging; package me.totalfreedom.totalfreedommod.caging;
import java.util.ArrayList;
import java.util.List;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.Skull; import org.bukkit.block.Skull;
import java.util.ArrayList;
import java.util.List;
public class CageData public class CageData
{ {
@ -74,8 +75,7 @@ public class CageData
} }
block.setType(material); block.setType(material);
} } else
else
{ {
if (Math.abs(xOffset) == length && Math.abs(yOffset) == length && Math.abs(zOffset) == length) if (Math.abs(xOffset) == length && Math.abs(yOffset) == length && Math.abs(zOffset) == length)
{ {
@ -88,12 +88,11 @@ public class CageData
{ {
try try
{ {
Skull skull = (Skull)block.getState(); Skull skull = (Skull) block.getState();
// This may or may not work in future versions of spigot // This may or may not work in future versions of spigot
skull.setOwner(input); skull.setOwner(input);
skull.update(); skull.update();
} } catch (ClassCastException ignored)
catch (ClassCastException ignored)
{ {
} }
} }
@ -124,7 +123,7 @@ public class CageData
this.location = location; this.location = location;
this.outerMaterial = outer; this.outerMaterial = outer;
this.innerMaterial = inner; this.innerMaterial = inner;
input = null; input = null; // TODO: Remove static variable declaration in a non-static block.
buildHistory(location); buildHistory(location);
regenerate(); regenerate();
@ -141,7 +140,7 @@ public class CageData
this.location = location; this.location = location;
this.outerMaterial = outer; this.outerMaterial = outer;
this.innerMaterial = inner; this.innerMaterial = inner;
CageData.input = input; CageData.input = input; // TODO: Remove static variable declaration in a non-static block.
buildHistory(location); buildHistory(location);
regenerate(); regenerate();
@ -233,8 +232,7 @@ public class CageData
if (cage) if (cage)
{ {
cage(fPlayer.getPlayer().getLocation(), Material.GLASS, Material.GLASS); cage(fPlayer.getPlayer().getLocation(), Material.GLASS, Material.GLASS);
} } else
else
{ {
this.caged = false; this.caged = false;
regenerateHistory(); regenerateHistory();

View File

@ -1,7 +1,6 @@
package me.totalfreedom.totalfreedommod.caging; package me.totalfreedom.totalfreedommod.caging;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import java.util.Objects;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -16,6 +15,8 @@ import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import java.util.Objects;
public class Cager extends FreedomService public class Cager extends FreedomService
{ {
@Override @Override
@ -64,8 +65,7 @@ public class Cager extends FreedomService
if (!Objects.equals(playerLoc.getWorld(), cageLoc.getWorld())) if (!Objects.equals(playerLoc.getWorld(), cageLoc.getWorld()))
{ {
outOfCage = true; outOfCage = true;
} } else
else
{ {
outOfCage = playerLoc.distanceSquared(cageLoc) > (2.5D * 2.5D); outOfCage = playerLoc.distanceSquared(cageLoc) > (2.5D * 2.5D);
} }

View File

@ -1,13 +1,17 @@
package me.totalfreedom.totalfreedommod.command; 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.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.apache.commons.lang.StringUtils;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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") @CommandParameters(description = "Talk privately with other admins on the server.", usage = "/<command> [message]", aliases = "o,sc,ac,staffchat")
public class Command_adminchat extends FreedomCommand public class Command_adminchat extends FreedomCommand
{ {
@ -19,15 +23,14 @@ public class Command_adminchat extends FreedomCommand
{ {
if (senderIsConsole) 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; return true;
} }
FPlayer userinfo = plugin.pl.getPlayer(playerSender); FPlayer userinfo = plugin.pl.getPlayer(playerSender);
userinfo.setAdminChat(!userinfo.inAdminChat()); userinfo.setAdminChat(!userinfo.inAdminChat());
msg("Admin chat turned " + (userinfo.inAdminChat() ? "on" : "off") + "."); msgNew("Admin chat turned <status>.", Placeholder.unparsed("status", userinfo.inAdminChat() ? "on" : "off"));
} } else
else
{ {
plugin.cm.adminChat(sender, StringUtils.join(args, " ")); plugin.cm.adminChat(sender, StringUtils.join(args, " "));
} }

View File

@ -1,16 +1,17 @@
package me.totalfreedom.totalfreedommod.command; 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.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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) import java.util.List;
@CommandPermissions(permission = "admininfo", source = SourceType.BOTH)
@CommandParameters(description = "Information on how to apply for admin.", usage = "/<command>", aliases = "si,ai,staffinfo") @CommandParameters(description = "Information on how to apply for admin.", usage = "/<command>", aliases = "si,ai,staffinfo")
public class Command_admininfo extends FreedomCommand public class Command_admininfo extends FreedomCommand
{ {
@ -22,12 +23,12 @@ public class Command_admininfo extends FreedomCommand
if (adminInfo.isEmpty()) 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
else
{ {
msg(FUtil.colorize(StringUtils.join(adminInfo, "\n"))); adminInfo.forEach(this::msgNew);
} }
return true; return true;
} }
} }

View File

@ -1,17 +1,21 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.Arrays; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.Collections; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
import me.totalfreedom.totalfreedommod.command.handling.SourceType;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@CommandPermissions(permission = "adminmode", source = SourceType.BOTH)
@CommandParameters(description = "Denies joining of operators and only allows admins to join.", usage = "/<command> [on | off]", aliases = "staffmode") @CommandParameters(description = "Denies joining of operators and only allows admins to join.", usage = "/<command> [on | off]", aliases = "staffmode")
public class Command_adminmode extends FreedomCommand public class Command_adminmode extends FreedomCommand
{ {
@ -29,8 +33,7 @@ public class Command_adminmode extends FreedomCommand
ConfigEntry.ADMIN_ONLY_MODE.setBoolean(false); ConfigEntry.ADMIN_ONLY_MODE.setBoolean(false);
FUtil.adminAction(sender.getName(), "Opening the server to all players", true); FUtil.adminAction(sender.getName(), "Opening the server to all players", true);
return true; return true;
} } else if (args[0].equalsIgnoreCase("on"))
else if (args[0].equalsIgnoreCase("on"))
{ {
ConfigEntry.ADMIN_ONLY_MODE.setBoolean(true); ConfigEntry.ADMIN_ONLY_MODE.setBoolean(true);
FUtil.adminAction(sender.getName(), "Closing the server to non-admins", true); FUtil.adminAction(sender.getName(), "Closing the server to non-admins", true);

View File

@ -1,18 +1,23 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import java.util.Arrays; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.Collections; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.command.handling.SourceType;
import me.totalfreedom.totalfreedommod.world.WorldTime; import me.totalfreedom.totalfreedommod.world.WorldTime;
import me.totalfreedom.totalfreedommod.world.WorldWeather; import me.totalfreedom.totalfreedommod.world.WorldWeather;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@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.", @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>]", usage = "/<command> [time <morning | noon | evening | night> | weather <off | rain | storm>]",
aliases = "sw,aw,staffworld") aliases = "sw,aw,staffworld")
@ -27,14 +32,12 @@ public class Command_adminworld extends FreedomCommand
if (args.length == 0) if (args.length == 0)
{ {
commandMode = CommandMode.TELEPORT; commandMode = CommandMode.TELEPORT;
} } else if (args.length >= 2)
else if (args.length >= 2)
{ {
if ("time".equalsIgnoreCase(args[0])) if ("time".equalsIgnoreCase(args[0]))
{ {
commandMode = CommandMode.TIME; commandMode = CommandMode.TIME;
} } else if ("weather".equalsIgnoreCase(args[0]))
else if ("weather".equalsIgnoreCase(args[0]))
{ {
commandMode = CommandMode.WEATHER; commandMode = CommandMode.WEATHER;
} }
@ -49,7 +52,7 @@ public class Command_adminworld extends FreedomCommand
{ {
switch (commandMode) switch (commandMode)
{ {
case TELEPORT: case TELEPORT ->
{ {
if (!(sender instanceof Player) || playerSender == null) if (!(sender instanceof Player) || playerSender == null)
{ {
@ -60,24 +63,21 @@ public class Command_adminworld extends FreedomCommand
try try
{ {
adminWorld = plugin.wm.adminworld.getWorld(); adminWorld = plugin.wm.adminworld.getWorld();
} } catch (Exception ignored)
catch (Exception ignored)
{ {
} }
if (adminWorld == null || playerSender.getWorld() == adminWorld) 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()); 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); plugin.wm.adminworld.sendToWorld(playerSender);
} }
break;
} }
case TIME: case TIME ->
{ {
assertCommandPerms(sender, playerSender); assertCommandPerms(sender, playerSender);
@ -87,21 +87,18 @@ public class Command_adminworld extends FreedomCommand
if (timeOfDay != null) if (timeOfDay != null)
{ {
plugin.wm.adminworld.setTimeOfDay(timeOfDay); plugin.wm.adminworld.setTimeOfDay(timeOfDay);
msg("AdminWorld time set to: " + timeOfDay.name()); msgNew("AdminWorld time set to: <time>", Placeholder.unparsed("time", timeOfDay.name()));
} } else
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; return false;
} }
break;
} }
case WEATHER: case WEATHER ->
{ {
assertCommandPerms(sender, playerSender); assertCommandPerms(sender, playerSender);
@ -111,33 +108,29 @@ public class Command_adminworld extends FreedomCommand
if (weatherMode != null) if (weatherMode != null)
{ {
plugin.wm.adminworld.setWeatherMode(weatherMode); plugin.wm.adminworld.setWeatherMode(weatherMode);
msg("AdminWorld weather set to: " + weatherMode.name()); msgNew("AdminWorld weather set to <mode>.", Placeholder.unparsed("mode", weatherMode.name()));
} } else
else
{ {
msg("Invalid weather mode. Can be: off, rain, storm"); msgNew("<red>Invalid weather mode. Can be: off, rain, storm");
} }
} } else
else
{ {
return false; return false;
} }
break;
} }
default: default ->
{ {
return false; return false;
} }
} }
} } catch (PermissionDeniedException ex)
catch (PermissionDeniedException ex)
{ {
if (ex.getMessage().isEmpty()) if (ex.getMessage().isEmpty())
{ {
return noPerms(); return noPerms();
} }
msg(ex.getMessage()); msgNew("<red>" + ex.getMessage());
return true; return true;
} }
@ -147,7 +140,7 @@ public class Command_adminworld extends FreedomCommand
// TODO: Redo this properly // TODO: Redo this properly
private void assertCommandPerms(CommandSender sender, Player playerSender) throws PermissionDeniedException 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(); throw new PermissionDeniedException();
} }
@ -163,14 +156,12 @@ public class Command_adminworld extends FreedomCommand
if (args.length == 1) if (args.length == 1)
{ {
return Arrays.asList("time", "weather"); return Arrays.asList("time", "weather");
} } else if (args.length == 2)
else if (args.length == 2)
{ {
if (args[0].equals("time")) if (args[0].equals("time"))
{ {
return Arrays.asList("morning", "noon", "evening", "night"); return Arrays.asList("morning", "noon", "evening", "night");
} } else if (args[0].equals("weather"))
else if (args[0].equals("weather"))
{ {
return Arrays.asList("off", "rain", "storm"); return Arrays.asList("off", "rain", "storm");
} }

View File

@ -1,12 +1,15 @@
package me.totalfreedom.totalfreedommod.command; 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.apache.commons.lang.StringUtils;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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>") @CommandParameters(description = "Make an announcement anonymously to operators.", usage = "/<command> <message>")
public class Command_announce extends FreedomCommand public class Command_announce extends FreedomCommand
{ {

View File

@ -1,11 +1,15 @@
package me.totalfreedom.totalfreedommod.command; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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>") @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 public class Command_autoclear extends FreedomCommand
{ {
@ -23,13 +27,13 @@ public class Command_autoclear extends FreedomCommand
if (enabled) if (enabled)
{ {
plugin.lp.CLEAR_ON_JOIN.remove(args[0]); plugin.lp.CLEAR_ON_JOIN.remove(args[0]);
} } else
else
{ {
plugin.lp.CLEAR_ON_JOIN.add(args[0]); 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; return true;
} }

View File

@ -1,11 +1,15 @@
package me.totalfreedom.totalfreedommod.command; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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>") @CommandParameters(description = "Toggle whether or not a player is automatically teleported when they join", usage = "/<command> <player>")
public class Command_autotp extends FreedomCommand public class Command_autotp extends FreedomCommand
{ {
@ -23,14 +27,13 @@ public class Command_autotp extends FreedomCommand
if (enabled) if (enabled)
{ {
plugin.lp.TELEPORT_ON_JOIN.remove(args[0]); plugin.lp.TELEPORT_ON_JOIN.remove(args[0]);
} } else
else
{ {
plugin.lp.TELEPORT_ON_JOIN.add(args[0]); 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; return true;
} }
} }

View File

@ -1,17 +1,15 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.Objects;
import com.earth2me.essentials.User; import com.earth2me.essentials.User;
import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.banning.Ban;
import me.totalfreedom.totalfreedommod.command.handling.*;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.Punishment;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; 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.ArrayUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
@ -19,7 +17,10 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true) import java.util.Objects;
@Intercept("ban")
@CommandPermissions(permission = "ban", source = SourceType.BOTH, blockHostConsole = true)
@CommandParameters(description = "Bans the specified player.", usage = "/<command> <username> [reason] [-nrb | -q]", aliases = "gtfo") @CommandParameters(description = "Bans the specified player.", usage = "/<command> <username> [reason] [-nrb | -q]", aliases = "gtfo")
public class Command_ban extends FreedomCommand public class Command_ban extends FreedomCommand
{ {
@ -52,8 +53,7 @@ public class Command_ban extends FreedomCommand
{ {
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
} }
} } else
else
{ {
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
} }
@ -81,15 +81,13 @@ public class Command_ban extends FreedomCommand
{ {
msg(PLAYER_NOT_FOUND); msg(PLAYER_NOT_FOUND);
return true; return true;
} } else
else
{ {
username = entry.getName(); username = entry.getName();
ip = entry.getIps().get(0); ip = entry.getIps().get(0);
} }
} }
} } else
else
{ {
username = player.getName(); username = player.getName();
ip = FUtil.getIp(player); ip = FUtil.getIp(player);
@ -115,10 +113,9 @@ public class Command_ban extends FreedomCommand
Objects.requireNonNull(targetPos.getWorld()).strikeLightning(strike_pos); Objects.requireNonNull(targetPos.getWorld()).strikeLightning(strike_pos);
} }
} }
} } else
else
{ {
msg("Banned " + player.getName() + " quietly."); msgNew("Banned <player> quietly.", Placeholder.unparsed("player", player.getName()));
} }
// Kill player // Kill player
player.setHealth(0.0); player.setHealth(0.0);
@ -140,8 +137,7 @@ public class Command_ban extends FreedomCommand
if (player != null) if (player != null)
{ {
ban = Ban.forPlayer(player, sender, null, reason); ban = Ban.forPlayer(player, sender, null, reason);
} } else
else
{ {
ban = Ban.forPlayerName(username, sender, null, reason); ban = Ban.forPlayerName(username, sender, null, reason);
} }
@ -160,7 +156,9 @@ public class Command_ban extends FreedomCommand
{ {
bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason); bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason);
} }
msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + ip); 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); FUtil.adminAction(sender.getName(), bcast.toString(), true);
} }
@ -168,13 +166,9 @@ public class Command_ban extends FreedomCommand
if (player != null) if (player != null)
{ {
player.kickPlayer(ban.bakeKickMessage()); player.kickPlayer(ban.bakeKickMessage());
for (Player p : Bukkit.getOnlinePlayers())
{ server.getOnlinePlayers().stream().filter(pl -> FUtil.getIp(pl).equalsIgnoreCase(ip)).forEach(pl ->
if (FUtil.getIp(p).equals(FUtil.getIp(player))) player.kickPlayer(ban.bakeKickMessage()));
{
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
}
}
} }
// Log ban // Log ban

View File

@ -1,17 +1,17 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.banning.Ban;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.command.handling.*;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; 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.ArrayUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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]") @CommandParameters(description = "Bans the specified ip.", usage = "/<command> <ip> [reason] [-q]")
public class Command_banip extends FreedomCommand public class Command_banip extends FreedomCommand
{ {
@ -32,13 +32,13 @@ public class Command_banip extends FreedomCommand
if (FUtil.isValidIPv4(ip)) 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; return true;
} }
if (plugin.bm.getByIp(ip) != null) 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; return true;
} }
@ -50,8 +50,7 @@ public class Command_banip extends FreedomCommand
{ {
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
} }
} } else if (args.length > 1)
else if (args.length > 1)
{ {
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
} }
@ -61,20 +60,13 @@ public class Command_banip extends FreedomCommand
plugin.bm.addBan(ban); plugin.bm.addBan(ban);
// Kick player and handle others on IP // Kick player and handle others on IP
for (Player player : server.getOnlinePlayers()) server.getOnlinePlayers().stream().filter(player -> FUtil.getIp(player).equalsIgnoreCase(ip)).forEach(player ->
{ player.kickPlayer(ban.bakeKickMessage()));
if (FUtil.getIp(player).equals(ip))
{
player.kickPlayer(ban.bakeKickMessage());
}
if (!silent) // Broadcasts the message
{ if (!silent)
// Broadcast {
FLog.info(ChatColor.RED + sender.getName() + " - Banned the IP " + ip); plugin.cm.broadcastSplit("<red><sender> - Banned the IP <ip>", "<red><sender> - Banned an IP", Placeholder.unparsed("ip", ip));
String message = sender.getName() + " - Banned " + (plugin.al.isAdmin(player) ? "the IP " + ip : "an IP");
msg(player, message, ChatColor.RED);
}
} }
return true; return true;

View File

@ -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();
}
}

View File

@ -1,16 +1,19 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.banning.Ban; 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 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.ArrayUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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]") @CommandParameters(description = "Bans the specified name.", usage = "/<command> <name> [reason] [-q]")
public class Command_banname extends FreedomCommand public class Command_banname extends FreedomCommand
{ {
@ -31,7 +34,7 @@ public class Command_banname extends FreedomCommand
if (plugin.bm.getByUsername(name) != null) 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; return true;
} }
@ -43,8 +46,7 @@ public class Command_banname extends FreedomCommand
{ {
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
} }
} } else if (args.length > 1)
else if (args.length > 1)
{ {
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
} }

View File

@ -1,16 +1,20 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.Arrays; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import java.util.SplittableRandom; import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.command.handling.SourceType;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) import java.util.Arrays;
import java.util.List;
import java.util.SplittableRandom;
@CommandPermissions(permission = "bird", source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Spawns a random type of fish at your location.", usage = "/<command>") @CommandParameters(description = "Spawns a random type of fish at your location.", usage = "/<command>")
public class Command_bird extends FreedomCommand 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); Location location = playerSender.getTargetBlock(null, 15).getLocation().add(0, 1, 0);
playerSender.getWorld().spawnEntity(location, getRandomFish()); playerSender.getWorld().spawnEntity(location, getRandomFish());
msg(":goodbird:"); msgNew("<rainbow>:goodbird:");
return true; return true;
} }

View File

@ -1,16 +1,19 @@
package me.totalfreedom.totalfreedommod.command; 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.player.FPlayer;
import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.Punishment;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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") @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 public class Command_blockcmd extends FreedomCommand
{ {
@ -36,7 +39,8 @@ public class Command_blockcmd extends FreedomCommand
playerdata.setCommandsBlocked(false); playerdata.setCommandsBlocked(false);
} }
} }
msg("Unblocked commands for " + counter + " players.");
msgNew("Unblocked commands for <count> players.", Placeholder.unparsed("count", String.valueOf(counter)));
return true; return true;
} }
@ -53,10 +57,10 @@ public class Command_blockcmd extends FreedomCommand
counter += 1; counter += 1;
plugin.pl.getPlayer(player).setCommandsBlocked(true); 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; return true;
} }
@ -64,13 +68,13 @@ public class Command_blockcmd extends FreedomCommand
if (player == null) if (player == null)
{ {
msg(FreedomCommand.PLAYER_NOT_FOUND); msg(PLAYER_NOT_FOUND);
return true; return true;
} }
if (isAdmin(player)) 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; return true;
} }
@ -79,13 +83,12 @@ public class Command_blockcmd extends FreedomCommand
{ {
FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true); FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
playerdata.setCommandsBlocked(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)); plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.BLOCKCMD, null));
} } else
else
{ {
msg("That players commands are already blocked.", ChatColor.RED); msgNew("<red>That player's commands are already blocked.");
} }
return true; return true;
} }

View File

@ -1,19 +1,23 @@
package me.totalfreedom.totalfreedommod.command; 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.player.FPlayer;
import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.Punishment;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) @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]") @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 public class Command_blockedit extends FreedomCommand
{ {
@ -29,12 +33,13 @@ public class Command_blockedit extends FreedomCommand
List<? extends Player> list = server.getOnlinePlayers().stream().filter(player -> List<? extends Player> list = server.getOnlinePlayers().stream().filter(player ->
plugin.pl.getPlayer(player).isEditBlocked()).sorted().toList(); plugin.pl.getPlayer(player).isEditBlocked()).sorted().toList();
// Oh dear god, why do I have to do it like this? boolean plural = list.size() != 1;
msg("There " + (list.size() != 1 ? "are " : "is ") + list.size() + " player" msgNew("There <grammar> <count> player<plural> online with restricted block modification abilities: <players>",
+ (list.size() != 1 ? "s" : "") + " online with restricted block modification abilities" Placeholder.unparsed("grammar", plural ? "are" : "is"),
+ (list.size() > 0 ? ":" : ".")); Placeholder.unparsed("count", String.valueOf(list.size())),
Placeholder.unparsed("plural", plural ? "s" : ""),
list.forEach(player -> msg("- " + player.getName())); Placeholder.unparsed("colon", list.size() > 0 ? ":" : "."),
Placeholder.unparsed("players", FUtil.listToString(list.stream().map(HumanEntity::getName).toList())));
} }
case "purge" -> case "purge" ->
{ {
@ -46,11 +51,12 @@ public class Command_blockedit extends FreedomCommand
list.forEach(player -> list.forEach(player ->
{ {
plugin.pl.getPlayer(player).setEditBlocked(false); plugin.pl.getPlayer(player).setEditBlocked(false);
msg(player, "Your block modification abilities have been restored.", ChatColor.GREEN); msgNew(player, "<green>Your block modification abilities have been restored.");
}); });
msg("Restored block modification abilities for " + list.size() + " player" msgNew("Restored block modification abilities for <count> player<plural>.",
+ (list.size() != 1 ? "s" : "") + "."); Placeholder.unparsed("count", String.valueOf(list.size())),
Placeholder.unparsed("plural", list.size() != 1 ? "s" : ""));
} }
case "all", "-a" -> case "all", "-a" ->
{ {
@ -62,11 +68,12 @@ public class Command_blockedit extends FreedomCommand
list.forEach(player -> list.forEach(player ->
{ {
plugin.pl.getPlayer(player).setEditBlocked(true); plugin.pl.getPlayer(player).setEditBlocked(true);
msg(player, "Your block modification abilities have been restricted.", ChatColor.RED); msgNew(player, "<red>Your block modification abilities have been restricted.");
}); });
msg("Restricted block modification abilities for " + list.size() + " player" msgNew("Restricted block modification abilities for <count> player<plural>.",
+ (list.size() != 1 ? "s" : "") + "."); Placeholder.unparsed("count", String.valueOf(list.size())),
Placeholder.unparsed("plural", list.size() != 1 ? "s" : ""));
} }
default -> Optional.ofNullable(getPlayer(args[0])).ifPresentOrElse(player -> default -> Optional.ofNullable(getPlayer(args[0])).ifPresentOrElse(player ->
{ {
@ -76,21 +83,19 @@ public class Command_blockedit extends FreedomCommand
{ {
FUtil.adminAction(sender.getName(), "Restoring block modification abilities for " + player.getName(), true); FUtil.adminAction(sender.getName(), "Restoring block modification abilities for " + player.getName(), true);
fPlayer.setEditBlocked(false); fPlayer.setEditBlocked(false);
msg("Restored block modification abilities for " + player.getName() + "."); msgNew("Restored block modification abilities for <player>.", Placeholder.unparsed("player", player.getName()));
msg(player, "Your block modification abilities have been restored.", ChatColor.GREEN); msgNew(player, "<green>Your block modification abilities have been restored.");
} } else
else
{ {
if (plugin.al.isAdmin(player)) if (plugin.al.isAdmin(player))
{ {
msg(player.getName() + " is an admin, and as such cannot have their block modification abilities restricted.", ChatColor.RED); msgNew("<red><player> is an admin, and as such cannot have their block modification abilities restricted.", Placeholder.unparsed("player", player.getName()));
} } else
else
{ {
FUtil.adminAction(sender.getName(), "Restricting block modification abilities for " + player.getName(), true); FUtil.adminAction(sender.getName(), "Restricting block modification abilities for " + player.getName(), true);
fPlayer.setEditBlocked(true); fPlayer.setEditBlocked(true);
msg("Restricted block modification abilities for " + player.getName() + "."); msgNew("Restricted block modification abilities for <player>.", Placeholder.unparsed("player", player.getName()));
msg(player, "Your block modification abilities have been restricted.", ChatColor.RED); msgNew(player, "<red>Your block modification abilities have been restricted.");
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player),
sender.getName(), PunishmentType.BLOCKEDIT, null)); sender.getName(), PunishmentType.BLOCKEDIT, null));
@ -101,8 +106,7 @@ public class Command_blockedit extends FreedomCommand
} }
return true; return true;
} } else
else
{ {
return false; return false;
} }

View File

@ -0,0 +1,113 @@
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;
}
}

View File

@ -1,14 +1,17 @@
package me.totalfreedom.totalfreedommod.command; 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.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; 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") @CommandParameters(description = "Blocks redstone on the server.", usage = "/<command>", aliases = "bre")
public class Command_blockredstone extends FreedomCommand public class Command_blockredstone extends FreedomCommand
{ {
@ -30,8 +33,7 @@ public class Command_blockredstone extends FreedomCommand
} }
} }
}.runTaskLater(plugin, 6000L); }.runTaskLater(plugin, 6000L);
} } else
else
{ {
ConfigEntry.ALLOW_REDSTONE.setBoolean(true); ConfigEntry.ALLOW_REDSTONE.setBoolean(true);
FUtil.adminAction(sender.getName(), "Unblocking all redstone", true); FUtil.adminAction(sender.getName(), "Unblocking all redstone", true);

View File

@ -1,15 +1,13 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.Arrays; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import java.util.Collections; import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.SourceType;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.Punishment;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@ -17,7 +15,12 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@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]") @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 public class Command_cage extends FreedomCommand
{ {
@ -48,7 +51,7 @@ public class Command_cage extends FreedomCommand
final FPlayer fPlayer = plugin.pl.getPlayer(player); final FPlayer fPlayer = plugin.pl.getPlayer(player);
if (fPlayer.getCageData().isCaged()) if (fPlayer.getCageData().isCaged())
{ {
msg("That player is already caged.", ChatColor.RED); msgNew("<red>That player is already caged.");
return true; return true;
} }
@ -65,8 +68,7 @@ public class Command_cage extends FreedomCommand
if (args.length >= 3) if (args.length >= 3)
{ {
skullName = args[2]; skullName = args[2];
} } else
else
{ {
outerMaterial = Material.SKELETON_SKULL; outerMaterial = Material.SKELETON_SKULL;
} }
@ -81,14 +83,12 @@ public class Command_cage extends FreedomCommand
if (Material.matchMaterial(args[2]) != null && Material.matchMaterial(args[2]).isBlock()) if (Material.matchMaterial(args[2]) != null && Material.matchMaterial(args[2]).isBlock())
{ {
outerMaterial = Material.matchMaterial(args[2]); outerMaterial = Material.matchMaterial(args[2]);
} } else
else
{ {
msg("Invalid block!", ChatColor.RED); msgNew("<red>Invalid block!");
return true; return true;
} }
} } else
else
{ {
return false; return false;
} }
@ -103,8 +103,7 @@ public class Command_cage extends FreedomCommand
if (outerMaterial == Material.PLAYER_HEAD) if (outerMaterial == Material.PLAYER_HEAD)
{ {
FUtil.adminAction(sender.getName(), "Caging " + player.getName() + " in " + skullName, true); FUtil.adminAction(sender.getName(), "Caging " + player.getName() + " in " + skullName, true);
} } else
else
{ {
FUtil.adminAction(sender.getName(), "Caging " + player.getName(), true); FUtil.adminAction(sender.getName(), "Caging " + player.getName(), true);
} }
@ -114,8 +113,7 @@ public class Command_cage extends FreedomCommand
if (skullName != null) if (skullName != null)
{ {
fPlayer.getCageData().cage(location, outerMaterial, innerMaterial, skullName); fPlayer.getCageData().cage(location, outerMaterial, innerMaterial, skullName);
} } else
else
{ {
fPlayer.getCageData().cage(location, outerMaterial, innerMaterial); fPlayer.getCageData().cage(location, outerMaterial, innerMaterial);
} }
@ -139,21 +137,18 @@ public class Command_cage extends FreedomCommand
arguments.add("purge"); arguments.add("purge");
arguments.addAll(FUtil.getPlayerList()); arguments.addAll(FUtil.getPlayerList());
return arguments; return arguments;
} } else if (args.length == 2)
else if (args.length == 2)
{ {
if (!args[0].equals("purge")) if (!args[0].equals("purge"))
{ {
return Arrays.asList("head", "block"); return Arrays.asList("head", "block");
} }
} } else if (args.length == 3)
else if (args.length == 3)
{ {
if (args[1].equals("block")) if (args[1].equals("block"))
{ {
return Arrays.stream(Material.values()).map(Enum::name).toList(); return Arrays.stream(Material.values()).map(Enum::name).toList();
} } else if (args[1].equals("head"))
else if (args[1].equals("head"))
{ {
return FUtil.getPlayerList(); return FUtil.getPlayerList();
} }

View File

@ -1,8 +1,10 @@
package me.totalfreedom.totalfreedommod.command; 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 me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -10,39 +12,20 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; 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>") @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 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 @Override
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole) 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 ItemStack heldItem = new ItemStack(Material.CAKE);
final ItemMeta heldItemMeta = heldItem.getItemMeta(); final ItemMeta heldItemMeta = heldItem.getItemMeta();
assert heldItemMeta != null; assert heldItemMeta != null;
heldItemMeta.setDisplayName(ChatColor.WHITE + "The " + ChatColor.DARK_GRAY + "Lie"); heldItemMeta.displayName(FUtil.miniMessage("<white>The <dark_gray>Lie"));
heldItem.setItemMeta(heldItemMeta); heldItem.setItemMeta(heldItemMeta);
server.getOnlinePlayers().forEach(player -> player.getInventory().addItem(heldItem));
for (Player player : server.getOnlinePlayers()) 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."));
{
final int firstEmpty = player.getInventory().firstEmpty();
if (firstEmpty >= 0)
{
player.getInventory().setItem(firstEmpty, heldItem);
}
}
FUtil.bcastMsg(output.toString());
return true; return true;
} }
} }

View File

@ -1,12 +1,16 @@
package me.totalfreedom.totalfreedommod.command; 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 me.totalfreedom.totalfreedommod.util.FUtil;
import net.kyori.adventure.text.Component;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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") @CommandParameters(description = "Clears the chat.", usage = "/<command>", aliases = "cc")
public class Command_cleanchat extends FreedomCommand public class Command_cleanchat extends FreedomCommand
{ {
@ -17,7 +21,7 @@ public class Command_cleanchat extends FreedomCommand
{ {
for (int i = 0; i < 100; i++) for (int i = 0; i < 100; i++)
{ {
msg(player, ""); msg(player, Component.space());
} }
}); });

View File

@ -1,20 +1,27 @@
package me.totalfreedom.totalfreedommod.command; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_CONSOLE) @CommandDependencies({"TFD4J"})
@CommandParameters(description = "Clear the discord message queue.", usage = "/<command>") @CommandPermissions(permission = "cleardiscordqueue", source = SourceType.ONLY_CONSOLE)
@CommandParameters(description = "Clear the Discord message queue.", usage = "/<command>")
public class Command_cleardiscordqueue extends FreedomCommand public class Command_cleardiscordqueue extends FreedomCommand
{ {
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) 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(); plugin.dc.clearQueue();
msg("Cleared the discord message queue."); msgNew("<green>Cleared the Discord message queue.");
return true; return true;
} }
} }

View File

@ -0,0 +1,40 @@
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;
}
}

View File

@ -1,12 +1,16 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.admin.Admin; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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") @CommandParameters(description = "Spy on commands", usage = "/<command>", aliases = "commandspy")
public class Command_cmdspy extends FreedomCommand public class Command_cmdspy extends FreedomCommand
{ {
@ -16,7 +20,7 @@ public class Command_cmdspy extends FreedomCommand
{ {
Admin admin = plugin.al.getAdmin(playerSender); Admin admin = plugin.al.getAdmin(playerSender);
admin.setCommandSpy(!admin.getCommandSpy()); 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.save(admin);
plugin.al.updateTables(); plugin.al.updateTables();
return true; return true;

View File

@ -1,10 +1,10 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.command.handling.*;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -12,58 +12,61 @@ import org.bukkit.entity.Player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) @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>") @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 public class Command_coins extends FreedomCommand
{ {
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
if (!ConfigEntry.SHOP_ENABLED.getBoolean()) if (plugin.sh == null || !ConfigEntry.SHOP_ENABLED.getBoolean())
{ {
msg("The shop is currently disabled!", ChatColor.RED); msgNew("<red>The shop is currently disabled!");
return true; return true;
} }
final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " ");
switch (args.length) switch (args.length)
{ {
// Mode for seeing how many coins the sender has (doesn't work from console) // Mode for seeing how many coins the sender has (doesn't work from console)
case 0: case 0 ->
{ {
if (senderIsConsole) if (senderIsConsole)
{ {
msg("When used from the console, you must define a target player."); msgNew("When used from the console, you must define a target player.");
} } else
else
{ {
PlayerData playerData = getData(playerSender); PlayerData playerData = getData(playerSender);
msg(prefix + ChatColor.GREEN + "You have " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN msgNew("<green>You have <gold><coins></gold> coin<plural>.",
+ " coins."); Placeholder.unparsed("coins", String.valueOf(playerData.getCoins())),
Placeholder.unparsed("plural", playerData.getCoins() > 1 ? "s" : ""));
} }
return true; return true;
} }
// Mode for seeing how many coins a player has. // Mode for seeing how many coins a player has.
case 1: case 1 ->
{ {
Player target = getPlayer(args[0]); Player target = getPlayer(args[0]);
if (target == null) if (target == null)
{ {
msg(PLAYER_NOT_FOUND); msg(PLAYER_NOT_FOUND);
} } else
else
{ {
PlayerData playerData = getData(target); PlayerData playerData = getData(target);
msg(prefix + ChatColor.GREEN + target.getName() + " has " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins."); 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; return true;
} }
// Mode for paying another player coins // Mode for paying another player coins
case 3: case 3 ->
{ {
if (args[0].equalsIgnoreCase("pay")) if (args[0].equalsIgnoreCase("pay"))
{ {
@ -79,39 +82,39 @@ public class Command_coins extends FreedomCommand
{ {
// Prevents players from trying to be cheeky with negative numbers. // Prevents players from trying to be cheeky with negative numbers.
coinsToTransfer = Math.max(Math.abs(Integer.parseInt(args[2])), 1); coinsToTransfer = Math.max(Math.abs(Integer.parseInt(args[2])), 1);
} } catch (NumberFormatException ex)
catch (NumberFormatException ex)
{ {
msg("Invalid number: " + args[2], ChatColor.RED); msgNew("<red>Invalid number: <num>", Placeholder.unparsed("num", args[2]));
return true; return true;
} }
// Prevents players from performing transactions they can't afford to do. // Prevents players from performing transactions they can't afford to do.
if (senderData.getCoins() < coinsToTransfer) if (senderData.getCoins() < coinsToTransfer)
{ {
msg("You don't have enough coins to perform this transaction.", ChatColor.RED); msgNew("<red>You don't have enough coins to perform this transaction.");
return true; return true;
} }
if (target == null) if (target == null)
{ {
msg(PLAYER_NOT_FOUND); msg(PLAYER_NOT_FOUND);
} } else
else
{ {
PlayerData playerData = getData(target); PlayerData playerData = getData(target);
playerData.setCoins(playerData.getCoins() + coinsToTransfer); playerData.setCoins(playerData.getCoins() + coinsToTransfer);
senderData.setCoins(senderData.getCoins() - coinsToTransfer); senderData.setCoins(senderData.getCoins() - coinsToTransfer);
msg(target, sender.getName() boolean plural = coinsToTransfer > 1;
+ ChatColor.GREEN + " has given you "
+ ChatColor.GOLD + coinsToTransfer
+ ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "") + "!", ChatColor.GOLD);
msg("You have given " msgNew(target, "<green><gold><sender></gold> has given you <gold><coins></gold> coin<plural>!",
+ ChatColor.GOLD + coinsToTransfer Placeholder.unparsed("sender", sender.getName()),
+ ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "") Placeholder.unparsed("coins", String.valueOf(coinsToTransfer)),
+ " to " + ChatColor.GOLD + target.getName() + ChatColor.GREEN + ".", ChatColor.GREEN); 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(playerData);
plugin.pl.save(senderData); plugin.pl.save(senderData);
@ -119,9 +122,9 @@ public class Command_coins extends FreedomCommand
return true; return true;
} }
return true;
} }
default ->
default:
{ {
return false; return false;
} }

View File

@ -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;
}
}

View File

@ -0,0 +1,38 @@
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 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;
import java.util.Collections;
import java.util.Random;
@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;
}
}

View File

@ -1,7 +1,9 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.SplittableRandom; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import me.totalfreedom.totalfreedommod.rank.Rank; 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.Location;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -9,7 +11,9 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) import java.util.SplittableRandom;
@CommandPermissions(permission = "deafen", source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Makes random sounds.", usage = "/<command>") @CommandParameters(description = "Makes random sounds.", usage = "/<command>")
public class Command_deafen extends FreedomCommand public class Command_deafen extends FreedomCommand
{ {
@ -33,7 +37,7 @@ public class Command_deafen extends FreedomCommand
{ {
for (double percent = 0.0; percent <= 1.0; percent += (1.0 / STEPS)) for (double percent = 0.0; percent <= 1.0; percent += (1.0 / STEPS))
{ {
final float pitch = (float)(percent * 2.0); final float pitch = (float) (percent * 2.0);
new BukkitRunnable() new BukkitRunnable()
{ {

View File

@ -1,12 +1,12 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.Arrays; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import me.totalfreedom.totalfreedommod.rank.Rank; 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.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -14,7 +14,9 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) import java.util.Arrays;
@CommandPermissions(permission = "debugstick", source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Get a stick of happiness.", usage = "/<command>") @CommandParameters(description = "Get a stick of happiness.", usage = "/<command>")
public class Command_debugstick extends FreedomCommand public class Command_debugstick extends FreedomCommand
{ {

View File

@ -1,12 +1,15 @@
package me.totalfreedom.totalfreedommod.command; 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 me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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>") @CommandParameters(description = "Essentials Interface Command - Remove the nickname of all players on the server.", usage = "/<command>")
public class Command_denick extends FreedomCommand public class Command_denick extends FreedomCommand
{ {
@ -16,7 +19,7 @@ public class Command_denick extends FreedomCommand
{ {
if (!plugin.esb.isEnabled()) if (!plugin.esb.isEnabled())
{ {
msg("Essentials is not enabled on this server."); msgNew("<red>Essentials is not enabled on this server.");
return true; return true;
} }

View File

@ -0,0 +1,58 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.command.handling.*;
import me.totalfreedom.totalfreedommod.util.FUtil;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.luckperms.api.track.DemotionResult;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@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;
}
boolean b = silent;
DemotionResult result = TotalFreedomMod.getPlugin().getHierarchy()
.demoteUser(TotalFreedomMod.getPlugin().getHierarchy().op(), player);
if (!result.wasSuccessful())
{
msgNew("<red><player> is already non-op.", Placeholder.unparsed("player", player.getName()));
return true;
}
msg(player, YOU_ARE_NOT_OP);
if (!b)
{
FUtil.adminAction(sender.getName(), "De-opping " + player.getName(), false);
}
return true;
}
}

View File

@ -0,0 +1,41 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
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 net.luckperms.api.track.DemotionResult;
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 ->
{
DemotionResult result = TotalFreedomMod.getPlugin().getHierarchy()
.demoteUser(TotalFreedomMod.getPlugin().getHierarchy().op(), player);
if (!result.wasSuccessful())
{
msgNew("<red><player> is already non-op.", Placeholder.unparsed("player", player.getName()));
return;
}
msg(player, YOU_ARE_NOT_OP);
});
return true;
}
}

View File

@ -1,9 +1,11 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import me.totalfreedom.totalfreedommod.rank.Rank; 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.FUtil;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@ -15,7 +17,10 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) import java.util.ArrayList;
import java.util.List;
@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>") @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 public class Command_dispfill extends FreedomCommand
{ {
@ -24,7 +29,7 @@ public class Command_dispfill extends FreedomCommand
{ {
if (targetBlock.getType() == Material.DISPENSER) if (targetBlock.getType() == Material.DISPENSER)
{ {
final Inventory dispenserInv = ((Dispenser)targetBlock.getState()).getInventory(); final Inventory dispenserInv = ((Dispenser) targetBlock.getState()).getInventory();
dispenserInv.clear(); dispenserInv.clear();
dispenserInv.addItem(items); dispenserInv.addItem(items);
} }
@ -40,10 +45,9 @@ public class Command_dispfill extends FreedomCommand
try try
{ {
radius = Math.max(5, Math.min(25, Integer.parseInt(args[0]))); radius = Math.max(5, Math.min(25, Integer.parseInt(args[0])));
} } catch (NumberFormatException ex)
catch (NumberFormatException ex)
{ {
msg("Invalid radius."); msgNew("<red>Invalid radius: <amount>", Placeholder.unparsed("amount", args[0]));
return true; return true;
} }
@ -57,10 +61,9 @@ public class Command_dispfill extends FreedomCommand
if (material != null) if (material != null)
{ {
items.add(new ItemStack(material, 64)); items.add(new ItemStack(material, 64));
} } else
else
{ {
msg("Skipping invalid item: " + searchItem); msgNew("Skipping invalid item: <item>", Placeholder.unparsed("item", searchItem));
} }
} }
@ -76,23 +79,24 @@ public class Command_dispfill extends FreedomCommand
for (int zOffset = -radius; zOffset <= radius; zOffset++) for (int zOffset = -radius; zOffset <= radius; zOffset++)
{ {
final Block targetBlock = centerBlock.getRelative(xOffset, yOffset, 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()); plugin.cpb.getCoreProtectAPI().logContainerTransaction(sender.getName(), targetBlock.getLocation());
setDispenserContents(targetBlock, itemsArray);
affected++;
} }
setDispenserContents(targetBlock, itemsArray);
affected++;
} }
} }
} }
} }
msg("Done. " + affected + " dispenser(s) filled."); msgNew("Done. <amount> dispenser(s) filled.", Placeholder.unparsed("amount", String.valueOf(affected)));
} } else
else
{ {
return false; return false;
} }

View File

@ -2,12 +2,15 @@ package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.banning.Ban; 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.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.discord.Discord;
import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.Punishment;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; 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.ArrayUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -18,7 +21,7 @@ import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector; 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]") @CommandParameters(description = "Sends the specified player to their doom.", usage = "/<command> <playername> [reason]")
public class Command_doom extends FreedomCommand public class Command_doom extends FreedomCommand
{ {
@ -52,9 +55,9 @@ public class Command_doom extends FreedomCommand
admin.setActive(false); admin.setActive(false);
plugin.al.save(admin); plugin.al.save(admin);
plugin.al.updateTables(); plugin.al.updateTables();
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());
} }
} }
@ -118,7 +121,10 @@ public class Command_doom extends FreedomCommand
{ {
// message // message
FUtil.adminAction(sender.getName(), "Banning " + player.getName(), true); 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 // generate explosion
player.getWorld().createExplosion(player.getLocation(), 0F, false); player.getWorld().createExplosion(player.getLocation(), 0F, false);

View File

@ -1,12 +1,15 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import org.bukkit.ChatColor; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) @CommandPermissions(permission = "eject", source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Eject any entities that are riding you.", usage = "/<command>") @CommandParameters(description = "Eject any entities that are riding you.", usage = "/<command>")
public class Command_eject extends FreedomCommand public class Command_eject extends FreedomCommand
{ {
@ -38,11 +41,12 @@ public class Command_eject extends FreedomCommand
if (count != 0) if (count != 0)
{ {
msg(count + " entit" + (count == 1 ? "y was" : "ies were") + " ejected.", ChatColor.GREEN); msgNew("<green><count> entit<grammar> ejected.",
} Placeholder.unparsed("count", String.valueOf(count)),
else Placeholder.unparsed("grammar", count == 1 ? "y was" : "ies were"));
} else
{ {
msg("Nothing was ejected.", ChatColor.GREEN); msgNew("<green>Nothing was ejected.");
} }
return true; return true;

View File

@ -1,15 +1,12 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.Arrays; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import java.util.Collections; import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.SourceType;
import java.util.Objects;
import java.util.stream.IntStream;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
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.Material; import org.bukkit.Material;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -17,7 +14,10 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) import java.util.*;
import java.util.stream.IntStream;
@CommandPermissions(permission = "enchant", source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Enchant items.", usage = "/<command> <list | addall | reset | add <name> [level] | remove <name>>") @CommandParameters(description = "Enchant items.", usage = "/<command> <list | addall | reset | add <name> [level] | remove <name>>")
public class Command_enchant extends FreedomCommand public class Command_enchant extends FreedomCommand
{ {
@ -34,74 +34,50 @@ public class Command_enchant extends FreedomCommand
if (item.getType() == Material.AIR) 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; return true;
} }
if (args[0].equalsIgnoreCase("list")) 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: "); if (enchants.isEmpty())
for (Enchantment ench : Enchantment.values())
{ {
if (ench.canEnchantItem(item)) msgNew("<red>There are no enchantments that work with this item.");
{ } else
has_enchantments = true;
possible_ench.append(ench.getName()).append(", ");
}
}
if (has_enchantments)
{ {
msg(possible_ench.toString()); msgNew("Possible enchantments for this item: <enchants>", Placeholder.unparsed("enchants", FUtil.listToString(enchants)));
} }
else } else if (args[0].equalsIgnoreCase("addall"))
{
msg("The held item has no enchantments.");
}
}
else if (args[0].equalsIgnoreCase("addall"))
{ {
Arrays.stream(Enchantment.values()).filter(enchantment -> enchantment.canEnchantItem(item)).forEach(ench -> Arrays.stream(Enchantment.values()).filter(enchantment -> enchantment.canEnchantItem(item)).forEach(ench ->
{ {
try try
{ {
item.addEnchantment(ench, ench.getMaxLevel()); item.addEnchantment(ench, ench.getMaxLevel());
} } catch (Exception ignored)
catch (Exception ex)
{ {
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"))
else if (args[0].equalsIgnoreCase("reset"))
{ {
item.getEnchantments().keySet().forEach(item::removeEnchantment); item.getEnchantments().keySet().forEach(item::removeEnchantment);
msg("Removed all enchantments."); msgNew("<green>Removed all enchantments.");
} } else
else
{ {
if (args.length < 2) if (args.length < 2)
{ {
return false; return false;
} }
Enchantment ench = null; Enchantment ench = Enchantment.getByName(args[1].toUpperCase());
try
{
ench = Enchantment.getByName(args[1].toUpperCase());
}
catch (Exception ignored)
{
}
if (ench == null) 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; return true;
} }
@ -109,7 +85,7 @@ public class Command_enchant extends FreedomCommand
{ {
if (!ench.canEnchantItem(item) && !ConfigEntry.ALLOW_UNSAFE_ENCHANTMENTS.getBoolean()) 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; return true;
} }
int level = ench.getMaxLevel(); int level = ench.getMaxLevel();
@ -120,34 +96,30 @@ public class Command_enchant extends FreedomCommand
if (ConfigEntry.ALLOW_UNSAFE_ENCHANTMENTS.getBoolean()) if (ConfigEntry.ALLOW_UNSAFE_ENCHANTMENTS.getBoolean())
{ {
level = Integer.parseInt(args[2]); level = Integer.parseInt(args[2]);
} } else
else
{ {
level = Math.max(1, Math.min(ench.getMaxLevel(), Integer.parseInt(args[2]))); level = Math.max(1, Math.min(ench.getMaxLevel(), Integer.parseInt(args[2])));
} }
} } catch (NumberFormatException ex)
catch (NumberFormatException ex)
{ {
msg("\"" + args[2] + "\" is not a valid number", ChatColor.RED); msgNew("Invalid number: <number>", Placeholder.unparsed("number", args[2]));
return true; return true;
} }
} }
if (!ConfigEntry.ALLOW_UNSAFE_ENCHANTMENTS.getBoolean()) if (!ConfigEntry.ALLOW_UNSAFE_ENCHANTMENTS.getBoolean())
{ {
item.addEnchantment(ench, level); item.addEnchantment(ench, level);
} } else
else
{ {
item.addUnsafeEnchantment(ench, level); 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"))
else if (args[0].equals("remove"))
{ {
item.removeEnchantment(ench); item.removeEnchantment(ench);
msg("Removed enchantment: " + ench.getName()); msgNew("<green>Removed enchantment: <enchantment>", Placeholder.unparsed("enchantment", ench.getName()));
} }
} }
@ -197,9 +169,8 @@ public class Command_enchant extends FreedomCommand
Player player; Player player;
if (sender instanceof Player) if (sender instanceof Player)
{ {
player = (Player)sender; player = (Player) sender;
} } else
else
{ {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -215,26 +186,22 @@ public class Command_enchant extends FreedomCommand
if (args.length == 1) if (args.length == 1)
{ {
return Arrays.asList("list", "addall", "reset", "add", "remove"); return Arrays.asList("list", "addall", "reset", "add", "remove");
} } else if (args.length == 2)
else if (args.length == 2)
{ {
if (args[0].equals("add")) if (args[0].equals("add"))
{ {
if (unsafe) if (unsafe)
{ {
return getAllEnchantments(); return getAllEnchantments();
} } else
else
{ {
return getAllEnchantments(item); return getAllEnchantments(item);
} }
} } else if (args[0].equals("remove"))
else if (args[0].equals("remove"))
{ {
return getEnchantments(item); return getEnchantments(item);
} }
} } else if (args.length == 3 && args[0].equals("add"))
else if (args.length == 3 && args[0].equals("add"))
{ {
Enchantment enchantment = Enchantment.getByName(args[1].toUpperCase()); Enchantment enchantment = Enchantment.getByName(args[1].toUpperCase());
if (enchantment != null) if (enchantment != null)
@ -242,8 +209,7 @@ public class Command_enchant extends FreedomCommand
if (!unsafe) if (!unsafe)
{ {
return IntStream.rangeClosed(1, enchantment.getMaxLevel()).mapToObj(String::valueOf).toList(); return IntStream.rangeClosed(1, enchantment.getMaxLevel()).mapToObj(String::valueOf).toList();
} } else
else
{ {
return Collections.singletonList("[level]"); return Collections.singletonList("[level]");
} }

View File

@ -1,11 +1,14 @@
package me.totalfreedom.totalfreedommod.command; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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>") @CommandParameters(description = "Go to \"The End\".", usage = "/<command>")
public class Command_end extends FreedomCommand public class Command_end extends FreedomCommand
{ {

View File

@ -1,18 +1,23 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.Collections; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.command.handling.SourceType;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import me.totalfreedom.totalfreedommod.util.Groups; import me.totalfreedom.totalfreedommod.util.Groups;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@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") @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 public class Command_entitywipe extends FreedomCommand
{ {
@ -51,14 +56,12 @@ public class Command_entitywipe extends FreedomCommand
if (args[0].equals("-a")) if (args[0].equals("-a"))
{ {
bypassBlacklist = true; bypassBlacklist = true;
} } else
else
{ {
try try
{ {
type = EntityType.valueOf(args[0].toUpperCase()); type = EntityType.valueOf(args[0].toUpperCase());
} } catch (Exception e)
catch (Exception e)
{ {
msg(args[0] + " is not a valid entity type.", ChatColor.RED); msg(args[0] + " is not a valid entity type.", ChatColor.RED);
return true; return true;
@ -88,18 +91,19 @@ public class Command_entitywipe extends FreedomCommand
if (type != null) if (type != null)
{ {
count = plugin.ew.wipeEntities(type); count = plugin.ew.wipeEntities(type);
} } else
else
{ {
count = plugin.ew.wipeEntities(bypassBlacklist); count = plugin.ew.wipeEntities(bypassBlacklist);
} }
if (count == 1) 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 } 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; return true;
} }

View File

@ -1,9 +1,11 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList; import me.totalfreedom.totalfreedommod.command.handling.CommandParameters;
import java.util.List; import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions;
import me.totalfreedom.totalfreedommod.rank.Rank; 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.FUtil;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -11,7 +13,10 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME) import java.util.ArrayList;
import java.util.List;
@CommandPermissions(permission = "expel", source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Push people away from you.", usage = "/<command> [radius] [strength]") @CommandParameters(description = "Push people away from you.", usage = "/<command> [radius] [strength]")
public class Command_expel extends FreedomCommand public class Command_expel extends FreedomCommand
{ {
@ -27,8 +32,7 @@ public class Command_expel extends FreedomCommand
try try
{ {
radius = Math.max(1.0, Math.min(100.0, Double.parseDouble(args[0]))); radius = Math.max(1.0, Math.min(100.0, Double.parseDouble(args[0])));
} } catch (NumberFormatException ignored)
catch (NumberFormatException ignored)
{ {
} }
} }
@ -38,8 +42,7 @@ public class Command_expel extends FreedomCommand
try try
{ {
strength = Math.max(0.0, Math.min(50.0, Double.parseDouble(args[1]))); strength = Math.max(0.0, Math.min(50.0, Double.parseDouble(args[1])));
} } catch (NumberFormatException ignored)
catch (NumberFormatException ignored)
{ {
} }
} }
@ -62,8 +65,7 @@ public class Command_expel extends FreedomCommand
try try
{ {
inRange = targetPosVec.distanceSquared(senderPos) < (radius * radius); inRange = targetPosVec.distanceSquared(senderPos) < (radius * radius);
} } catch (IllegalArgumentException ignored)
catch (IllegalArgumentException ignored)
{ {
} }
@ -78,11 +80,12 @@ public class Command_expel extends FreedomCommand
if (pushedPlayers.isEmpty()) if (pushedPlayers.isEmpty())
{ {
msg("No players pushed."); msgNew("No players were pushed.");
} } else
else
{ {
msg("Pushed " + pushedPlayers.size() + " players: " + StringUtils.join(pushedPlayers, ", ")); msgNew("Pushed <amount> players: <players>",
Placeholder.unparsed("amount", String.valueOf(pushedPlayers.size())),
Placeholder.unparsed("players", StringUtils.join(pushedPlayers, ", ")));
} }
return true; return true;

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