mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-07-01 20:46:41 +00:00
Compare commits
4 Commits
dependabot
...
RELEASE-20
Author | SHA1 | Date | |
---|---|---|---|
a33a39af19 | |||
e1e8f1b3b5 | |||
86a8e21d06 | |||
da37ca52fa |
23
.github/dependabot.yml
vendored
23
.github/dependabot.yml
vendored
@ -1,23 +0,0 @@
|
|||||||
# To get started with Dependabot version updates, you'll need to specify which
|
|
||||||
# package ecosystems to update and where the package manifests are located.
|
|
||||||
# Please see the documentation for all configuration options:
|
|
||||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
|
||||||
|
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
|
|
||||||
# Maintain Maven Updates
|
|
||||||
- package-ecosystem: "maven" # See documentation for possible values
|
|
||||||
directory: "/" # Location of package manifests
|
|
||||||
target-branch: "development"
|
|
||||||
open-pull-requests-limit: 50
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
||||||
|
|
||||||
# Maintain dependencies for GitHub Actions
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
target-branch: "development"
|
|
||||||
open-pull-requests-limit: 50
|
|
||||||
schedule:
|
|
||||||
interval: "daily"
|
|
6
.github/workflows/codacy-analysis.yml
vendored
6
.github/workflows/codacy-analysis.yml
vendored
@ -21,11 +21,11 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
# Checkout the repository to the GitHub Actions runner
|
# Checkout the repository to the GitHub Actions runner
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
|
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
|
||||||
- name: Run Codacy Analysis CLI
|
- name: Run Codacy Analysis CLI
|
||||||
uses: codacy/codacy-analysis-cli-action@v4.1.0
|
uses: codacy/codacy-analysis-cli-action@1.1.0
|
||||||
with:
|
with:
|
||||||
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
|
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
|
||||||
# You can also omit the token and run the tools that support default configurations
|
# You can also omit the token and run the tools that support default configurations
|
||||||
@ -41,6 +41,6 @@ jobs:
|
|||||||
|
|
||||||
# Upload the SARIF file generated in the previous step
|
# Upload the SARIF file generated in the previous step
|
||||||
- name: Upload SARIF results file
|
- name: Upload SARIF results file
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v1
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
|
13
.github/workflows/codeql-analysis.yml
vendored
13
.github/workflows/codeql-analysis.yml
vendored
@ -35,18 +35,17 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Setup Java JDK
|
- name: Setup Java JDK
|
||||||
uses: actions/setup-java@v3.6.0
|
uses: actions/setup-java@v1.4.3
|
||||||
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
|
# 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
|
java-version: 11
|
||||||
distribution: 'adopt'
|
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v1
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@ -57,7 +56,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v2
|
uses: github/codeql-action/autobuild@v1
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@ -71,4 +70,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v1
|
||||||
|
43
.github/workflows/downstream.yml
vendored
Normal file
43
.github/workflows/downstream.yml
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# This is a basic workflow to help you get started with Actions
|
||||||
|
|
||||||
|
name: Downstream Branch Updates
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '20 7 * * *'
|
||||||
|
# scheduled at 07:00 every Monday and Thursday
|
||||||
|
|
||||||
|
workflow_dispatch: # click the button on Github repo!
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync_with_upstream:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Sync main with upstream latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# Step 1: run a standard checkout action, provided by github
|
||||||
|
- name: Checkout main
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
|
# submodules: 'recursive' ### may be needed in your situation
|
||||||
|
|
||||||
|
# Step 2: run this sync action - specify the upstream repo, upstream branch to sync with, and target sync branch
|
||||||
|
- name: Pull (Fast-Forward) upstream changes
|
||||||
|
id: sync
|
||||||
|
uses: aormsby/Fork-Sync-With-Upstream-action@v2.1
|
||||||
|
with:
|
||||||
|
upstream_repository: AtlasMediaGroup/TotalFreedomMod
|
||||||
|
upstream_branch: main
|
||||||
|
target_branch: main
|
||||||
|
git_pull_args: --ff-only # optional arg use, defaults to simple 'pull'
|
||||||
|
|
||||||
|
# Step 3: Display a message if 'sync' step had new commits (simple test)
|
||||||
|
- name: Check for new commits
|
||||||
|
if: steps.sync.outputs.has_new_commits
|
||||||
|
run: echo "There were new commits."
|
||||||
|
|
||||||
|
# Step 4: Print a helpful timestamp for your records (not required, just nice)
|
||||||
|
- name: Timestamp
|
||||||
|
run: date
|
21
.github/workflows/java17-maven.yml
vendored
21
.github/workflows/java17-maven.yml
vendored
@ -1,21 +0,0 @@
|
|||||||
name: Java17-Maven-Build
|
|
||||||
|
|
||||||
on: [push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-java-17:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
# Checkout the code
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
# Java 16 Builds
|
|
||||||
- name: Set up JDK 17
|
|
||||||
uses: actions/setup-java@v3.6.0
|
|
||||||
with:
|
|
||||||
java-version: 17
|
|
||||||
distribution: 'adopt'
|
|
||||||
- name: Build with Maven
|
|
||||||
run: mvn -B package --file pom.xml
|
|
17
.github/workflows/maven.yml
vendored
Normal file
17
.github/workflows/maven.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
name: Maven-Build
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Set up JDK 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 11
|
||||||
|
- name: Build with Maven
|
||||||
|
run: mvn -B package --file pom.xml
|
13
.travis.yml
Normal file
13
.travis.yml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
language: java
|
||||||
|
jdk:
|
||||||
|
- oraclejdk11
|
||||||
|
- openjdk11
|
||||||
|
notifications:
|
||||||
|
email: false
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- sshpass
|
||||||
|
script: mvn clean install
|
||||||
|
after_success:
|
||||||
|
- ./travis-upload.sh
|
@ -1,4 +1,4 @@
|
|||||||
# TotalFreedomMod [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/java17-maven.yml) [](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade) [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml)
|
# TotalFreedomMod [](https://travis-ci.com/AtlasMediaGroup/TotalFreedomMod) [](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade)
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
@ -14,4 +14,4 @@ For information on our security policy and reporting an issue, please see [SECUR
|
|||||||
|
|
||||||
### Compiling
|
### Compiling
|
||||||
|
|
||||||
You need Maven to build. You'd also need to set the JDK version to Java 11 as that is the current standard as of now.
|
You need Maven to build. You'd also need to set the JDK version to Java 8 as that is the current standard as of now.
|
||||||
|
16
SECURITY.md
16
SECURITY.md
@ -9,26 +9,22 @@ 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.
|
These versions are currently actively supported by our team, and you should expect security patches where appropriate for these versions.
|
||||||
|
|
||||||
| Version | Supported | Support End: |
|
| Version | Supported | Support End: |
|
||||||
| ------------------- | ---------- | ------------------------------ |
|
| ------------------- | ------------------ | ------------------------------ |
|
||||||
| 2022.02 | ✅ | No Earlier than May 2022 |
|
| 2021.05 | :white_check_mark: | No Earlier than August 2021 |
|
||||||
|
|
||||||
### Legacy Supported
|
### Legacy Supported
|
||||||
These versions are no longer under active development, however we will look to release critical secuirty patches where appropriate.
|
These versions are no longer under active development, however we will look to release critical secuirty patches where appropriate.
|
||||||
|
|
||||||
| Version | Supported | Support End: |
|
| Version | Supported | Support End: |
|
||||||
| ------------------- | ---------- | ------------ |
|
| ------------------- | ------------------ | ------------ |
|
||||||
| 2021.09 | ⚠️ | April 2022 |
|
| 2021.04 | :white_check_mark: | July 2021 |
|
||||||
|
|
||||||
|
|
||||||
### 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.
|
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: |
|
| Version | Supported | Support Ended: |
|
||||||
| ------------------- | ------------------ | ------------------- |
|
| ------------------- | ------------------ | ------------------- |
|
||||||
| 2021.06 | :x: | October 2021 |
|
|
||||||
| 2021.05 | :x: | September 2021 |
|
|
||||||
| 2021.04 | :x: | July 2021 |
|
|
||||||
| 2021.02 | :x: | 6 June 2021 |
|
| 2021.02 | :x: | 6 June 2021 |
|
||||||
| 2020.11 | :x: | 3 May 2021 |
|
| 2020.11 | :x: | 3 May 2021 |
|
||||||
| 6.0.x (Pre-Release) | :x: | December 2020 |
|
| 6.0.x (Pre-Release) | :x: | December 2020 |
|
||||||
|
@ -13,7 +13,7 @@ You can copy and paste the single properties, into the pom.xml file and the IDE
|
|||||||
That way multiple projects can share the same settings (useful for formatting rules for example).
|
That way multiple projects can share the same settings (useful for formatting rules for example).
|
||||||
Any value defined here will override the pom.xml file value but is only applicable to the current project.
|
Any value defined here will override the pom.xml file value but is only applicable to the current project.
|
||||||
-->
|
-->
|
||||||
<netbeans.hint.jdkPlatform>JDK_17</netbeans.hint.jdkPlatform>
|
<netbeans.hint.jdkPlatform>JDK_11</netbeans.hint.jdkPlatform>
|
||||||
<netbeans.checkstyle.format>true</netbeans.checkstyle.format>
|
<netbeans.checkstyle.format>true</netbeans.checkstyle.format>
|
||||||
</properties>
|
</properties>
|
||||||
</project-shared-configuration>
|
</project-shared-configuration>
|
||||||
|
137
pom.xml
137
pom.xml
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<groupId>me.totalfreedom</groupId>
|
<groupId>me.totalfreedom</groupId>
|
||||||
<artifactId>TotalFreedomMod</artifactId>
|
<artifactId>TotalFreedomMod</artifactId>
|
||||||
<version>2022.06</version>
|
<version>2021.05</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@ -39,10 +39,9 @@
|
|||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>atlas-nexus-01-totalfreedom-development</id>
|
<id>jitpack.io</id>
|
||||||
<url>https://nexus-01.core.atlas-media.co.uk/repository/totalfreedom-development/</url>
|
<url>https://jitpack.io</url>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
@ -50,6 +49,11 @@
|
|||||||
<url>https://repo.codemc.org/repository/maven-public/</url>
|
<url>https://repo.codemc.org/repository/maven-public/</url>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>nms-repo</id>
|
||||||
|
<url>https://repo.codemc.org/repository/nms/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>spigot-repo</id>
|
<id>spigot-repo</id>
|
||||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||||
@ -97,10 +101,19 @@
|
|||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>esentialsx-repo</id>
|
<id>papermc</id>
|
||||||
<url>https://repo.essentialsx.net/releases/</url>
|
<url>https://papermc.io/repo/repository/maven-public/</url>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>rayzr-repo</id>
|
||||||
|
<url>https://cdn.rawgit.com/Rayzr522/maven-repo/master/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>ess-repo</id>
|
||||||
|
<url>https://ci.ender.zone/plugin/repository/everything/</url>
|
||||||
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@ -108,28 +121,42 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-io</groupId>
|
<groupId>commons-io</groupId>
|
||||||
<artifactId>commons-io</artifactId>
|
<artifactId>commons-io</artifactId>
|
||||||
<version>2.11.0</version>
|
<version>2.8.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
<version>3.12.0</version>
|
<version>3.11</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>1.15</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.speedxx</groupId>
|
||||||
|
<artifactId>Mojangson</artifactId>
|
||||||
|
<version>1957eef8d6</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bstats</groupId>
|
<groupId>org.bstats</groupId>
|
||||||
<artifactId>bstats-bukkit</artifactId>
|
<artifactId>bstats-bukkit</artifactId>
|
||||||
<version>3.0.0</version>
|
<version>1.8</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>me.totalfreedom.scissors</groupId>
|
<groupId>org.spigotmc</groupId>
|
||||||
<artifactId>scissors-api</artifactId>
|
<artifactId>spigot</artifactId>
|
||||||
<version>1.17.1-R0.1-SNAPSHOT</version>
|
<version>1.16.5-R0.1-SNAPSHOT</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@ -141,44 +168,58 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.AtlasMediaGroup</groupId>
|
<groupId>com.github.TotalFreedomMC</groupId>
|
||||||
<artifactId>TF-LibsDisguises</artifactId>
|
<artifactId>TF-LibsDisguises</artifactId>
|
||||||
<version>5a340341b0</version>
|
<version>48f01cf2fe</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sk89q.worldedit</groupId>
|
<groupId>com.sk89q.worldedit</groupId>
|
||||||
<artifactId>worldedit-bukkit</artifactId>
|
<artifactId>worldedit-bukkit</artifactId>
|
||||||
<version>7.2.12</version>
|
<version>7.3.0-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.ess3</groupId>
|
||||||
|
<artifactId>EssentialsX</artifactId>
|
||||||
|
<version>2.18.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.dv8tion</groupId>
|
<groupId>net.dv8tion</groupId>
|
||||||
<artifactId>JDA</artifactId>
|
<artifactId>JDA</artifactId>
|
||||||
<version>4.4.0_352</version>
|
<version>4.2.1_255</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.coreprotect</groupId>
|
<groupId>net.coreprotect</groupId>
|
||||||
<artifactId>coreprotect</artifactId>
|
<artifactId>coreprotect</artifactId>
|
||||||
<version>21.2</version>
|
<version>19.3</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sk89q.worldguard</groupId>
|
<groupId>com.sk89q.worldguard</groupId>
|
||||||
<artifactId>worldguard-bukkit</artifactId>
|
<artifactId>worldguard-bukkit</artifactId>
|
||||||
<version>7.0.7</version>
|
<version>7.0.4</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.papermc</groupId>
|
<groupId>io.papermc</groupId>
|
||||||
<artifactId>paperlib</artifactId>
|
<artifactId>paperlib</artifactId>
|
||||||
<version>1.0.7</version>
|
<version>1.0.6</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.rayzr522</groupId>
|
||||||
|
<artifactId>jsonmessage</artifactId>
|
||||||
|
<version>1.0.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@ -190,61 +231,59 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.essentialsx</groupId>
|
<groupId>net.goldtreeservers</groupId>
|
||||||
<artifactId>EssentialsX</artifactId>
|
<artifactId>worldguardextraflags</artifactId>
|
||||||
<version>2.19.6</version>
|
<version>4.0.0</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.reflections</groupId>
|
<groupId>org.reflections</groupId>
|
||||||
<artifactId>reflections</artifactId>
|
<artifactId>reflections</artifactId>
|
||||||
<version>0.10.2</version>
|
<version>0.9.12</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.javassist</groupId>
|
<groupId>org.javassist</groupId>
|
||||||
<artifactId>javassist</artifactId>
|
<artifactId>javassist</artifactId>
|
||||||
<version>3.29.1-GA</version>
|
<version>3.27.0-GA</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.AtlasMediaGroup</groupId>
|
||||||
|
<artifactId>TFGuilds</artifactId>
|
||||||
|
<version>master-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jetbrains</groupId>
|
<groupId>org.jetbrains</groupId>
|
||||||
<artifactId>annotations</artifactId>
|
<artifactId>annotations</artifactId>
|
||||||
<version>23.0.0</version>
|
<version>20.1.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
<version>3.1.2</version>
|
<version>3.1.1</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter</artifactId>
|
<artifactId>junit-jupiter</artifactId>
|
||||||
<version>5.9.0</version>
|
<version>5.4.2</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.sisu</groupId>
|
<groupId>org.eclipse.sisu</groupId>
|
||||||
<artifactId>org.eclipse.sisu.inject</artifactId>
|
<artifactId>org.eclipse.sisu.inject</artifactId>
|
||||||
<version>0.3.5</version>
|
<version>0.3.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<pluginRepositories>
|
|
||||||
<pluginRepository>
|
|
||||||
<id>apache.snapshots</id>
|
|
||||||
<url>https://repository.apache.org/snapshots/</url>
|
|
||||||
</pluginRepository>
|
|
||||||
</pluginRepositories>
|
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<!-- Filter resources for build.properties -->
|
<!-- Filter resources for build.properties -->
|
||||||
<resources>
|
<resources>
|
||||||
@ -259,12 +298,12 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.10.1</version>
|
<version>3.8.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<outputFileName>TotalFreedomMod.jar</outputFileName>
|
<outputFileName>TotalFreedomMod.jar</outputFileName>
|
||||||
<compilerVersion>17</compilerVersion>
|
<compilerVersion>11</compilerVersion>
|
||||||
<source>17</source>
|
<source>11</source>
|
||||||
<target>17</target>
|
<target>11</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
@ -272,7 +311,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>pl.project13.maven</groupId>
|
<groupId>pl.project13.maven</groupId>
|
||||||
<artifactId>git-commit-id-plugin</artifactId>
|
<artifactId>git-commit-id-plugin</artifactId>
|
||||||
<version>4.9.10</version>
|
<version>4.0.2</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>get-the-git-infos</id>
|
<id>get-the-git-infos</id>
|
||||||
@ -313,7 +352,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
<version>3.1.0</version>
|
<version>1.8</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>default-cli</id>
|
<id>default-cli</id>
|
||||||
@ -343,7 +382,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>properties-maven-plugin</artifactId>
|
<artifactId>properties-maven-plugin</artifactId>
|
||||||
<version>1.1.0</version>
|
<version>1.0.0</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>initialize</phase>
|
<phase>initialize</phase>
|
||||||
@ -363,7 +402,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>buildnumber-maven-plugin</artifactId>
|
<artifactId>buildnumber-maven-plugin</artifactId>
|
||||||
<version>3.0.0</version>
|
<version>1.4</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>generate-resources</phase>
|
<phase>generate-resources</phase>
|
||||||
@ -388,7 +427,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
<version>3.4.1</version>
|
<version>3.2.4</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>package</phase>
|
<phase>package</phase>
|
||||||
@ -412,11 +451,13 @@
|
|||||||
<includes>
|
<includes>
|
||||||
<include>commons-io:commons-io</include>
|
<include>commons-io:commons-io</include>
|
||||||
<include>org.apache.commons:commons-lang3</include>
|
<include>org.apache.commons:commons-lang3</include>
|
||||||
|
<include>commons-codec:commons-codec</include>
|
||||||
<include>org.reflections:reflections</include>
|
<include>org.reflections:reflections</include>
|
||||||
<include>org.javassist:javassist</include>
|
<include>org.javassist:javassist</include>
|
||||||
|
<include>me.rayzr522:jsonmessage</include>
|
||||||
<include>io.papermc:paperlib</include>
|
<include>io.papermc:paperlib</include>
|
||||||
|
<include>com.github.speedxx:Mojangson</include>
|
||||||
<include>org.bstats:bstats-bukkit</include>
|
<include>org.bstats:bstats-bukkit</include>
|
||||||
<include>org.bstats:bstats-base</include>
|
|
||||||
<include>org.jetbrains:annotations</include>
|
<include>org.jetbrains:annotations</include>
|
||||||
</includes>
|
</includes>
|
||||||
</artifactSet>
|
</artifactSet>
|
||||||
@ -434,7 +475,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
<version>3.1.2</version>
|
<version>3.1.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<configLocation>checkstyle.xml</configLocation>
|
<configLocation>checkstyle.xml</configLocation>
|
||||||
<failOnViolation>true</failOnViolation>
|
<failOnViolation>true</failOnViolation>
|
||||||
|
@ -85,10 +85,6 @@ public class AutoEject extends FreedomService
|
|||||||
player.kickPlayer(kickMessage);
|
player.kickPlayer(kickMessage);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
FLog.warning("Unrecognized EjectMethod " + method.name() + " found, defaulting to STRIKE_THREE");
|
|
||||||
}
|
|
||||||
case STRIKE_THREE:
|
case STRIKE_THREE:
|
||||||
{
|
{
|
||||||
plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage));
|
plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage));
|
||||||
|
@ -136,7 +136,7 @@ public class ChatManager extends FreedomService
|
|||||||
event.setFormat(format);
|
event.setFormat(format);
|
||||||
|
|
||||||
// Send to discord
|
// Send to discord
|
||||||
if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist() && !plugin.pl.getPlayer(player).isMuted())
|
if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist() && !plugin.pl.getPlayer(player).isMuted() && !plugin.tfg.inGuildChat(player))
|
||||||
{
|
{
|
||||||
plugin.dc.messageChatChannel(player.getName() + " \u00BB " + ChatColor.stripColor(message));
|
plugin.dc.messageChatChannel(player.getName() + " \u00BB " + ChatColor.stripColor(message));
|
||||||
}
|
}
|
||||||
@ -175,15 +175,15 @@ public class ChatManager extends FreedomService
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reportAction(Player reporter, String reportedName, String report)
|
public void reportAction(Player reporter, Player reported, String report)
|
||||||
{
|
{
|
||||||
for (Player player : server.getOnlinePlayers())
|
for (Player player : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(player))
|
if (plugin.al.isAdmin(player))
|
||||||
{
|
{
|
||||||
playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reportedName + " for " + report);
|
playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FLog.info("[REPORTS] " + reporter.getName() + " has reported " + reportedName + " for " + report);
|
FLog.info("[REPORTS] " + reporter.getName() + " has reported " + reported.getName() + " for " + report);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -25,6 +25,11 @@ public class CommandSpy extends FreedomService
|
|||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(player) && plugin.al.getAdmin(player).getCommandSpy())
|
if (plugin.al.isAdmin(player) && plugin.al.getAdmin(player).getCommandSpy())
|
||||||
{
|
{
|
||||||
|
if (plugin.al.isAdmin(event.getPlayer()) && !plugin.al.isSeniorAdmin(player))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (player != event.getPlayer())
|
if (player != event.getPlayer())
|
||||||
{
|
{
|
||||||
FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage());
|
FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage());
|
||||||
|
@ -2,8 +2,6 @@ package me.totalfreedom.totalfreedommod;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
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;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
@ -35,10 +33,7 @@ public class EntityWiper extends FreedomService
|
|||||||
@Override
|
@Override
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
if (ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
|
wipeEntities(false);
|
||||||
{
|
|
||||||
wipeEntities(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}.runTaskTimer(plugin, 600L, 600L); // 30 second delay after startup + run every 30 seconds
|
}.runTaskTimer(plugin, 600L, 600L); // 30 second delay after startup + run every 30 seconds
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,8 @@ package me.totalfreedom.totalfreedommod;
|
|||||||
import io.papermc.lib.PaperLib;
|
import io.papermc.lib.PaperLib;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import me.rayzr522.jsonmessage.JSONMessage;
|
||||||
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;
|
||||||
@ -22,7 +20,6 @@ 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;
|
|
||||||
|
|
||||||
public class LoginProcess extends FreedomService
|
public class LoginProcess extends FreedomService
|
||||||
{
|
{
|
||||||
@ -61,13 +58,13 @@ public class LoginProcess extends FreedomService
|
|||||||
@EventHandler(priority = EventPriority.NORMAL)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
||||||
{
|
{
|
||||||
final Admin entry = plugin.al.getEntryByUuid(event.getUniqueId());
|
final String ip = event.getAddress().getHostAddress().trim();
|
||||||
final boolean isAdmin = entry != null && entry.isActive();
|
final boolean isAdmin = plugin.al.getEntryByIp(ip) != null;
|
||||||
|
|
||||||
// Check if the player is already online
|
// Check if the player is already online
|
||||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (!onlinePlayer.getUniqueId().equals(event.getUniqueId()))
|
if (!onlinePlayer.getName().equalsIgnoreCase(event.getName()))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -89,7 +86,7 @@ public class LoginProcess extends FreedomService
|
|||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
final String username = player.getName();
|
final String username = player.getName();
|
||||||
final UUID uuid = player.getUniqueId();
|
final String ip = event.getAddress().getHostAddress().trim();
|
||||||
|
|
||||||
// Check username length
|
// Check username length
|
||||||
if (username.length() < MIN_USERNAME_LENGTH || username.length() > MAX_USERNAME_LENGTH)
|
if (username.length() < MIN_USERNAME_LENGTH || username.length() > MAX_USERNAME_LENGTH)
|
||||||
@ -123,8 +120,7 @@ public class LoginProcess extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Validation below this point
|
// Validation below this point
|
||||||
final Admin entry = plugin.al.getEntryByUuid(uuid);
|
if (plugin.al.getEntryByIp(ip) != null) // Check if player is admin
|
||||||
if (entry != null && entry.isActive()) // Check if player is admin
|
|
||||||
{
|
{
|
||||||
// Force-allow log in
|
// Force-allow log in
|
||||||
event.allow();
|
event.allow();
|
||||||
@ -179,9 +175,12 @@ public class LoginProcess extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Whitelist
|
// Whitelist
|
||||||
if (server.hasWhitelist() && !player.isWhitelisted())
|
if (plugin.si.isWhitelisted())
|
||||||
{
|
{
|
||||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
if (!plugin.si.getWhitelisted().contains(username.toLowerCase()))
|
||||||
|
{
|
||||||
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,22 +191,6 @@ public class LoginProcess extends FreedomService
|
|||||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||||
final PlayerData playerData = plugin.pl.getData(player);
|
final PlayerData playerData = plugin.pl.getData(player);
|
||||||
|
|
||||||
// Sends a message to the player if they have never joined before (or simply lack player data).
|
|
||||||
if (!event.getPlayer().hasPlayedBefore() && ConfigEntry.FIRST_JOIN_INFO_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
new BukkitRunnable()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
for (String line : ConfigEntry.FIRST_JOIN_INFO.getStringList())
|
|
||||||
{
|
|
||||||
player.sendMessage(FUtil.colorize(line));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.runTaskLater(plugin, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60);
|
player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60);
|
||||||
player.setOp(true);
|
player.setOp(true);
|
||||||
|
|
||||||
@ -222,7 +205,7 @@ public class LoginProcess extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!playerData.getIps().contains(FUtil.getIp(player)))
|
if (!playerData.hasVerification() && !playerData.getIps().contains(FUtil.getIp(player)))
|
||||||
{
|
{
|
||||||
playerData.addIp(FUtil.getIp(player));
|
playerData.addIp(FUtil.getIp(player));
|
||||||
plugin.pl.save(playerData);
|
plugin.pl.save(playerData);
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
import com.google.common.collect.Multimap;
|
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||||
|
import ca.momothereal.mojangson.value.MojangsonCompound;
|
||||||
|
import ca.momothereal.mojangson.value.MojangsonValue;
|
||||||
import io.papermc.lib.PaperLib;
|
import io.papermc.lib.PaperLib;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import net.minecraft.server.v1_16_R3.NBTTagCompound;
|
||||||
|
import net.minecraft.server.v1_16_R3.NBTTagList;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.attribute.Attribute;
|
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||||
import org.bukkit.attribute.AttributeModifier;
|
|
||||||
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;
|
||||||
@ -19,7 +20,6 @@ import org.bukkit.event.player.PlayerLoginEvent;
|
|||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
|
|
||||||
public class MovementValidator extends FreedomService
|
public class MovementValidator extends FreedomService
|
||||||
{
|
{
|
||||||
@ -133,49 +133,55 @@ public class MovementValidator extends FreedomService
|
|||||||
|
|
||||||
private Boolean exploitItem(ItemStack item)
|
private Boolean exploitItem(ItemStack item)
|
||||||
{
|
{
|
||||||
if (item == null)
|
net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
|
||||||
|
NBTTagList modifiers = getAttributeList(nmsStack);
|
||||||
|
MojangsonCompound compound = new MojangsonCompound();
|
||||||
|
boolean foundNegative = false;
|
||||||
|
boolean foundPositive = false;
|
||||||
|
try
|
||||||
{
|
{
|
||||||
return false;
|
String mod = modifiers.toString();
|
||||||
}
|
String fancy = ("{" + (mod.substring(1, mod.length() - 1).replace("{", "").replace("}", "")) + "}");
|
||||||
|
compound.read(fancy);
|
||||||
ItemMeta meta = item.getItemMeta();
|
for (String key : compound.keySet())
|
||||||
if (meta != null)
|
|
||||||
{
|
|
||||||
Multimap<Attribute, AttributeModifier> attributes = meta.getAttributeModifiers();
|
|
||||||
if (attributes != null)
|
|
||||||
{
|
{
|
||||||
Map<Attribute, Collection<AttributeModifier>> attrMap = attributes.asMap();
|
if (Objects.equals(key, "Amount")) //null-safe .equals()
|
||||||
|
|
||||||
// For every attribute...
|
|
||||||
for (Attribute attr : attributes.keySet())
|
|
||||||
{
|
{
|
||||||
// Default values
|
@SuppressWarnings("rawtypes")
|
||||||
boolean posInf = false;
|
List<MojangsonValue> values = compound.get(key);
|
||||||
boolean negInf = false;
|
for (MojangsonValue<?> val : values)
|
||||||
|
|
||||||
// For every AttributeModifier...
|
|
||||||
for (AttributeModifier modifier : attrMap.get(attr))
|
|
||||||
{
|
{
|
||||||
// Are they ∞ or -∞?
|
if (val.getValue().toString().equals("Infinityd"))
|
||||||
if (modifier.getAmount() == Double.POSITIVE_INFINITY)
|
|
||||||
{
|
{
|
||||||
posInf = true;
|
foundPositive = true;
|
||||||
}
|
}
|
||||||
else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
|
if (val.getValue().toString().equals("-Infinityd"))
|
||||||
{
|
{
|
||||||
negInf = true;
|
foundNegative = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Are both values set as true?
|
|
||||||
if (posInf && negInf)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
catch (MojangsonParseException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return foundNegative && foundPositive;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack)
|
||||||
|
{
|
||||||
|
if (stack.getTag() == null)
|
||||||
|
{
|
||||||
|
stack.setTag(new NBTTagCompound());
|
||||||
|
}
|
||||||
|
NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10);
|
||||||
|
if (attr == null)
|
||||||
|
{
|
||||||
|
stack.getTag().set("AttributeModifiers", new NBTTagList());
|
||||||
|
}
|
||||||
|
return stack.getTag().getList("AttributeModifiers", 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,7 +3,7 @@ package me.totalfreedom.totalfreedommod;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.google.common.base.Strings;
|
import joptsimple.internal.Strings;
|
||||||
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.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME;
|
||||||
|
|
||||||
|
public class SavedFlags extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Map<String, Boolean> getSavedFlags()
|
||||||
|
{
|
||||||
|
Map<String, Boolean> flags = null;
|
||||||
|
File input = new File(TotalFreedomMod.getPlugin().getDataFolder(), SAVED_FLAGS_FILENAME);
|
||||||
|
|
||||||
|
if (input.exists())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis))
|
||||||
|
{
|
||||||
|
flags = (HashMap<String, Boolean>)ois.readObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getSavedFlag(String flag) throws Exception
|
||||||
|
{
|
||||||
|
Boolean flagValue = null;
|
||||||
|
|
||||||
|
Map<String, Boolean> flags = getSavedFlags();
|
||||||
|
|
||||||
|
if (flags != null)
|
||||||
|
{
|
||||||
|
if (flags.containsKey(flag))
|
||||||
|
{
|
||||||
|
flagValue = flags.get(flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flagValue != null)
|
||||||
|
{
|
||||||
|
return flagValue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSavedFlag(String flag, boolean value)
|
||||||
|
{
|
||||||
|
Map<String, Boolean> flags = getSavedFlags();
|
||||||
|
|
||||||
|
if (flags == null)
|
||||||
|
{
|
||||||
|
flags = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
flags.put(flag, value);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), SAVED_FLAGS_FILENAME));
|
||||||
|
final ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||||
|
oos.writeObject(flags);
|
||||||
|
oos.close();
|
||||||
|
fos.close();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import net.minecraft.server.v1_16_R3.EntityPlayer;
|
||||||
|
import net.minecraft.server.v1_16_R3.MinecraftServer;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
|
||||||
|
|
||||||
|
public class ServerInterface extends FreedomService
|
||||||
|
{
|
||||||
|
public static final String COMPILE_NMS_VERSION = "v1_16_R3";
|
||||||
|
|
||||||
|
public static void warnVersion()
|
||||||
|
{
|
||||||
|
final String nms = FUtil.getNMSVersion();
|
||||||
|
|
||||||
|
if (!COMPILE_NMS_VERSION.equals(nms))
|
||||||
|
{
|
||||||
|
FLog.warning(TotalFreedomMod.pluginName + " is compiled for " + COMPILE_NMS_VERSION + " but the server is running version " + nms + "!");
|
||||||
|
FLog.warning("This might result in unexpected behaviour!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnlineMode(boolean mode)
|
||||||
|
{
|
||||||
|
getServer().setOnlineMode(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int purgeWhitelist()
|
||||||
|
{
|
||||||
|
String[] whitelisted = getServer().getPlayerList().getWhitelisted();
|
||||||
|
int size = whitelisted.length;
|
||||||
|
for (EntityPlayer player : getServer().getPlayerList().players)
|
||||||
|
{
|
||||||
|
getServer().getPlayerList().getWhitelist().remove(player.getProfile());
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
getServer().getPlayerList().getWhitelist().save();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.warning("Could not purge the whitelist!");
|
||||||
|
FLog.warning(ex);
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isWhitelisted()
|
||||||
|
{
|
||||||
|
return getServer().getPlayerList().getHasWhitelist();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<?> getWhitelisted()
|
||||||
|
{
|
||||||
|
return Arrays.asList(getServer().getPlayerList().getWhitelisted());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion()
|
||||||
|
{
|
||||||
|
return getServer().getVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
private MinecraftServer getServer()
|
||||||
|
{
|
||||||
|
return ((CraftServer)Bukkit.getServer()).getServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package me.totalfreedom.totalfreedommod;
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
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 org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -8,13 +7,8 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.server.ServerListPingEvent;
|
import org.bukkit.event.server.ServerListPingEvent;
|
||||||
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
|
|
||||||
public class ServerPing extends FreedomService
|
public class ServerPing extends FreedomService
|
||||||
{
|
{
|
||||||
private final Gson gson = new Gson();
|
|
||||||
private final VersionMeta meta = gson.fromJson(new InputStreamReader(Bukkit.class.getClassLoader().getResourceAsStream("version.json")),VersionMeta.class);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
@ -60,7 +54,7 @@ public class ServerPing extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", meta.id);
|
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion());
|
||||||
baseMotd = baseMotd.replace("\\n", "\n");
|
baseMotd = baseMotd.replace("\\n", "\n");
|
||||||
baseMotd = FUtil.colorize(baseMotd);
|
baseMotd = FUtil.colorize(baseMotd);
|
||||||
|
|
||||||
@ -79,9 +73,4 @@ public class ServerPing extends FreedomService
|
|||||||
|
|
||||||
event.setMotd(motd.toString().trim());
|
event.setMotd(motd.toString().trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class VersionMeta
|
|
||||||
{
|
|
||||||
private String id;
|
|
||||||
}
|
|
||||||
}
|
}
|
34
src/main/java/me/totalfreedom/totalfreedommod/Sitter.java
Normal file
34
src/main/java/me/totalfreedom/totalfreedommod/Sitter.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.command.Command_sit;
|
||||||
|
import org.bukkit.entity.ArmorStand;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.spigotmc.event.entity.EntityDismountEvent;
|
||||||
|
|
||||||
|
public class Sitter extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onEntityDismount(EntityDismountEvent e)
|
||||||
|
{
|
||||||
|
Entity dm = e.getDismounted();
|
||||||
|
if (dm instanceof ArmorStand)
|
||||||
|
{
|
||||||
|
if (Command_sit.STANDS.contains(dm))
|
||||||
|
{
|
||||||
|
Command_sit.STANDS.remove(dm);
|
||||||
|
dm.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -14,11 +14,13 @@ import me.totalfreedom.totalfreedommod.blocking.InteractBlocker;
|
|||||||
import me.totalfreedom.totalfreedommod.blocking.MobBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.MobBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.PVPBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.PVPBlocker;
|
||||||
import me.totalfreedom.totalfreedommod.blocking.PotionBlocker;
|
import me.totalfreedom.totalfreedommod.blocking.PotionBlocker;
|
||||||
|
import me.totalfreedom.totalfreedommod.blocking.SignBlocker;
|
||||||
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.BukkitTelnetBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
|
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
|
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
|
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
|
||||||
|
import me.totalfreedom.totalfreedommod.bridge.TFGuildsBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
|
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
|
||||||
import me.totalfreedom.totalfreedommod.bridge.WorldGuardBridge;
|
import me.totalfreedom.totalfreedommod.bridge.WorldGuardBridge;
|
||||||
import me.totalfreedom.totalfreedommod.caging.Cager;
|
import me.totalfreedom.totalfreedommod.caging.Cager;
|
||||||
@ -52,6 +54,7 @@ import org.bukkit.generator.ChunkGenerator;
|
|||||||
import org.bukkit.plugin.Plugin;
|
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 org.spigotmc.SpigotConfig;
|
||||||
|
|
||||||
public class TotalFreedomMod extends JavaPlugin
|
public class TotalFreedomMod extends JavaPlugin
|
||||||
{
|
{
|
||||||
@ -71,6 +74,8 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
// Command Loader
|
// Command Loader
|
||||||
public CommandLoader cl;
|
public CommandLoader cl;
|
||||||
// Services
|
// Services
|
||||||
|
public ServerInterface si;
|
||||||
|
public SavedFlags sf;
|
||||||
public WorldManager wm;
|
public WorldManager wm;
|
||||||
public LogViewer lv;
|
public LogViewer lv;
|
||||||
public AdminList al;
|
public AdminList al;
|
||||||
@ -117,7 +122,9 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
public Trailer tr;
|
public Trailer tr;
|
||||||
public HTTPDaemon hd;
|
public HTTPDaemon hd;
|
||||||
public WorldRestrictions wr;
|
public WorldRestrictions wr;
|
||||||
|
public SignBlocker snp;
|
||||||
public EntityWiper ew;
|
public EntityWiper ew;
|
||||||
|
public Sitter st;
|
||||||
public VanishHandler vh;
|
public VanishHandler vh;
|
||||||
public Pterodactyl ptero;
|
public Pterodactyl ptero;
|
||||||
//
|
//
|
||||||
@ -126,6 +133,7 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
public EssentialsBridge esb;
|
public EssentialsBridge esb;
|
||||||
public LibsDisguisesBridge ldb;
|
public LibsDisguisesBridge ldb;
|
||||||
public CoreProtectBridge cpb;
|
public CoreProtectBridge cpb;
|
||||||
|
public TFGuildsBridge tfg;
|
||||||
public WorldEditBridge web;
|
public WorldEditBridge web;
|
||||||
public WorldGuardBridge wgb;
|
public WorldGuardBridge wgb;
|
||||||
|
|
||||||
@ -169,6 +177,9 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
final MethodTimer timer = new MethodTimer();
|
final MethodTimer timer = new MethodTimer();
|
||||||
timer.start();
|
timer.start();
|
||||||
|
|
||||||
|
// Warn if we're running on a wrong version
|
||||||
|
ServerInterface.warnVersion();
|
||||||
|
|
||||||
// Delete unused files
|
// Delete unused files
|
||||||
FUtil.deleteCoreDumps();
|
FUtil.deleteCoreDumps();
|
||||||
FUtil.deleteFolder(new File("./_deleteme"));
|
FUtil.deleteFolder(new File("./_deleteme"));
|
||||||
@ -176,6 +187,7 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
fsh = new FreedomServiceHandler();
|
fsh = new FreedomServiceHandler();
|
||||||
|
|
||||||
config = new MainConfig();
|
config = new MainConfig();
|
||||||
|
config.load();
|
||||||
|
|
||||||
if (FUtil.inDeveloperMode())
|
if (FUtil.inDeveloperMode())
|
||||||
{
|
{
|
||||||
@ -201,10 +213,13 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
FLog.info("Started " + fsh.getServiceAmount() + " services.");
|
FLog.info("Started " + fsh.getServiceAmount() + " services.");
|
||||||
|
|
||||||
timer.update();
|
timer.update();
|
||||||
FLog.info("Version " + pluginVersion + " enabled in " + timer.getTotal() + "ms");
|
FLog.info("Version " + pluginVersion + " for " + ServerInterface.COMPILE_NMS_VERSION + " enabled in " + timer.getTotal() + "ms");
|
||||||
|
|
||||||
// Metrics @ https://bstats.org/plugin/bukkit/TotalFreedomMod/2966
|
// Metrics @ https://bstats.org/plugin/bukkit/TotalFreedomMod/2966
|
||||||
new Metrics(this, 2966);
|
new Metrics(this, 2966);
|
||||||
|
|
||||||
|
// little workaround to stop spigot from autorestarting - causing AMP to detach from process.
|
||||||
|
SpigotConfig.config.set("settings.restart-on-crash", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -283,6 +298,8 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
private void initServices()
|
private void initServices()
|
||||||
{
|
{
|
||||||
// Start services
|
// Start services
|
||||||
|
si = new ServerInterface();
|
||||||
|
sf = new SavedFlags();
|
||||||
wm = new WorldManager();
|
wm = new WorldManager();
|
||||||
lv = new LogViewer();
|
lv = new LogViewer();
|
||||||
sql = new SQLite();
|
sql = new SQLite();
|
||||||
@ -310,7 +327,9 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
im = new IndefiniteBanList();
|
im = new IndefiniteBanList();
|
||||||
pem = new PermissionManager();
|
pem = new PermissionManager();
|
||||||
gr = new GameRuleHandler();
|
gr = new GameRuleHandler();
|
||||||
|
snp = new SignBlocker();
|
||||||
ew = new EntityWiper();
|
ew = new EntityWiper();
|
||||||
|
st = new Sitter();
|
||||||
vh = new VanishHandler();
|
vh = new VanishHandler();
|
||||||
ptero = new Pterodactyl();
|
ptero = new Pterodactyl();
|
||||||
}
|
}
|
||||||
@ -338,6 +357,7 @@ public class TotalFreedomMod extends JavaPlugin
|
|||||||
cpb = new CoreProtectBridge();
|
cpb = new CoreProtectBridge();
|
||||||
esb = new EssentialsBridge();
|
esb = new EssentialsBridge();
|
||||||
ldb = new LibsDisguisesBridge();
|
ldb = new LibsDisguisesBridge();
|
||||||
|
tfg = new TFGuildsBridge();
|
||||||
web = new WorldEditBridge();
|
web = new WorldEditBridge();
|
||||||
wgb = new WorldGuardBridge();
|
wgb = new WorldGuardBridge();
|
||||||
}
|
}
|
||||||
|
@ -2,23 +2,26 @@ package me.totalfreedom.totalfreedommod.admin;
|
|||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode;
|
import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode;
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
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;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Server;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class Admin
|
public class Admin
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
private final List<String> ips = new ArrayList<>();
|
private final List<String> ips = new ArrayList<>();
|
||||||
private UUID uuid;
|
private String name;
|
||||||
private boolean active = true;
|
private boolean active = true;
|
||||||
private Rank rank = Rank.ADMIN;
|
private Rank rank = Rank.ADMIN;
|
||||||
private Date lastLogin = new Date();
|
private Date lastLogin = new Date();
|
||||||
@ -29,7 +32,7 @@ public class Admin
|
|||||||
|
|
||||||
public Admin(Player player)
|
public Admin(Player player)
|
||||||
{
|
{
|
||||||
uuid = player.getUniqueId();
|
this.name = player.getName();
|
||||||
this.ips.add(FUtil.getIp(player));
|
this.ips.add(FUtil.getIp(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +40,7 @@ public class Admin
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.uuid = UUID.fromString(resultSet.getString("uuid"));
|
this.name = resultSet.getString("username");
|
||||||
this.active = resultSet.getBoolean("active");
|
this.active = resultSet.getBoolean("active");
|
||||||
this.rank = Rank.findRank(resultSet.getString("rank"));
|
this.rank = Rank.findRank(resultSet.getString("rank"));
|
||||||
this.ips.clear();
|
this.ips.clear();
|
||||||
@ -59,7 +62,7 @@ public class Admin
|
|||||||
{
|
{
|
||||||
final StringBuilder output = new StringBuilder();
|
final StringBuilder output = new StringBuilder();
|
||||||
|
|
||||||
output.append("Admin: ").append(getName() != null ? getName() : getUuid().toString()).append("\n")
|
output.append("Admin: ").append(name).append("\n")
|
||||||
.append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n")
|
.append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n")
|
||||||
.append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n")
|
.append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n")
|
||||||
.append("- Rank: ").append(rank.getName()).append("\n")
|
.append("- Rank: ").append(rank.getName()).append("\n")
|
||||||
@ -75,7 +78,7 @@ public class Admin
|
|||||||
{
|
{
|
||||||
Map<String, Object> map = new HashMap<String, Object>()
|
Map<String, Object> map = new HashMap<String, Object>()
|
||||||
{{
|
{{
|
||||||
put("uuid", uuid.toString());
|
put("username", name);
|
||||||
put("active", active);
|
put("active", active);
|
||||||
put("rank", rank.toString());
|
put("rank", rank.toString());
|
||||||
put("ips", FUtil.listToString(ips));
|
put("ips", FUtil.listToString(ips));
|
||||||
@ -117,20 +120,20 @@ public class Admin
|
|||||||
|
|
||||||
public boolean isValid()
|
public boolean isValid()
|
||||||
{
|
{
|
||||||
return uuid != null
|
return name != null
|
||||||
&& rank != null
|
&& rank != null
|
||||||
&& !ips.isEmpty()
|
&& !ips.isEmpty()
|
||||||
&& lastLogin != null;
|
&& lastLogin != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID getUuid()
|
|
||||||
{
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName()
|
public String getName()
|
||||||
{
|
{
|
||||||
return Bukkit.getOfflinePlayer(uuid).getName();
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isActive()
|
public boolean isActive()
|
||||||
@ -159,34 +162,6 @@ public class Admin
|
|||||||
{
|
{
|
||||||
plugin.btb.killTelnetSessions(getName());
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.lv.updateLogsRegistration(null, getName(), LogsRegistrationMode.DELETE);
|
plugin.lv.updateLogsRegistration(null, getName(), LogsRegistrationMode.DELETE);
|
||||||
|
@ -4,7 +4,11 @@ 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.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
@ -18,10 +22,10 @@ import org.bukkit.entity.Player;
|
|||||||
public class AdminList extends FreedomService
|
public class AdminList extends FreedomService
|
||||||
{
|
{
|
||||||
public static final List<String> vanished = new ArrayList<>();
|
public static final List<String> vanished = new ArrayList<>();
|
||||||
|
public final Map<String, List<String>> verifiedNoAdmin = Maps.newHashMap();
|
||||||
private final Set<Admin> allAdmins = Sets.newHashSet(); // Includes disabled admins
|
private final Set<Admin> allAdmins = Sets.newHashSet(); // Includes disabled admins
|
||||||
// Only active admins below
|
// Only active admins below
|
||||||
private final Set<Admin> activeAdmins = Sets.newHashSet();
|
private final Set<Admin> activeAdmins = Sets.newHashSet();
|
||||||
private final Map<UUID, Admin> uuidTable = Maps.newHashMap();
|
|
||||||
private final Map<String, Admin> nameTable = Maps.newHashMap();
|
private final Map<String, Admin> nameTable = Maps.newHashMap();
|
||||||
private final Map<String, Admin> ipTable = Maps.newHashMap();
|
private final Map<String, Admin> ipTable = Maps.newHashMap();
|
||||||
|
|
||||||
@ -48,18 +52,12 @@ public class AdminList extends FreedomService
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
ResultSet adminSet = plugin.sql.getAdminList();
|
ResultSet adminSet = plugin.sql.getAdminList();
|
||||||
while (adminSet.next())
|
|
||||||
{
|
{
|
||||||
try
|
while (adminSet.next())
|
||||||
{
|
{
|
||||||
Admin admin = new Admin(adminSet);
|
Admin admin = new Admin(adminSet);
|
||||||
allAdmins.add(admin);
|
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)
|
||||||
@ -68,7 +66,7 @@ public class AdminList extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateTables();
|
updateTables();
|
||||||
FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)");
|
FLog.info("Loaded " + allAdmins.size() + " admins (" + nameTable.size() + " active, " + ipTable.size() + " IPs)");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void messageAllAdmins(String message)
|
public void messageAllAdmins(String message)
|
||||||
@ -156,20 +154,40 @@ public class AdminList extends FreedomService
|
|||||||
|
|
||||||
public Admin getAdmin(Player player)
|
public Admin getAdmin(Player player)
|
||||||
{
|
{
|
||||||
final String ip = FUtil.getIp(player);
|
// Find admin
|
||||||
final Admin entry = getEntryByUuid(player.getUniqueId());
|
String ip = FUtil.getIp(player);
|
||||||
|
Admin admin = getEntryByName(player.getName());
|
||||||
|
|
||||||
if (entry != null && !entry.getIps().contains(ip))
|
// Admin by name
|
||||||
|
if (admin != null)
|
||||||
{
|
{
|
||||||
entry.addIp(ip);
|
// Check if we're in online mode,
|
||||||
|
// Or the players IP is in the admin entry
|
||||||
|
if (Bukkit.getOnlineMode() || admin.getIps().contains(ip))
|
||||||
|
{
|
||||||
|
if (!admin.getIps().contains(ip))
|
||||||
|
{
|
||||||
|
// Add the new IP if we have to
|
||||||
|
admin.addIp(ip);
|
||||||
|
save(admin);
|
||||||
|
updateTables();
|
||||||
|
}
|
||||||
|
return admin;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return entry;
|
// Admin by ip
|
||||||
}
|
admin = getEntryByIp(ip);
|
||||||
|
if (admin != null)
|
||||||
|
{
|
||||||
|
// Set the new username
|
||||||
|
String oldName = admin.getName();
|
||||||
|
admin.setName(player.getName());
|
||||||
|
plugin.sql.updateAdminName(oldName, admin.getName());
|
||||||
|
updateTables();
|
||||||
|
}
|
||||||
|
|
||||||
public Admin getEntryByUuid(UUID uuid)
|
return null;
|
||||||
{
|
|
||||||
return uuidTable.get(uuid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Admin getEntryByName(String name)
|
public Admin getEntryByName(String name)
|
||||||
@ -182,6 +200,25 @@ public class AdminList extends FreedomService
|
|||||||
return ipTable.get(ip);
|
return ipTable.get(ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Admin getEntryByIpFuzzy(String needleIp)
|
||||||
|
{
|
||||||
|
final Admin directAdmin = getEntryByIp(needleIp);
|
||||||
|
if (directAdmin != null)
|
||||||
|
{
|
||||||
|
return directAdmin;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String ip : ipTable.keySet())
|
||||||
|
{
|
||||||
|
if (FUtil.fuzzyIpMatch(needleIp, ip, 3))
|
||||||
|
{
|
||||||
|
return ipTable.get(ip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public void updateLastLogin(Player player)
|
public void updateLastLogin(Player player)
|
||||||
{
|
{
|
||||||
final Admin admin = getAdmin(player);
|
final Admin admin = getAdmin(player);
|
||||||
@ -191,9 +228,31 @@ public class AdminList extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
admin.setLastLogin(new Date());
|
admin.setLastLogin(new Date());
|
||||||
|
admin.setName(player.getName());
|
||||||
save(admin);
|
save(admin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isAdminImpostor(Player player)
|
||||||
|
{
|
||||||
|
return getEntryByName(player.getName()) != null && !isAdmin(player) && !isVerifiedAdmin(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isVerifiedAdmin(Player player)
|
||||||
|
{
|
||||||
|
return verifiedNoAdmin.containsKey(player.getName()) && verifiedNoAdmin.get(player.getName()).contains(FUtil.getIp(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIdentityMatched(Player player)
|
||||||
|
{
|
||||||
|
if (Bukkit.getOnlineMode())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Admin admin = getAdmin(player);
|
||||||
|
return admin != null && admin.getName().equalsIgnoreCase(player.getName());
|
||||||
|
}
|
||||||
|
|
||||||
public boolean addAdmin(Admin admin)
|
public boolean addAdmin(Admin admin)
|
||||||
{
|
{
|
||||||
if (!admin.isValid())
|
if (!admin.isValid())
|
||||||
@ -238,7 +297,6 @@ public class AdminList extends FreedomService
|
|||||||
public void updateTables()
|
public void updateTables()
|
||||||
{
|
{
|
||||||
activeAdmins.clear();
|
activeAdmins.clear();
|
||||||
uuidTable.clear();
|
|
||||||
nameTable.clear();
|
nameTable.clear();
|
||||||
ipTable.clear();
|
ipTable.clear();
|
||||||
|
|
||||||
@ -250,16 +308,13 @@ public class AdminList extends FreedomService
|
|||||||
}
|
}
|
||||||
|
|
||||||
activeAdmins.add(admin);
|
activeAdmins.add(admin);
|
||||||
uuidTable.put(admin.getUuid(), admin);
|
nameTable.put(admin.getName().toLowerCase(), admin);
|
||||||
if (admin.getName() != null)
|
|
||||||
{
|
|
||||||
nameTable.put(admin.getName().toLowerCase(), admin);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String ip : admin.getIps())
|
for (String ip : admin.getIps())
|
||||||
{
|
{
|
||||||
ipTable.put(ip, admin);
|
ipTable.put(ip, admin);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,10 +332,11 @@ public class AdminList extends FreedomService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid());
|
ResultSet currentSave = plugin.sql.getAdminByName(admin.getName());
|
||||||
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());
|
||||||
}
|
}
|
||||||
@ -345,4 +401,9 @@ public class AdminList extends FreedomService
|
|||||||
{
|
{
|
||||||
return ipTable;
|
return ipTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, List<String>> getVerifiedNoAdmin()
|
||||||
|
{
|
||||||
|
return verifiedNoAdmin;
|
||||||
|
}
|
||||||
}
|
}
|
@ -43,7 +43,6 @@ public class IndefiniteBan implements IConfig
|
|||||||
@Override
|
@Override
|
||||||
public void saveTo(ConfigurationSection cs)
|
public void saveTo(ConfigurationSection cs)
|
||||||
{
|
{
|
||||||
// The indefinite ban list is only intended to be modified manually. It is not intended to save.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -71,7 +71,7 @@ public class BlockBlocker extends FreedomService
|
|||||||
}
|
}
|
||||||
case STRUCTURE_BLOCK:
|
case STRUCTURE_BLOCK:
|
||||||
{
|
{
|
||||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
if (!ConfigEntry.ALLOW_STRUCTURE_BLOCKS.getBoolean())
|
||||||
{
|
{
|
||||||
player.sendMessage(ChatColor.GRAY + "Structure blocks are disabled.");
|
player.sendMessage(ChatColor.GRAY + "Structure blocks are disabled.");
|
||||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
@ -81,7 +81,7 @@ public class BlockBlocker extends FreedomService
|
|||||||
}
|
}
|
||||||
case JIGSAW:
|
case JIGSAW:
|
||||||
{
|
{
|
||||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
if (!ConfigEntry.ALLOW_JIGSAWS.getBoolean())
|
||||||
{
|
{
|
||||||
player.sendMessage(ChatColor.GRAY + "Jigsaws are disabled.");
|
player.sendMessage(ChatColor.GRAY + "Jigsaws are disabled.");
|
||||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
||||||
@ -89,16 +89,6 @@ public class BlockBlocker extends FreedomService
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case REPEATING_COMMAND_BLOCK:
|
|
||||||
case CHAIN_COMMAND_BLOCK:
|
|
||||||
case COMMAND_BLOCK:
|
|
||||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
|
||||||
{
|
|
||||||
player.sendMessage(ChatColor.GRAY + "Command blocks are disabled.");
|
|
||||||
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GRINDSTONE:
|
case GRINDSTONE:
|
||||||
{
|
{
|
||||||
if (!ConfigEntry.ALLOW_GRINDSTONES.getBoolean())
|
if (!ConfigEntry.ALLOW_GRINDSTONES.getBoolean())
|
||||||
@ -181,11 +171,6 @@ public class BlockBlocker extends FreedomService
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Groups.BANNERS.contains(event.getBlockPlaced().getType()))
|
if (Groups.BANNERS.contains(event.getBlockPlaced().getType()))
|
||||||
|
@ -4,9 +4,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
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 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;
|
||||||
@ -21,7 +18,15 @@ import org.bukkit.entity.FallingBlock;
|
|||||||
import org.bukkit.entity.Tameable;
|
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.BlockBurnEvent;
|
||||||
|
import org.bukkit.event.block.BlockDispenseEvent;
|
||||||
|
import org.bukkit.event.block.BlockFromToEvent;
|
||||||
|
import org.bukkit.event.block.BlockGrowEvent;
|
||||||
|
import org.bukkit.event.block.BlockIgniteEvent;
|
||||||
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
|
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||||
|
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||||
|
import org.bukkit.event.block.LeavesDecayEvent;
|
||||||
import org.bukkit.event.entity.EntityCombustEvent;
|
import org.bukkit.event.entity.EntityCombustEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.event.entity.EntityDeathEvent;
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
@ -110,28 +115,6 @@ public class EventBlocker extends FreedomService
|
|||||||
event.setRadius(ConfigEntry.EXPLOSIVE_RADIUS.getDouble().floatValue());
|
event.setRadius(ConfigEntry.EXPLOSIVE_RADIUS.getDouble().floatValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
|
||||||
public void onBlockExplode(BlockExplodeEvent event)
|
|
||||||
{
|
|
||||||
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.setYield(ConfigEntry.EXPLOSIVE_RADIUS.getDouble().floatValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
|
||||||
public void onMasterBlockFire(MasterBlockFireEvent event)
|
|
||||||
{
|
|
||||||
if (!ConfigEntry.ALLOW_MASTERBLOCKS.getBoolean())
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
event.getAt().getBlock().setType(Material.CAKE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
public void onEntityCombust(EntityCombustEvent event)
|
public void onEntityCombust(EntityCombustEvent event)
|
||||||
{
|
{
|
||||||
@ -165,7 +148,7 @@ public class EventBlocker extends FreedomService
|
|||||||
Entity entity = event.getEntity();
|
Entity entity = event.getEntity();
|
||||||
if (entity instanceof Tameable)
|
if (entity instanceof Tameable)
|
||||||
{
|
{
|
||||||
if (((Tameable) entity).isTamed())
|
if (((Tameable)entity).isTamed())
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
@ -282,10 +265,4 @@ public class EventBlocker extends FreedomService
|
|||||||
FUtil.fixCommandVoid(event.getEntity());
|
FUtil.fixCommandVoid(event.getEntity());
|
||||||
event.setDeathMessage(event.getDeathMessage());
|
event.setDeathMessage(event.getDeathMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onSignInteract(PlayerSignCommandPreprocessEvent event)
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,6 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|||||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.entity.EntityType;
|
|
||||||
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;
|
||||||
@ -38,9 +36,10 @@ public class InteractBlocker extends FreedomService
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
case LEFT_CLICK_AIR:
|
||||||
|
case LEFT_CLICK_BLOCK:
|
||||||
{
|
{
|
||||||
// Do nothing
|
//
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,38 +68,21 @@ public class InteractBlocker extends FreedomService
|
|||||||
private void handleRightClick(PlayerInteractEvent event)
|
private void handleRightClick(PlayerInteractEvent event)
|
||||||
{
|
{
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
final Block clickedBlock = event.getClickedBlock();
|
|
||||||
|
|
||||||
if (clickedBlock != null && clickedBlock.getType() == Material.RESPAWN_ANCHOR && !ConfigEntry.ALLOW_RESPAWN_ANCHORS.getBoolean())
|
if (event.getClickedBlock() != null)
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
if (event.getClickedBlock().getType().equals(Material.STRUCTURE_BLOCK) || event.getClickedBlock().getType().equals(Material.JIGSAW) || event.getClickedBlock().getType().equals(Material.RESPAWN_ANCHOR))
|
||||||
return;
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
event.getPlayer().closeInventory();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Groups.SPAWN_EGGS.contains(event.getMaterial()))
|
if (Groups.SPAWN_EGGS.contains(event.getMaterial()))
|
||||||
{
|
{
|
||||||
|
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||||
|
player.sendMessage(ChatColor.GRAY + "Spawn eggs are currently disabled.");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
EntityType eggType = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Material mat = event.getMaterial();
|
|
||||||
if (mat == Material.MOOSHROOM_SPAWN_EGG)
|
|
||||||
{
|
|
||||||
eggType = EntityType.MUSHROOM_COW;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
eggType = EntityType.valueOf(mat.name().substring(0, mat.name().length() - 10));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (IllegalArgumentException ignored)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
if (eggType != null && clickedBlock != null)
|
|
||||||
{
|
|
||||||
clickedBlock.getWorld().spawnEntity(clickedBlock.getLocation().add(event.getBlockFace().getDirection()).add(0.5, 0.5, 0.5), eggType);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,11 +158,6 @@ public class InteractBlocker extends FreedomService
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.blocking;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import net.minecraft.server.v1_16_R3.NBTTagCompound;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Tag;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
//codebeat:disable[LOC,ABC]
|
||||||
|
|
||||||
|
public class SignBlocker extends FreedomService
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onPlayerPlaceBlock(BlockPlaceEvent event)
|
||||||
|
{
|
||||||
|
|
||||||
|
final Player player = event.getPlayer();
|
||||||
|
if (Tag.SIGNS.getValues().contains(event.getBlock().getType()))
|
||||||
|
{
|
||||||
|
ItemStack sign = event.getItemInHand();
|
||||||
|
net.minecraft.server.v1_16_R3.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign);
|
||||||
|
NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound();
|
||||||
|
assert compound != null;
|
||||||
|
NBTTagCompound bet = compound.getCompound("BlockEntityTag");
|
||||||
|
String line1 = bet.getString("Text1");
|
||||||
|
String line2 = bet.getString("Text2");
|
||||||
|
String line3 = bet.getString("Text3");
|
||||||
|
String line4 = bet.getString("Text4");
|
||||||
|
if (line1.contains("run_command") || line2.contains("run_command") || line3.contains("run_command") || line4.contains("run_command"))
|
||||||
|
{
|
||||||
|
player.sendMessage(ChatColor.GRAY + "You are not allowed to place command signs.");
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void onPlayerInteractSign(PlayerInteractEvent event)
|
||||||
|
{
|
||||||
|
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getClickedBlock() != null && Tag.SIGNS.getValues().contains(event.getClickedBlock().getType()))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,10 +2,10 @@ package me.totalfreedom.totalfreedommod.blocking.command;
|
|||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
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 org.spigotmc.SpigotConfig;
|
||||||
|
|
||||||
public class CommandBlockerEntry
|
public class CommandBlockerEntry
|
||||||
{
|
{
|
||||||
@ -45,7 +45,7 @@ public class CommandBlockerEntry
|
|||||||
}
|
}
|
||||||
if (action == CommandBlockerAction.BLOCK_UNKNOWN)
|
if (action == CommandBlockerAction.BLOCK_UNKNOWN)
|
||||||
{
|
{
|
||||||
sender.sendMessage(Bukkit.spigot().getSpigotConfig().getString("messages.unknown-command"));
|
sender.sendMessage(SpigotConfig.unknownCommandMessage);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FUtil.playerMsg(sender, FUtil.colorize(message));
|
FUtil.playerMsg(sender, FUtil.colorize(message));
|
||||||
|
@ -42,7 +42,7 @@ public class BukkitTelnetBridge extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Admin admin = plugin.al.getEntryByIp(ip);
|
final Admin admin = plugin.al.getEntryByIpFuzzy(ip);
|
||||||
|
|
||||||
if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant())
|
if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant())
|
||||||
{
|
{
|
||||||
|
@ -192,6 +192,7 @@ public class CoreProtectBridge extends FreedomService
|
|||||||
return (megabytes / 1024);
|
return (megabytes / 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wipes DB for the specified world
|
||||||
public void clearDatabase(World world)
|
public void clearDatabase(World world)
|
||||||
{
|
{
|
||||||
clearDatabase(world, false);
|
clearDatabase(world, false);
|
||||||
@ -259,6 +260,12 @@ public class CoreProtectBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
FLog.warning("Failed to delete the CoreProtect data for the " + world.getName());
|
FLog.warning("Failed to delete the CoreProtect data for the " + world.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This exits for flatlands wipes
|
||||||
|
if (shutdown)
|
||||||
|
{
|
||||||
|
server.shutdown();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
@ -269,25 +276,8 @@ public class CoreProtectBridge extends FreedomService
|
|||||||
Block block = event.getClickedBlock();
|
Block block = event.getClickedBlock();
|
||||||
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
||||||
|
|
||||||
// TODO: Rewrite this
|
|
||||||
if (data.hasInspection())
|
if (data.hasInspection())
|
||||||
{
|
{
|
||||||
int cooldownTime = 3;
|
|
||||||
|
|
||||||
// Cooldown check
|
|
||||||
if ((event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK)
|
|
||||||
&& cooldown.containsKey(player.getName()))
|
|
||||||
{
|
|
||||||
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
|
|
||||||
if (secondsLeft > 0L)
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual lookup time
|
|
||||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK)
|
if (event.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||||
{
|
{
|
||||||
if (block != null)
|
if (block != null)
|
||||||
@ -295,6 +285,19 @@ public class CoreProtectBridge extends FreedomService
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
List<String[]> lookup = coreProtect.blockLookup(block, -1);
|
List<String[]> lookup = coreProtect.blockLookup(block, -1);
|
||||||
|
|
||||||
|
int cooldownTime = 3;
|
||||||
|
|
||||||
|
if (cooldown.containsKey(player.getName()))
|
||||||
|
{
|
||||||
|
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
|
||||||
|
if (secondsLeft > 0L)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!plugin.al.isAdmin(player))
|
if (!plugin.al.isAdmin(player))
|
||||||
{
|
{
|
||||||
cooldown.put(player.getName(), System.currentTimeMillis());
|
cooldown.put(player.getName(), System.currentTimeMillis());
|
||||||
@ -361,75 +364,91 @@ public class CoreProtectBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
if (block != null)
|
if (block != null)
|
||||||
{
|
{
|
||||||
BlockState blockState = block.getRelative(event.getBlockFace()).getState();
|
if (data.hasInspection())
|
||||||
Block placedBlock = blockState.getBlock();
|
|
||||||
event.setCancelled(true);
|
|
||||||
List<String[]> lookup = coreProtect.blockLookup(placedBlock, -1);
|
|
||||||
|
|
||||||
if (lookup.isEmpty())
|
|
||||||
{
|
{
|
||||||
lookup = coreProtect.blockLookup(block, -1);
|
BlockState blockState = block.getRelative(event.getBlockFace()).getState();
|
||||||
}
|
Block placedBlock = blockState.getBlock();
|
||||||
|
event.setCancelled(true);
|
||||||
|
List<String[]> lookup = coreProtect.blockLookup(placedBlock, -1);
|
||||||
|
|
||||||
if (!plugin.al.isAdmin(player))
|
|
||||||
{
|
|
||||||
cooldown.put(player.getName(), System.currentTimeMillis());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lookup != null)
|
|
||||||
{
|
|
||||||
if (lookup.isEmpty())
|
if (lookup.isEmpty())
|
||||||
{
|
{
|
||||||
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
|
lookup = coreProtect.blockLookup(block, -1);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HISTORY_MAP.remove(event.getPlayer());
|
int cooldownTime = 3;
|
||||||
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
|
|
||||||
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
|
|
||||||
|
|
||||||
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
|
if (cooldown.containsKey(player.getName()))
|
||||||
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
|
|
||||||
|
|
||||||
for (String[] value : lookup)
|
|
||||||
{
|
{
|
||||||
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
|
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
|
||||||
BlockData bl = result.getBlockData();
|
if (secondsLeft > 0L)
|
||||||
|
|
||||||
String s;
|
|
||||||
String st = "";
|
|
||||||
|
|
||||||
if (result.getActionString().equals("Placement"))
|
|
||||||
{
|
{
|
||||||
s = " placed ";
|
event.setCancelled(true);
|
||||||
|
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else if (result.getActionString().equals("Removal"))
|
|
||||||
{
|
|
||||||
s = " broke ";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s = " interacted with ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.isRolledBack())
|
|
||||||
{
|
|
||||||
st += "§m";
|
|
||||||
}
|
|
||||||
|
|
||||||
int time = (int)(System.currentTimeMillis() / 1000L);
|
|
||||||
|
|
||||||
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
|
|
||||||
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> page = paged.getPage(1);
|
if (!plugin.al.isAdmin(player))
|
||||||
for (String entries : page)
|
|
||||||
{
|
{
|
||||||
player.sendMessage(entries);
|
cooldown.put(player.getName(), System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
|
if (lookup != null)
|
||||||
|
{
|
||||||
|
if (lookup.isEmpty())
|
||||||
|
{
|
||||||
|
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HISTORY_MAP.remove(event.getPlayer());
|
||||||
|
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
|
||||||
|
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
|
||||||
|
|
||||||
|
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
|
||||||
|
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
|
||||||
|
|
||||||
|
for (String[] value : lookup)
|
||||||
|
{
|
||||||
|
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
|
||||||
|
BlockData bl = result.getBlockData();
|
||||||
|
|
||||||
|
String s;
|
||||||
|
String st = "";
|
||||||
|
|
||||||
|
if (result.getActionString().equals("Placement"))
|
||||||
|
{
|
||||||
|
s = " placed ";
|
||||||
|
}
|
||||||
|
else if (result.getActionString().equals("Removal"))
|
||||||
|
{
|
||||||
|
s = " broke ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s = " interacted with ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.isRolledBack())
|
||||||
|
{
|
||||||
|
st += "§m";
|
||||||
|
}
|
||||||
|
|
||||||
|
int time = (int)(System.currentTimeMillis() / 1000L);
|
||||||
|
|
||||||
|
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
|
||||||
|
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> page = paged.getPage(1);
|
||||||
|
for (String entries : page)
|
||||||
|
{
|
||||||
|
player.sendMessage(entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,8 @@ public class EssentialsBridge extends FreedomService
|
|||||||
User user = getEssentialsUser(username);
|
User user = getEssentialsUser(username);
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
return user.getLastOnlineActivity();
|
Long l = FUtil.getField(user, "lastActivity");
|
||||||
|
return (l != null) ? l : 0L;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.bridge;
|
||||||
|
|
||||||
|
import me.totalfreedom.tfguilds.Common;
|
||||||
|
import me.totalfreedom.tfguilds.TFGuilds;
|
||||||
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
public class TFGuildsBridge extends FreedomService
|
||||||
|
{
|
||||||
|
public boolean enabled = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTFGuildsEnabled()
|
||||||
|
{
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final Plugin tfGuilds = server.getPluginManager().getPlugin("TFGuilds");
|
||||||
|
if (tfGuilds != null && tfGuilds.isEnabled())
|
||||||
|
{
|
||||||
|
if (tfGuilds instanceof TFGuilds)
|
||||||
|
{
|
||||||
|
enabled = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (NoClassDefFoundError ex)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean inGuildChat(Player player)
|
||||||
|
{
|
||||||
|
if (!isTFGuildsEnabled())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return Common.GUILD_CHAT.contains(player);
|
||||||
|
}
|
||||||
|
}
|
@ -48,6 +48,52 @@ public class WorldEditBridge extends FreedomService
|
|||||||
return worldeditPlugin;
|
return worldeditPlugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void undo(Player player, int count)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LocalSession session = getPlayerSession(player);
|
||||||
|
if (session != null)
|
||||||
|
{
|
||||||
|
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||||
|
if (bukkitPlayer != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
session.undo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void redo(Player player, int count)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LocalSession session = getPlayerSession(player);
|
||||||
|
if (session != null)
|
||||||
|
{
|
||||||
|
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||||
|
if (bukkitPlayer != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
session.redo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void setLimit(Player player, int limit)
|
public void setLimit(Player player, int limit)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -107,4 +153,23 @@ public class WorldEditBridge extends FreedomService
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BukkitPlayer getBukkitPlayer(Player player)
|
||||||
|
{
|
||||||
|
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||||
|
if (wep == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return wep.wrapPlayer(player);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FLog.severe(ex);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
package me.totalfreedom.totalfreedommod.bridge;
|
package me.totalfreedom.totalfreedommod.bridge;
|
||||||
|
|
||||||
import com.sk89q.worldguard.LocalPlayer;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldguard.WorldGuard;
|
import com.sk89q.worldguard.WorldGuard;
|
||||||
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
|
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||||
|
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||||
import com.sk89q.worldguard.protection.regions.RegionContainer;
|
import com.sk89q.worldguard.protection.regions.RegionContainer;
|
||||||
|
import java.util.Map;
|
||||||
import com.sk89q.worldguard.protection.regions.RegionQuery;
|
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.World;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
public class WorldGuardBridge extends FreedomService
|
public class WorldGuardBridge extends FreedomService
|
||||||
@ -15,6 +15,7 @@ public class WorldGuardBridge extends FreedomService
|
|||||||
@Override
|
@Override
|
||||||
public void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
|
plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -22,21 +23,26 @@ public class WorldGuardBridge extends FreedomService
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canEditCurrentWorld(Player player)
|
public RegionManager getRegionManager(World world)
|
||||||
{
|
{
|
||||||
// If WorldGuard integration is enabled, do a check with it.
|
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
|
||||||
if (isEnabled())
|
return container.get(BukkitAdapter.adapt(world));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int wipeRegions(World world)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
RegionManager regionManager = getRegionManager(world);
|
||||||
|
if (regionManager != null)
|
||||||
{
|
{
|
||||||
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
|
Map<String, ProtectedRegion> regions = regionManager.getRegions();
|
||||||
|
for (ProtectedRegion region : regions.values())
|
||||||
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
|
{
|
||||||
RegionQuery query = container.createQuery();
|
regionManager.removeRegion(region.getId());
|
||||||
|
count++;
|
||||||
return query.testBuild(localPlayer.getLocation(), localPlayer);
|
}
|
||||||
}
|
}
|
||||||
|
return count;
|
||||||
// If the plugin isn't present, return true.
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEnabled()
|
public boolean isEnabled()
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import com.earth2me.essentials.User;
|
|
||||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||||
@ -60,39 +60,28 @@ public class Command_ban extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
final String username;
|
final String username;
|
||||||
final String ip;
|
final List<String> ips = new ArrayList<>();
|
||||||
|
|
||||||
final Player player = getPlayer(args[0]);
|
final Player player = getPlayer(args[0]);
|
||||||
if (player == null)
|
if (player == null)
|
||||||
{
|
{
|
||||||
// Gets the IP using Essentials data if available
|
final PlayerData entry = plugin.pl.getData(args[0]);
|
||||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
|
||||||
|
if (entry == null)
|
||||||
{
|
{
|
||||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||||
//
|
return true;
|
||||||
username = essUser.getName();
|
|
||||||
ip = essUser.getLastLoginAddress();
|
|
||||||
}
|
|
||||||
// Last resort - Getting the first result from the username itself
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PlayerData entry = plugin.pl.getData(args[0]);
|
|
||||||
if (entry == null)
|
|
||||||
{
|
|
||||||
msg(PLAYER_NOT_FOUND);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
username = entry.getName();
|
|
||||||
ip = entry.getIps().get(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
username = entry.getName();
|
||||||
|
ips.addAll(entry.getIps());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
final PlayerData entry = plugin.pl.getData(player);
|
||||||
username = player.getName();
|
username = player.getName();
|
||||||
ip = FUtil.getIp(player);
|
//ips.addAll(entry.getIps());/
|
||||||
|
ips.add(FUtil.getIp(player));
|
||||||
|
|
||||||
// Deop
|
// Deop
|
||||||
player.setOp(false);
|
player.setOp(false);
|
||||||
@ -137,6 +126,7 @@ public class Command_ban extends FreedomCommand
|
|||||||
|
|
||||||
// Ban player
|
// Ban player
|
||||||
Ban ban;
|
Ban ban;
|
||||||
|
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
ban = Ban.forPlayer(player, sender, null, reason);
|
ban = Ban.forPlayer(player, sender, null, reason);
|
||||||
@ -145,8 +135,12 @@ public class Command_ban extends FreedomCommand
|
|||||||
{
|
{
|
||||||
ban = Ban.forPlayerName(username, sender, null, reason);
|
ban = Ban.forPlayerName(username, sender, null, reason);
|
||||||
}
|
}
|
||||||
ban.addIp(ip);
|
|
||||||
|
|
||||||
|
for (String ip : ips)
|
||||||
|
{
|
||||||
|
ban.addIp(ip);
|
||||||
|
ban.addIp(FUtil.getFuzzyIp(ip));
|
||||||
|
}
|
||||||
plugin.bm.addBan(ban);
|
plugin.bm.addBan(ban);
|
||||||
|
|
||||||
|
|
||||||
@ -160,7 +154,7 @@ 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);
|
msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", "));
|
||||||
FUtil.adminAction(sender.getName(), bcast.toString(), true);
|
FUtil.adminAction(sender.getName(), bcast.toString(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,7 +172,7 @@ public class Command_ban extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log ban
|
// Log ban
|
||||||
plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.BAN, reason));
|
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, reason));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
|
||||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
@ -77,11 +75,9 @@ public class Command_blockcmd extends FreedomCommand
|
|||||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||||
if (!playerdata.allCommandsBlocked())
|
if (!playerdata.allCommandsBlocked())
|
||||||
{
|
{
|
||||||
FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
|
|
||||||
playerdata.setCommandsBlocked(true);
|
playerdata.setCommandsBlocked(true);
|
||||||
|
FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
|
||||||
msg("Blocked commands for " + player.getName() + ".");
|
msg("Blocked commands for " + player.getName() + ".");
|
||||||
|
|
||||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.BLOCKCMD, null));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
|
||||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.apache.commons.lang.ArrayUtils;
|
import org.apache.commons.lang.ArrayUtils;
|
||||||
@ -130,8 +128,6 @@ public class Command_blockedit extends FreedomCommand
|
|||||||
|
|
||||||
msg(player2, "Your block modification abilities have been blocked.", ChatColor.RED);
|
msg(player2, "Your block modification abilities have been blocked.", ChatColor.RED);
|
||||||
msg("Blocked all block modification abilities for " + player2.getName());
|
msg("Blocked all block modification abilities for " + player2.getName());
|
||||||
|
|
||||||
plugin.pul.logPunishment(new Punishment(player2.getName(), FUtil.getIp(player2), sender.getName(), PunishmentType.BLOCKEDIT, null));
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
|
||||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
@ -127,7 +125,6 @@ public class Command_blockpvp extends FreedomCommand
|
|||||||
{
|
{
|
||||||
Command_smite.smite(sender, p, reason);
|
Command_smite.smite(sender, p, reason);
|
||||||
}
|
}
|
||||||
plugin.pul.logPunishment(new Punishment(p.getName(), FUtil.getIp(p), sender.getName(), PunishmentType.BLOCKPVP, null));
|
|
||||||
|
|
||||||
msg(p, "Your PVP has been disabled.", ChatColor.RED);
|
msg(p, "Your PVP has been disabled.", ChatColor.RED);
|
||||||
msg("Disabled PVP for " + p.getName());
|
msg("Disabled PVP for " + p.getName());
|
||||||
|
@ -5,8 +5,6 @@ import java.util.Arrays;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
|
||||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
@ -77,43 +75,17 @@ public class Command_cage extends FreedomCommand
|
|||||||
}
|
}
|
||||||
case "block":
|
case "block":
|
||||||
{
|
{
|
||||||
if (args.length >= 3)
|
if (Material.matchMaterial(args[2]) != null)
|
||||||
{
|
{
|
||||||
// Checks the validity of the Material and checks if it's a block.
|
outerMaterial = Material.matchMaterial(args[2]);
|
||||||
// This is incredibly inefficient, as Spigot's isBlock() method in Material is an actual
|
break;
|
||||||
// nightmare of switch-cases.
|
|
||||||
if (Material.matchMaterial(args[2]) != null && Material.matchMaterial(args[2]).isBlock())
|
|
||||||
{
|
|
||||||
outerMaterial = Material.matchMaterial(args[2]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msg("Invalid block!", ChatColor.RED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
msg("Invalid block!", ChatColor.RED);
|
||||||
{
|
break;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outerMaterial == Material.PLAYER_HEAD)
|
|
||||||
{
|
|
||||||
FUtil.adminAction(sender.getName(), "Caging " + player.getName() + " in " + skullName, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FUtil.adminAction(sender.getName(), "Caging " + player.getName(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Location location = player.getLocation().clone().add(0.0, 1.0, 0.0);
|
Location location = player.getLocation().clone().add(0.0, 1.0, 0.0);
|
||||||
|
|
||||||
if (skullName != null)
|
if (skullName != null)
|
||||||
@ -124,9 +96,17 @@ public class Command_cage extends FreedomCommand
|
|||||||
{
|
{
|
||||||
fPlayer.getCageData().cage(location, outerMaterial, innerMaterial);
|
fPlayer.getCageData().cage(location, outerMaterial, innerMaterial);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setGameMode(GameMode.SURVIVAL);
|
player.setGameMode(GameMode.SURVIVAL);
|
||||||
|
|
||||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.CAGE, null));
|
if (outerMaterial == Material.PLAYER_HEAD)
|
||||||
|
{
|
||||||
|
FUtil.adminAction(sender.getName(), "Caging " + player.getName() + " in " + skullName, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FUtil.adminAction(sender.getName(), "Caging " + player.getName(), true);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import org.bukkit.entity.Player;
|
|||||||
|
|
||||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.ADMIN, 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_clearchat extends FreedomCommand
|
||||||
{
|
{
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -9,11 +9,8 @@ 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 java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.OP, 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 have or another player has", usage = "/<command> [playername]")
|
||||||
public class Command_coins extends FreedomCommand
|
public class Command_coins extends FreedomCommand
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
@ -24,122 +21,34 @@ public class Command_coins extends FreedomCommand
|
|||||||
msg("The shop is currently disabled!", ChatColor.RED);
|
msg("The shop is currently disabled!", ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Player p;
|
||||||
final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " ");
|
final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " ");
|
||||||
|
if (args.length > 0)
|
||||||
switch (args.length)
|
|
||||||
{
|
{
|
||||||
// Mode for seeing how many coins the sender has (doesn't work from console)
|
if (getPlayer(args[0]) != null)
|
||||||
case 0:
|
|
||||||
{
|
{
|
||||||
if (senderIsConsole)
|
p = getPlayer(args[0]);
|
||||||
{
|
}
|
||||||
msg("When used from the console, you must define a target player.");
|
else
|
||||||
}
|
{
|
||||||
else
|
msg(PLAYER_NOT_FOUND);
|
||||||
{
|
|
||||||
PlayerData playerData = getData(playerSender);
|
|
||||||
msg(prefix + ChatColor.GREEN + "You have " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN
|
|
||||||
+ " coins.");
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Mode for seeing how many coins a player has.
|
else
|
||||||
case 1:
|
{
|
||||||
|
if (senderIsConsole)
|
||||||
{
|
{
|
||||||
Player target = getPlayer(args[0]);
|
msg(prefix + ChatColor.RED + "You are not a player, use /coins <playername>");
|
||||||
|
|
||||||
if (target == null)
|
|
||||||
{
|
|
||||||
msg(PLAYER_NOT_FOUND);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PlayerData playerData = getData(target);
|
|
||||||
msg(prefix + ChatColor.GREEN + target.getName() + " has " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins.");
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// Mode for paying another player coins
|
|
||||||
case 3:
|
|
||||||
{
|
{
|
||||||
if (args[0].equalsIgnoreCase("pay"))
|
p = playerSender;
|
||||||
{
|
|
||||||
checkPlayer();
|
|
||||||
|
|
||||||
final Player target = getPlayer(args[1]);
|
|
||||||
final PlayerData senderData = getData(playerSender);
|
|
||||||
|
|
||||||
int coinsToTransfer;
|
|
||||||
|
|
||||||
// Processes args[2]
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Prevents players from trying to be cheeky with negative numbers.
|
|
||||||
coinsToTransfer = Math.max(Math.abs(Integer.parseInt(args[2])), 1);
|
|
||||||
}
|
|
||||||
catch (NumberFormatException ex)
|
|
||||||
{
|
|
||||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevents players from performing transactions they can't afford to do.
|
|
||||||
if (senderData.getCoins() < coinsToTransfer)
|
|
||||||
{
|
|
||||||
msg("You don't have enough coins to perform this transaction.", ChatColor.RED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target == null)
|
|
||||||
{
|
|
||||||
msg(PLAYER_NOT_FOUND);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PlayerData playerData = getData(target);
|
|
||||||
playerData.setCoins(playerData.getCoins() + coinsToTransfer);
|
|
||||||
senderData.setCoins(senderData.getCoins() - coinsToTransfer);
|
|
||||||
|
|
||||||
msg(target, sender.getName()
|
|
||||||
+ ChatColor.GREEN + " has given you "
|
|
||||||
+ ChatColor.GOLD + coinsToTransfer
|
|
||||||
+ ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "") + "!", ChatColor.GOLD);
|
|
||||||
|
|
||||||
msg("You have given "
|
|
||||||
+ ChatColor.GOLD + coinsToTransfer
|
|
||||||
+ ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "")
|
|
||||||
+ " to " + ChatColor.GOLD + target.getName() + ChatColor.GREEN + ".", ChatColor.GREEN);
|
|
||||||
|
|
||||||
plugin.pl.save(playerData);
|
|
||||||
plugin.pl.save(senderData);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
PlayerData playerData = plugin.pl.getData(p);
|
||||||
|
msg(prefix + ChatColor.GREEN + (args.length > 0 ? p.getName() + " has " : "You have ") + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins.");
|
||||||
@Override
|
return true;
|
||||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
|
||||||
{
|
|
||||||
if (args.length == 1)
|
|
||||||
{
|
|
||||||
List<String> options = new ArrayList<>(FUtil.getPlayerList());
|
|
||||||
|
|
||||||
options.add("pay");
|
|
||||||
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FUtil.getPlayerList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
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.config.ConfigEntry;
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
@ -42,7 +43,7 @@ public class Command_doom extends FreedomCommand
|
|||||||
FUtil.adminAction(sender.getName(), "Casting oblivion over " + player.getName(), true);
|
FUtil.adminAction(sender.getName(), "Casting oblivion over " + player.getName(), true);
|
||||||
FUtil.bcastMsg(player.getName() + " will be completely obliviated!", ChatColor.RED);
|
FUtil.bcastMsg(player.getName() + " will be completely obliviated!", ChatColor.RED);
|
||||||
|
|
||||||
final String ip = FUtil.getIp(player);
|
final String ip = Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim();
|
||||||
|
|
||||||
// Remove from admin
|
// Remove from admin
|
||||||
Admin admin = getAdmin(player);
|
Admin admin = getAdmin(player);
|
||||||
@ -75,7 +76,10 @@ public class Command_doom extends FreedomCommand
|
|||||||
// Ban player
|
// Ban player
|
||||||
Ban ban = Ban.forPlayer(player, sender);
|
Ban ban = Ban.forPlayer(player, sender);
|
||||||
ban.setReason((reason == null ? "FUCKOFF" : reason));
|
ban.setReason((reason == null ? "FUCKOFF" : reason));
|
||||||
ban.addIp(ip);
|
for (String playerIp : plugin.pl.getData(player).getIps())
|
||||||
|
{
|
||||||
|
ban.addIp(playerIp);
|
||||||
|
}
|
||||||
plugin.bm.addBan(ban);
|
plugin.bm.addBan(ban);
|
||||||
|
|
||||||
// Set gamemode to survival
|
// Set gamemode to survival
|
||||||
|
@ -1,50 +1,40 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
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.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||||
@CommandParameters(description = "Eject any entities that are riding you.", usage = "/<command>")
|
@CommandParameters(description = "Eject players that are riding you.", usage = "/<command>")
|
||||||
public class Command_eject extends FreedomCommand
|
public class Command_eject extends FreedomCommand
|
||||||
{
|
{
|
||||||
/* Player.getShoulderEntityLeft() and Player.getShoulderEntityRight() are deprecated, however unless
|
|
||||||
Player.getPassengers() also includes shoulders (which isn't likely, given the official documentation doesn't
|
|
||||||
state an alternative method to use instead), these methods will continue to be used here. */
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@Override
|
@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)
|
||||||
{
|
{
|
||||||
// Uses the size of the return value of Player.getPassengers() as the starting number of entities ejected
|
|
||||||
int count = playerSender.getPassengers().size();
|
|
||||||
|
|
||||||
// Removes any entities from the sender's shoulders
|
List<String> names = new ArrayList<>();
|
||||||
if (playerSender.getShoulderEntityLeft() != null)
|
|
||||||
|
for (Entity entity : playerSender.getPassengers())
|
||||||
{
|
{
|
||||||
playerSender.setShoulderEntityLeft(null);
|
names.add(entity.getName());
|
||||||
count++;
|
|
||||||
}
|
|
||||||
if (playerSender.getShoulderEntityRight() != null)
|
|
||||||
{
|
|
||||||
playerSender.setShoulderEntityLeft(null);
|
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes anything riding the sender
|
if (names.isEmpty())
|
||||||
playerSender.eject();
|
|
||||||
|
|
||||||
if (count != 0)
|
|
||||||
{
|
|
||||||
msg(count + " entit" + (count == 1 ? "y was" : "ies were") + " ejected.", ChatColor.GREEN);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
msg("Nothing was ejected.", ChatColor.GREEN);
|
msg("Nothing was ejected.", ChatColor.GREEN);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msg("Ejecting " + StringUtils.join(names, ", ") + ".", ChatColor.GREEN);
|
||||||
|
playerSender.eject();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,12 +64,6 @@ public class Command_entitywipe extends FreedomCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == EntityType.PLAYER)
|
|
||||||
{
|
|
||||||
msg("Player entities cannot be purged.", ChatColor.RED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!getAllEntities().contains(type))
|
if (!getAllEntities().contains(type))
|
||||||
{
|
{
|
||||||
msg(FUtil.formatName(type.name()) + " is an entity, however: it is a mob.", ChatColor.RED);
|
msg(FUtil.formatName(type.name()) + " is an entity, however: it is a mob.", ChatColor.RED);
|
||||||
|
@ -23,12 +23,12 @@ public class Command_freeze extends FreedomCommand
|
|||||||
|
|
||||||
if (!gFreeze)
|
if (!gFreeze)
|
||||||
{
|
{
|
||||||
FUtil.adminAction(sender.getName(), "Unfreezing all players", false);
|
FUtil.adminAction(sender.getName(), "Disabling global player freeze", false);
|
||||||
msg("Players are now free to move.");
|
msg("Players are now free to move.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Freezing all players", false);
|
FUtil.adminAction(sender.getName(), "Enabling global player freeze", false);
|
||||||
for (Player player : server.getOnlinePlayers())
|
for (Player player : server.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
if (!isAdmin(player))
|
if (!isAdmin(player))
|
||||||
|
@ -18,7 +18,7 @@ public class Command_linkdiscord extends FreedomCommand
|
|||||||
{
|
{
|
||||||
if (!plugin.dc.enabled)
|
if (!plugin.dc.enabled)
|
||||||
{
|
{
|
||||||
msg("The Discord integration system is currently disabled.", ChatColor.RED);
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ public class Command_linkdiscord extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
playerData.setDiscordID(args[1]);
|
playerData.setDiscordID(args[1]);
|
||||||
msg("Linked " + args[0] + "'s Discord account.", ChatColor.GREEN);
|
msg("Linked " + args[0] + "'s discord account.", ChatColor.GREEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@ import org.bukkit.entity.Player;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.NON_OP, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.IMPOSTOR, source = SourceType.BOTH)
|
||||||
@CommandParameters(description = "Lists the real names of all online players.", usage = "/<command> [-s | -f | -v]", aliases = "who,lsit")
|
@CommandParameters(description = "Lists the real names of all online players.", usage = "/<command> [-s | -i | -f | -v]", aliases = "who,lsit")
|
||||||
public class Command_list extends FreedomCommand
|
public class Command_list extends FreedomCommand
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -63,6 +63,11 @@ public class Command_list extends FreedomCommand
|
|||||||
listFilter = ListFilter.TELNET_SESSIONS;
|
listFilter = ListFilter.TELNET_SESSIONS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "-i":
|
||||||
|
{
|
||||||
|
listFilter = ListFilter.IMPOSTORS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "-f":
|
case "-f":
|
||||||
{
|
{
|
||||||
listFilter = ListFilter.FAMOUS_PLAYERS;
|
listFilter = ListFilter.FAMOUS_PLAYERS;
|
||||||
@ -117,6 +122,10 @@ public class Command_list extends FreedomCommand
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (listFilter == ListFilter.IMPOSTORS && !plugin.al.isAdminImpostor(p))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (listFilter == ListFilter.FAMOUS_PLAYERS && !ConfigEntry.FAMOUS_PLAYERS.getList().contains(p.getName().toLowerCase()))
|
if (listFilter == ListFilter.FAMOUS_PLAYERS && !ConfigEntry.FAMOUS_PLAYERS.getList().contains(p.getName().toLowerCase()))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@ -155,6 +164,7 @@ public class Command_list extends FreedomCommand
|
|||||||
ADMINS,
|
ADMINS,
|
||||||
VANISHED_ADMINS,
|
VANISHED_ADMINS,
|
||||||
TELNET_SESSIONS,
|
TELNET_SESSIONS,
|
||||||
FAMOUS_PLAYERS
|
FAMOUS_PLAYERS,
|
||||||
|
IMPOSTORS
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.IncompleteRegionException;
|
||||||
|
import com.sk89q.worldedit.LocalSession;
|
||||||
|
import com.sk89q.worldedit.regions.Region;
|
||||||
|
import com.sk89q.worldguard.domains.DefaultDomain;
|
||||||
|
import com.sk89q.worldguard.protection.flags.Flag;
|
||||||
|
import com.sk89q.worldguard.protection.flags.Flags;
|
||||||
|
import com.sk89q.worldguard.protection.flags.RegionGroup;
|
||||||
|
import com.sk89q.worldguard.protection.flags.StateFlag;
|
||||||
|
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||||
|
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
|
||||||
|
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME)
|
||||||
|
@CommandParameters(description = "Make a WorldGuard region for an OP.", usage = "/<command> <playername> <name>", aliases = "mor")
|
||||||
|
public class Command_makeopregion extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
final Map<Flag<?>, Object> flags = new HashMap<Flag<?>, Object>()
|
||||||
|
{{
|
||||||
|
put(Flags.BLOCK_PLACE, StateFlag.State.ALLOW);
|
||||||
|
put(Flags.BLOCK_BREAK, StateFlag.State.ALLOW);
|
||||||
|
put(Flags.BUILD, StateFlag.State.ALLOW);
|
||||||
|
put(Flags.PLACE_VEHICLE, StateFlag.State.ALLOW);
|
||||||
|
put(Flags.DESTROY_VEHICLE, StateFlag.State.ALLOW);
|
||||||
|
put(Flags.ENTITY_ITEM_FRAME_DESTROY, StateFlag.State.ALLOW);
|
||||||
|
put(Flags.ENTITY_PAINTING_DESTROY, StateFlag.State.ALLOW);
|
||||||
|
put(net.goldtreeservers.worldguardextraflags.flags.Flags.WORLDEDIT, StateFlag.State.ALLOW);
|
||||||
|
}};
|
||||||
|
|
||||||
|
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length < 2)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Player player = getPlayer(args[0]);
|
||||||
|
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
msg(FreedomCommand.PLAYER_NOT_FOUND);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String name = args[1];
|
||||||
|
|
||||||
|
LocalSession session = plugin.web.getWorldEditPlugin().getSession(playerSender);
|
||||||
|
|
||||||
|
Region selection;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
selection = session.getSelection(session.getSelectionWorld());
|
||||||
|
}
|
||||||
|
catch (IncompleteRegionException e)
|
||||||
|
{
|
||||||
|
msg("Please make a WorldEdit selection", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selection == null)
|
||||||
|
{
|
||||||
|
msg("Please make a WorldEdit selection", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProtectedRegion region = new ProtectedCuboidRegion(name, selection.getMinimumPoint(), selection.getMaximumPoint());
|
||||||
|
|
||||||
|
DefaultDomain owners = new DefaultDomain();
|
||||||
|
owners.addPlayer(playerSender.getName());
|
||||||
|
owners.addPlayer(player.getName());
|
||||||
|
region.setOwners(owners);
|
||||||
|
region.setFlags(flags);
|
||||||
|
|
||||||
|
for (Flag<?> flag : flags.keySet())
|
||||||
|
{
|
||||||
|
region.setFlag(flag.getRegionGroupFlag(), RegionGroup.MEMBERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
RegionManager regionManager = plugin.wgb.getRegionManager(playerSender.getWorld());
|
||||||
|
|
||||||
|
regionManager.addRegion(region);
|
||||||
|
|
||||||
|
msg("Successfully created the region '" + name + "' for " + player.getName(), ChatColor.GREEN);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -35,8 +35,8 @@ public class Command_manageshop extends FreedomCommand
|
|||||||
}
|
}
|
||||||
switch (args[1])
|
switch (args[1])
|
||||||
{
|
{
|
||||||
|
|
||||||
case "add":
|
case "add":
|
||||||
{
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
||||||
@ -75,9 +75,7 @@ public class Command_manageshop extends FreedomCommand
|
|||||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
msg("Invalid number: " + args[2], ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
case "remove":
|
case "remove":
|
||||||
{
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
||||||
@ -124,9 +122,7 @@ public class Command_manageshop extends FreedomCommand
|
|||||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
msg("Invalid number: " + args[2], ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
case "set":
|
case "set":
|
||||||
{
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
||||||
@ -151,11 +147,6 @@ public class Command_manageshop extends FreedomCommand
|
|||||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
msg("Invalid number: " + args[2], ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (args[0].equals("items"))
|
else if (args[0].equals("items"))
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Manually verify someone", usage = "/<command> <playername>", aliases = "mv")
|
||||||
|
public class Command_manuallyverify extends FreedomCommand
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||||
|
if (!plugin.dc.enabled)
|
||||||
|
{
|
||||||
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!verificationEnabled)
|
||||||
|
{
|
||||||
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Player player = getPlayer(args[0]);
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
msg(FreedomCommand.PLAYER_NOT_FOUND);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!plugin.pl.IsImpostor(player))
|
||||||
|
{
|
||||||
|
msg("That player is not an impostor.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FUtil.adminAction(sender.getName(), "Manually verifying player " + player.getName(), false);
|
||||||
|
player.setOp(true);
|
||||||
|
msg(player, YOU_ARE_OP);
|
||||||
|
|
||||||
|
if (plugin.pl.getPlayer(player).getFreezeData().isFrozen())
|
||||||
|
{
|
||||||
|
plugin.pl.getPlayer(player).getFreezeData().setFrozen(false);
|
||||||
|
msg(player, "You have been unfrozen.");
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.pl.verify(player, null);
|
||||||
|
plugin.rm.updateDisplay(player);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -116,21 +116,39 @@ public class Command_mbconfig extends FreedomCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!data.isMasterBuilder())
|
if (data.isMasterBuilder() && plugin.pl.isPlayerImpostor(player))
|
||||||
|
{
|
||||||
|
FUtil.adminAction(sender.getName(), "Re-adding " + data.getName() + " to the Master Builder list", true);
|
||||||
|
|
||||||
|
if (plugin.pl.getPlayer(player).getFreezeData().isFrozen())
|
||||||
|
{
|
||||||
|
plugin.pl.getPlayer(player).getFreezeData().setFrozen(false);
|
||||||
|
}
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
plugin.pl.verify(player, null);
|
||||||
|
plugin.rm.updateDisplay(player);
|
||||||
|
player.setOp(true);
|
||||||
|
msg(player, YOU_ARE_OP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!data.isMasterBuilder())
|
||||||
{
|
{
|
||||||
FUtil.adminAction(sender.getName(), "Adding " + data.getName() + " to the Master Builder list", true);
|
FUtil.adminAction(sender.getName(), "Adding " + data.getName() + " to the Master Builder list", true);
|
||||||
data.setMasterBuilder(true);
|
data.setMasterBuilder(true);
|
||||||
|
data.setVerification(true);
|
||||||
plugin.pl.save(data);
|
plugin.pl.save(data);
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
plugin.rm.updateDisplay(player);
|
plugin.rm.updateDisplay(player);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
msg("That player is already on the Master Builder list.");
|
msg("That player is already on the Master Builder list.");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
case "remove":
|
case "remove":
|
||||||
{
|
{
|
||||||
@ -155,6 +173,10 @@ public class Command_mbconfig extends FreedomCommand
|
|||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Removing " + data.getName() + " from the Master Builder list", true);
|
FUtil.adminAction(sender.getName(), "Removing " + data.getName() + " from the Master Builder list", true);
|
||||||
data.setMasterBuilder(false);
|
data.setMasterBuilder(false);
|
||||||
|
if (data.getDiscordID() == null)
|
||||||
|
{
|
||||||
|
data.setVerification(false);
|
||||||
|
}
|
||||||
plugin.pl.save(data);
|
plugin.pl.save(data);
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,266 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.SplittableRandom;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import net.minecraft.server.v1_16_R3.NBTTagCompound;
|
||||||
|
import net.minecraft.server.v1_16_R3.NBTTagList;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.bukkit.inventory.meta.PotionMeta;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||||
|
@CommandParameters(description = "Modify the current item you are holding.", usage = "/<command> <name <message> | lore <message> | enchant <enchantment> <level> | potion <effect> <duration> <amplifier> | attribute <name> <amount> | clear>", aliases = "mi")
|
||||||
|
public class Command_modifyitem extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public boolean run(final CommandSender sender, final Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length < 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemStack item = playerSender.getInventory().getItemInMainHand();
|
||||||
|
if (item.getType().equals(Material.AIR))
|
||||||
|
{
|
||||||
|
msg("You must have an item in your hand!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[0].equalsIgnoreCase("clear"))
|
||||||
|
{
|
||||||
|
item.setItemMeta(null);
|
||||||
|
playerSender.getInventory().setItemInMainHand(item);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length < 2)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
assert meta != null;
|
||||||
|
switch (args[0])
|
||||||
|
{
|
||||||
|
case "name":
|
||||||
|
String name = FUtil.colorize(StringUtils.join(args, " ", 1, args.length));
|
||||||
|
meta.setDisplayName(name);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "lore":
|
||||||
|
List<String> lore = new ArrayList<>();
|
||||||
|
for (String line : StringUtils.join(args, " ", 1, args.length).split("\\\\n"))
|
||||||
|
{
|
||||||
|
lore.add(FUtil.colorize(line));
|
||||||
|
}
|
||||||
|
meta.setLore(lore);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "enchant":
|
||||||
|
if (args.length < 3)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Enchantment enchantment = Enchantment.getByName(args[1].toUpperCase());
|
||||||
|
if (enchantment == null)
|
||||||
|
{
|
||||||
|
msg("Invalid enchantment. Please run /enchant list for a list of valid enchantments.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int level;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
level = Integer.parseInt(args[2]);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException ex)
|
||||||
|
{
|
||||||
|
msg("The level specified is not a valid integer.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
meta.addEnchant(enchantment, level, true);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "potion":
|
||||||
|
{
|
||||||
|
if (!item.getType().equals(Material.POTION) & !item.getType().equals(Material.SPLASH_POTION) & !item.getType().equals(Material.LINGERING_POTION) & !item.getType().equals(Material.TIPPED_ARROW))
|
||||||
|
{
|
||||||
|
msg("This item can not have potion effects added to it.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length < 4)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PotionEffectType type = PotionEffectType.getByName(args[1]);
|
||||||
|
if (type == null)
|
||||||
|
{
|
||||||
|
msg("Invalid potion effect. Please run /potion list for a list of valid potion effects.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int duration;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
duration = Math.max(1, Math.min(1000000, Integer.parseInt(args[2])));
|
||||||
|
}
|
||||||
|
catch (NumberFormatException ex)
|
||||||
|
{
|
||||||
|
msg("The duration specified is not a valid integer.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amplifier;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
amplifier = Math.max(1, Math.min(256, Integer.parseInt(args[2])));
|
||||||
|
}
|
||||||
|
catch (NumberFormatException ex)
|
||||||
|
{
|
||||||
|
msg("The amplifier specified is not a valid integer.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
PotionMeta potionMeta = (PotionMeta)meta;
|
||||||
|
potionMeta.addCustomEffect(type.createEffect(duration, amplifier), true);
|
||||||
|
item.setItemMeta(potionMeta);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "attribute":
|
||||||
|
if (args.length < 3)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
|
||||||
|
NBTTagCompound compound = (nmsStack.hasTag()) ? nmsStack.getTag() : new NBTTagCompound();
|
||||||
|
NBTTagList modifiers = getAttributeList(nmsStack);
|
||||||
|
NBTTagCompound cmpnd = new NBTTagCompound();
|
||||||
|
Attribute attribute = Attribute.getByName(args[1].toUpperCase());
|
||||||
|
if (attribute == null)
|
||||||
|
{
|
||||||
|
msg("Invalid attribute. Please run /attributelist for a list of valid attributes.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
cmpnd.setString("AttributeName", attribute.getAttribute());
|
||||||
|
cmpnd.setString("Name", attribute.getAttribute());
|
||||||
|
double amount;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
amount = Double.parseDouble(args[2]);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException ex)
|
||||||
|
{
|
||||||
|
msg("The amount specified is not a valid integer.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (Double.isNaN(amount))
|
||||||
|
{
|
||||||
|
msg("The amount specified is illegal.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
cmpnd.setDouble("Amount", amount);
|
||||||
|
cmpnd.setInt("Operation", 0);
|
||||||
|
SplittableRandom random = new SplittableRandom();
|
||||||
|
cmpnd.setIntArray("UUID", new int[]
|
||||||
|
{
|
||||||
|
random.nextInt(),
|
||||||
|
random.nextInt(),
|
||||||
|
random.nextInt(),
|
||||||
|
random.nextInt()
|
||||||
|
});
|
||||||
|
cmpnd.setString("Slot", "mainhand");
|
||||||
|
modifiers.add(cmpnd);
|
||||||
|
assert compound != null;
|
||||||
|
compound.set("AttributeModifiers", modifiers);
|
||||||
|
nmsStack.setTag(compound);
|
||||||
|
item = CraftItemStack.asBukkitCopy(nmsStack);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
playerSender.getInventory().setItemInMainHand(item);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack)
|
||||||
|
{
|
||||||
|
if (stack.getTag() == null)
|
||||||
|
{
|
||||||
|
stack.setTag(new NBTTagCompound());
|
||||||
|
}
|
||||||
|
NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10);
|
||||||
|
if (attr == null)
|
||||||
|
{
|
||||||
|
stack.getTag().set("AttributeModifiers", new NBTTagList());
|
||||||
|
}
|
||||||
|
return stack.getTag().getList("AttributeModifiers", 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum Attribute
|
||||||
|
{
|
||||||
|
GENERIC_MAX_HEALTH("GENERIC_MAX_HEALTH", "generic.max_health"),
|
||||||
|
GENERIC_FOLLOW_RANGE("GENERIC_FOLLOW_RANGE", "generic.follow_range"),
|
||||||
|
GENERIC_KNOCKBACK_RESISTANCE("GENERIC_KNOCKBACK_RESISTANCE", "generic.knockback_resistance"),
|
||||||
|
GENERIC_MOVEMENT_SPEED("GENERIC_MOVEMENT_SPEED", "generic.movement_speed"),
|
||||||
|
GENERIC_FLYING_SPEED("GENERIC_FLYING_SPEED", "generic.flying_speed"),
|
||||||
|
GENERIC_ATTACK_DAMAGE("GENERIC_ATTACK_DAMAGE", "generic.attack_damage"),
|
||||||
|
GENERIC_ATTACK_SPEED("GENERIC_ATTACK_SPEED", "generic.attack_speed"),
|
||||||
|
GENERIC_ARMOR("GENERIC_ARMOR", "generic.armor"),
|
||||||
|
GENERIC_ARMOR_TOUGHNESS("GENERIC_ARMOR_TOUGHNESS", "generic.armor_toughmess"),
|
||||||
|
GENERIC_LUCK("GENERIC_LUCK", "generic.luck"),
|
||||||
|
HORSE_JUMP_STRENGTH("GENERIC_MAX_HEALTH", "horse.jump_strength"),
|
||||||
|
ZOMBIE_SPAWN_REINFORCEMENTS("ZOMBIE_SPAWN_REINFORCEMENTS", "zombie.spawn_reinforcements");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final String attribute;
|
||||||
|
|
||||||
|
Attribute(String name, String attribute)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.attribute = attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Attribute getByName(String name)
|
||||||
|
{
|
||||||
|
for (Attribute attr : Attribute.values())
|
||||||
|
{
|
||||||
|
if (attr.toString().toUpperCase().equals(name))
|
||||||
|
{
|
||||||
|
return attr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAttribute()
|
||||||
|
{
|
||||||
|
return attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -130,19 +130,17 @@ public class Command_mute extends FreedomCommand
|
|||||||
{
|
{
|
||||||
playerdata.setMuted(true);
|
playerdata.setMuted(true);
|
||||||
player.sendTitle(ChatColor.RED + "You've been muted.", ChatColor.YELLOW + "Be sure to follow the rules!", 20, 100, 60);
|
player.sendTitle(ChatColor.RED + "You've been muted.", ChatColor.YELLOW + "Be sure to follow the rules!", 20, 100, 60);
|
||||||
|
|
||||||
if (quiet)
|
|
||||||
{
|
|
||||||
msg("Muted " + player.getName() + " quietly");
|
|
||||||
return true; // doesn't announce reason
|
|
||||||
}
|
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true);
|
|
||||||
|
|
||||||
if (reason != null)
|
if (reason != null)
|
||||||
{
|
{
|
||||||
msg(player, ChatColor.RED + "Reason: " + ChatColor.YELLOW + reason);
|
msg(player, ChatColor.RED + "Reason: " + ChatColor.YELLOW + reason);
|
||||||
}
|
}
|
||||||
|
if (quiet)
|
||||||
|
{
|
||||||
|
msg("Muted " + player.getName() + " quietly");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true);
|
||||||
|
|
||||||
if (smite)
|
if (smite)
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.History;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Check the name history of a specified player.", usage = "/<command> <username>", aliases = "nh")
|
||||||
|
public class Command_namehistory extends FreedomCommand
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public boolean run(final CommandSender sender, final Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length != 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
History.reportHistory(sender, args[0]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -116,12 +116,8 @@ public class Command_notes extends FreedomCommand
|
|||||||
msg("Cleared " + count + " notes.", ChatColor.GREEN);
|
msg("Cleared " + count + " notes.", ChatColor.GREEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -24,10 +24,6 @@ public class Command_opall extends FreedomCommand
|
|||||||
msg(player, YOU_ARE_OP);
|
msg(player, YOU_ARE_OP);
|
||||||
plugin.rm.updateDisplay(player);
|
plugin.rm.updateDisplay(player);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
player.recalculatePermissions();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
|
||||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
@ -58,13 +56,11 @@ public class Command_orbit extends FreedomCommand
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Orbiting " + player.getName(), false);
|
|
||||||
|
|
||||||
player.setGameMode(GameMode.SURVIVAL);
|
player.setGameMode(GameMode.SURVIVAL);
|
||||||
playerdata.startOrbiting(strength);
|
playerdata.startOrbiting(strength);
|
||||||
player.setVelocity(new Vector(0, strength, 0));
|
|
||||||
|
|
||||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.ORBIT, null));
|
player.setVelocity(new Vector(0, strength, 0));
|
||||||
|
FUtil.adminAction(sender.getName(), "Orbiting " + player.getName(), false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,158 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||||
|
@CommandParameters(description = "Manage your verification", usage = "/<command> <enable | disable | clearips | clearip <ip> | status | genbackupcodes>", aliases = "playerverify,pv")
|
||||||
|
public class Command_playerverification extends FreedomCommand
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
PlayerData target = plugin.pl.getData(playerSender);
|
||||||
|
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||||
|
List<String> ips = new ArrayList<>(target.getIps());
|
||||||
|
|
||||||
|
if (verificationEnabled)
|
||||||
|
{
|
||||||
|
if (args.length == 1)
|
||||||
|
{
|
||||||
|
if (args[0].equalsIgnoreCase("clearips"))
|
||||||
|
{
|
||||||
|
int cleared = 0;
|
||||||
|
for (String ip : ips)
|
||||||
|
{
|
||||||
|
if (!ip.equals(FUtil.getIp(playerSender)))
|
||||||
|
{
|
||||||
|
target.removeIp(ip);
|
||||||
|
cleared++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msg("Cleared all IP's except your current IP \"" + FUtil.getIp(playerSender) + "\"");
|
||||||
|
msg("Cleared " + cleared + " IP's.");
|
||||||
|
plugin.pl.save(target);
|
||||||
|
plugin.pl.syncIps(target);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (args[0].equalsIgnoreCase("clearip"))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length < 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerData data = plugin.pl.getData(playerSender);
|
||||||
|
|
||||||
|
switch (args[0].toLowerCase())
|
||||||
|
{
|
||||||
|
case "enable":
|
||||||
|
{
|
||||||
|
if (!plugin.dc.enabled)
|
||||||
|
{
|
||||||
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (data.hasVerification())
|
||||||
|
{
|
||||||
|
msg("Discord verification is already enabled for you.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (data.getDiscordID() == null)
|
||||||
|
{
|
||||||
|
msg("Please link a discord account with /linkdiscord.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setVerification(true);
|
||||||
|
plugin.pl.save(data);
|
||||||
|
msg("Re-enabled Discord verification.", ChatColor.GREEN);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "disable":
|
||||||
|
{
|
||||||
|
if (!data.hasVerification())
|
||||||
|
{
|
||||||
|
msg("Discord verification is already disabled for you.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setVerification(false);
|
||||||
|
plugin.pl.save(data);
|
||||||
|
msg("Disabled Discord verification.", ChatColor.GREEN);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "status":
|
||||||
|
{
|
||||||
|
boolean enabled = target.hasVerification();
|
||||||
|
boolean specified = target.getDiscordID() != null;
|
||||||
|
msg(ChatColor.GRAY + "Discord Verification Enabled: " + (enabled ? ChatColor.GREEN + "true" : ChatColor.RED + "false"));
|
||||||
|
msg(ChatColor.GRAY + "Discord ID: " + (specified ? ChatColor.GREEN + target.getDiscordID() : ChatColor.RED + "not set"));
|
||||||
|
msg(ChatColor.GRAY + "Backup Codes: " + data.getBackupCodes().size() + "/" + "10");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "genbackupcodes":
|
||||||
|
{
|
||||||
|
if (!plugin.dc.enabled)
|
||||||
|
{
|
||||||
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (!data.hasVerification())
|
||||||
|
{
|
||||||
|
msg("Discord verification is not enabled for you.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean generated = plugin.dc.sendBackupCodes(data);
|
||||||
|
|
||||||
|
if (generated)
|
||||||
|
{
|
||||||
|
msg("Your backup codes have been sent to your discord account. They can be re-generated at anytime.", ChatColor.GREEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg("Failed to generate backup codes, please contact a developer.", ChatColor.RED);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||||
|
{
|
||||||
|
if (args.length == 1)
|
||||||
|
{
|
||||||
|
return Arrays.asList("enable", "disable", "status", "clearips", "genbackupcodes");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
@ -29,7 +29,6 @@ public class Command_potion extends FreedomCommand
|
|||||||
switch (args.length)
|
switch (args.length)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
{
|
|
||||||
if (args[0].equalsIgnoreCase("list"))
|
if (args[0].equalsIgnoreCase("list"))
|
||||||
{
|
{
|
||||||
List<String> potionEffectTypeNames = new ArrayList<>();
|
List<String> potionEffectTypeNames = new ArrayList<>();
|
||||||
@ -59,10 +58,8 @@ public class Command_potion extends FreedomCommand
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
if (args[0].equalsIgnoreCase("clear"))
|
if (args[0].equalsIgnoreCase("clear"))
|
||||||
{
|
{
|
||||||
Player target = playerSender;
|
Player target = playerSender;
|
||||||
@ -98,11 +95,9 @@ public class Command_potion extends FreedomCommand
|
|||||||
msg("Cleared all active potion effects " + (!target.equals(playerSender) ? "from player " + target.getName() + "." : "from yourself."), ChatColor.AQUA);
|
msg("Cleared all active potion effects " + (!target.equals(playerSender) ? "from player " + target.getName() + "." : "from yourself."), ChatColor.AQUA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
if (args[0].equalsIgnoreCase("add"))
|
if (args[0].equalsIgnoreCase("add"))
|
||||||
{
|
{
|
||||||
Player target = playerSender;
|
Player target = playerSender;
|
||||||
@ -172,11 +167,8 @@ public class Command_potion extends FreedomCommand
|
|||||||
+ (!target.equals(playerSender) ? " to player " + target.getName() + "." : " to yourself."), ChatColor.AQUA);
|
+ (!target.equals(playerSender) ? " to player " + target.getName() + "." : " to yourself."), ChatColor.AQUA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -187,17 +179,14 @@ public class Command_potion extends FreedomCommand
|
|||||||
switch (args.length)
|
switch (args.length)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
{
|
|
||||||
List<String> arguments = new ArrayList<>(Arrays.asList("list", "clear", "add"));
|
List<String> arguments = new ArrayList<>(Arrays.asList("list", "clear", "add"));
|
||||||
if (plugin.al.isAdmin(sender))
|
if (plugin.al.isAdmin(sender))
|
||||||
{
|
{
|
||||||
arguments.add("clearall");
|
arguments.add("clearall");
|
||||||
}
|
}
|
||||||
return arguments;
|
return arguments;
|
||||||
}
|
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
if (args[0].equals("clear"))
|
if (args[0].equals("clear"))
|
||||||
{
|
{
|
||||||
if (plugin.al.isAdmin(sender))
|
if (plugin.al.isAdmin(sender))
|
||||||
@ -210,28 +199,22 @@ public class Command_potion extends FreedomCommand
|
|||||||
return getAllPotionTypes();
|
return getAllPotionTypes();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
if (args[0].equals("add"))
|
if (args[0].equals("add"))
|
||||||
{
|
{
|
||||||
return Collections.singletonList("<duration>");
|
return Collections.singletonList("<duration>");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
if (args[0].equals("add"))
|
if (args[0].equals("add"))
|
||||||
{
|
{
|
||||||
return Collections.singletonList("<amplifier>");
|
return Collections.singletonList("<amplifier>");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
if (plugin.al.isAdmin(sender))
|
if (plugin.al.isAdmin(sender))
|
||||||
{
|
{
|
||||||
if (args[0].equals("add"))
|
if (args[0].equals("add"))
|
||||||
@ -240,12 +223,6 @@ public class Command_potion extends FreedomCommand
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||||
|
@CommandParameters(description = "Release parrots from your shoulders.", usage = "/<command>", aliases = "removeparrots")
|
||||||
|
public class Command_releaseparrots extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
Entity leftShoulderEntity = playerSender.getShoulderEntityLeft();
|
||||||
|
Entity rightShoulderEntity = playerSender.getShoulderEntityRight();
|
||||||
|
|
||||||
|
if (rightShoulderEntity == null && leftShoulderEntity == null)
|
||||||
|
{
|
||||||
|
msg("No parrots were detected on either of your shoulders.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (leftShoulderEntity != null && leftShoulderEntity.getType().equals(EntityType.PARROT))
|
||||||
|
{
|
||||||
|
playerSender.setShoulderEntityLeft(null);
|
||||||
|
msg("Removed the parrot on your left shoulder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rightShoulderEntity != null && rightShoulderEntity.getType().equals(EntityType.PARROT))
|
||||||
|
{
|
||||||
|
playerSender.setShoulderEntityRight(null);
|
||||||
|
msg("Removed the parrot on your right shoulder.");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,6 @@ import me.totalfreedom.totalfreedommod.rank.Rank;
|
|||||||
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;
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
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;
|
||||||
@ -23,40 +22,36 @@ public class Command_report extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
Player player = getPlayer(args[0], true);
|
Player player = getPlayer(args[0], true);
|
||||||
OfflinePlayer offlinePlayer = getOfflinePlayer(args[0]);
|
|
||||||
|
|
||||||
if (player == null && offlinePlayer == null)
|
if (player == null)
|
||||||
{
|
{
|
||||||
msg(PLAYER_NOT_FOUND);
|
msg(PLAYER_NOT_FOUND);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (player != null)
|
|
||||||
{
|
|
||||||
if (sender instanceof Player)
|
|
||||||
{
|
|
||||||
if (player.equals(playerSender))
|
|
||||||
{
|
|
||||||
msg(ChatColor.RED + "Please, don't try to report yourself.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plugin.al.isAdmin(player))
|
if (sender instanceof Player)
|
||||||
|
{
|
||||||
|
if (player.equals(playerSender))
|
||||||
{
|
{
|
||||||
msg(ChatColor.RED + "You can not report admins.");
|
msg(ChatColor.RED + "Please, don't try to report yourself.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.al.isAdmin(player))
|
||||||
|
{
|
||||||
|
msg(ChatColor.RED + "You can not report admins.");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String report = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
String report = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
||||||
plugin.cm.reportAction(playerSender, (player == null) ? offlinePlayer.getName() : player.getName(), report);
|
plugin.cm.reportAction(playerSender, player, report);
|
||||||
|
|
||||||
boolean logged = false;
|
boolean logged = false;
|
||||||
|
|
||||||
if (plugin.dc.enabled)
|
if (plugin.dc.enabled)
|
||||||
{
|
{
|
||||||
logged = (player == null) ? plugin.dc.sendReportOffline(playerSender, offlinePlayer, report) : plugin.dc.sendReport(playerSender, player, report);
|
logged = plugin.dc.sendReport(playerSender, player, report);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg(ChatColor.GREEN + "Thank you, your report has been successfully logged."
|
msg(ChatColor.GREEN + "Thank you, your report has been successfully logged."
|
||||||
|
@ -176,18 +176,26 @@ public class Command_saconfig extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find the old admin entry
|
// Find the old admin entry
|
||||||
|
String name = player.getName();
|
||||||
Admin admin = null;
|
Admin admin = null;
|
||||||
for (Admin loopAdmin : plugin.al.getAllAdmins())
|
for (Admin loopAdmin : plugin.al.getAllAdmins())
|
||||||
{
|
{
|
||||||
if (loopAdmin.getUuid().equals(player.getUniqueId()))
|
if (loopAdmin.getName().equalsIgnoreCase(name) || loopAdmin.getIps().contains(FUtil.getIp(player)))
|
||||||
{
|
{
|
||||||
admin = loopAdmin;
|
admin = loopAdmin;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (plugin.pl.isPlayerImpostor(player))
|
||||||
|
{
|
||||||
|
msg("This player was labeled as a Player impostor and is not an admin, therefore they cannot be added to the admin list.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (admin == null) // New admin
|
if (admin == null) // New admin
|
||||||
{
|
{
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Adding " + player.getName() + " to the admin list", true);
|
FUtil.adminAction(sender.getName(), "Adding " + player.getName() + " to the admin list", true);
|
||||||
admin = new Admin(player);
|
admin = new Admin(player);
|
||||||
|
|
||||||
@ -197,10 +205,23 @@ public class Command_saconfig extends FreedomCommand
|
|||||||
else // Existing admin
|
else // Existing admin
|
||||||
{
|
{
|
||||||
FUtil.adminAction(sender.getName(), "Re-adding " + player.getName() + " to the admin list", true);
|
FUtil.adminAction(sender.getName(), "Re-adding " + player.getName() + " to the admin list", true);
|
||||||
|
|
||||||
|
String oldName = admin.getName();
|
||||||
|
if (!oldName.equals(player.getName()))
|
||||||
|
{
|
||||||
|
admin.setName(player.getName());
|
||||||
|
plugin.sql.updateAdminName(oldName, admin.getName());
|
||||||
|
}
|
||||||
admin.addIp(FUtil.getIp(player));
|
admin.addIp(FUtil.getIp(player));
|
||||||
|
|
||||||
admin.setActive(true);
|
admin.setActive(true);
|
||||||
admin.setLastLogin(new Date());
|
admin.setLastLogin(new Date());
|
||||||
|
|
||||||
|
if (plugin.al.isVerifiedAdmin(player))
|
||||||
|
{
|
||||||
|
plugin.al.verifiedNoAdmin.remove(player.getName());
|
||||||
|
}
|
||||||
|
|
||||||
plugin.al.save(admin);
|
plugin.al.save(admin);
|
||||||
plugin.al.updateTables();
|
plugin.al.updateTables();
|
||||||
plugin.rm.updateDisplay(player);
|
plugin.rm.updateDisplay(player);
|
||||||
@ -238,7 +259,6 @@ public class Command_saconfig extends FreedomCommand
|
|||||||
checkRank(Rank.ADMIN);
|
checkRank(Rank.ADMIN);
|
||||||
|
|
||||||
Player player = getPlayer(args[1]);
|
Player player = getPlayer(args[1]);
|
||||||
|
|
||||||
Admin admin = player != null ? plugin.al.getAdmin(player) : plugin.al.getEntryByName(args[1]);
|
Admin admin = player != null ? plugin.al.getAdmin(player) : plugin.al.getEntryByName(args[1]);
|
||||||
|
|
||||||
if (admin == null)
|
if (admin == null)
|
||||||
@ -247,22 +267,20 @@ public class Command_saconfig extends FreedomCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String adminName = admin.getName();
|
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Removing " + admin.getName() + " from the admin list", true);
|
FUtil.adminAction(sender.getName(), "Removing " + admin.getName() + " from the admin list", true);
|
||||||
admin.setActive(false);
|
admin.setActive(false);
|
||||||
|
|
||||||
plugin.al.save(admin);
|
plugin.al.save(admin);
|
||||||
plugin.al.updateTables();
|
plugin.al.updateTables();
|
||||||
|
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
plugin.rm.updateDisplay(player);
|
plugin.rm.updateDisplay(player);
|
||||||
|
plugin.pl.getPlayer(player).setAdminChat(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plugin.dc.enabled && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
|
if (plugin.dc.enabled && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean())
|
||||||
{
|
{
|
||||||
Discord.syncRoles(admin, plugin.pl.getData(adminName).getDiscordID());
|
Discord.syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID());
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.ptero.updateAccountStatus(admin);
|
plugin.ptero.updateAccountStatus(admin);
|
||||||
|
@ -1,97 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
|
||||||
import net.md_5.bungee.api.chat.BaseComponent;
|
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
|
||||||
import net.md_5.bungee.api.chat.HoverEvent;
|
|
||||||
import net.md_5.bungee.api.chat.TextComponent;
|
|
||||||
import net.md_5.bungee.api.chat.TranslatableComponent;
|
|
||||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.NON_OP, source = SourceType.BOTH)
|
|
||||||
@CommandParameters(description = "Get the seed of the world you are currently in.", usage = "/seed [world]")
|
|
||||||
public class Command_seed extends FreedomCommand
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
|
||||||
{
|
|
||||||
World world;
|
|
||||||
|
|
||||||
if (args.length > 0)
|
|
||||||
{
|
|
||||||
world = server.getWorld(args[0]);
|
|
||||||
if (world == null)
|
|
||||||
{
|
|
||||||
msg("That world could not be found", ChatColor.RED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// If the sender is a Player, use that world. Otherwise, use the overworld as a fallback.
|
|
||||||
if (!senderIsConsole)
|
|
||||||
{
|
|
||||||
world = playerSender.getWorld();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
world = server.getWorlds().get(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the sender is not a Player, use the usual msg method to
|
|
||||||
if (senderIsConsole)
|
|
||||||
{
|
|
||||||
msg("Seed: [" + ChatColor.GREEN + world.getSeed() + ChatColor.WHITE + "]", ChatColor.WHITE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Gets the seed for later uses
|
|
||||||
String seed = String.valueOf(world.getSeed());
|
|
||||||
|
|
||||||
// This is a really stupid hack to get things to play nicely, but it works so I don't give a damn
|
|
||||||
BaseComponent[] components = {new TranslatableComponent("chat.copy.click")};
|
|
||||||
TextComponent seedAsComponent = new TextComponent(seed);
|
|
||||||
|
|
||||||
// Style the message like in vanilla Minecraft.
|
|
||||||
seedAsComponent.setColor(ChatColor.GREEN.asBungee());
|
|
||||||
seedAsComponent.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, seed));
|
|
||||||
seedAsComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(components)));
|
|
||||||
|
|
||||||
// Enclose the seed with brackets
|
|
||||||
TextComponent seedString = new TextComponent("[");
|
|
||||||
seedString.addExtra(seedAsComponent);
|
|
||||||
seedString.addExtra("]");
|
|
||||||
|
|
||||||
// Send the message to the player.
|
|
||||||
TranslatableComponent response = new TranslatableComponent("commands.seed.success", seedString);
|
|
||||||
playerSender.spigot().sendMessage(response);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
|
||||||
{
|
|
||||||
if (args.length == 1)
|
|
||||||
{
|
|
||||||
// Returns a list of worlds on the server and returns it
|
|
||||||
List<String> worlds = new ArrayList<>();
|
|
||||||
for (World world : server.getWorlds())
|
|
||||||
{
|
|
||||||
worlds.add(world.getName());
|
|
||||||
}
|
|
||||||
return worlds;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,49 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||||
|
@CommandParameters(description = "Sets your experience level (XP).", usage = "/<command> [level]")
|
||||||
|
public class Command_setlevel extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length != 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int new_level;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
new_level = Integer.parseInt(args[0]);
|
||||||
|
|
||||||
|
if (new_level < 0)
|
||||||
|
{
|
||||||
|
new_level = 0;
|
||||||
|
}
|
||||||
|
else if (new_level > 50)
|
||||||
|
{
|
||||||
|
new_level = 50;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (NumberFormatException ex)
|
||||||
|
{
|
||||||
|
msg("Invalid level.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
playerSender.setLevel(new_level);
|
||||||
|
|
||||||
|
msg("Your XP level is now set to " + ChatColor.GOLD + new_level);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.ArmorStand;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||||
|
@CommandParameters(description = "Sit at the current place you are at.", usage = "/<command>")
|
||||||
|
public class Command_sit extends FreedomCommand
|
||||||
|
{
|
||||||
|
public static List<ArmorStand> STANDS = new ArrayList<>();
|
||||||
|
|
||||||
|
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArmorStand stand = (ArmorStand)playerSender.getWorld().spawnEntity(playerSender.getLocation().clone().subtract(0.0, 1.7, 0.0), EntityType.ARMOR_STAND);
|
||||||
|
stand.setGravity(false);
|
||||||
|
stand.setAI(false);
|
||||||
|
stand.setVisible(false);
|
||||||
|
stand.setInvulnerable(true);
|
||||||
|
stand.addPassenger(playerSender);
|
||||||
|
STANDS.add(stand);
|
||||||
|
msg("You are now sitting.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,6 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.lang3.EnumUtils;
|
import org.apache.commons.lang3.EnumUtils;
|
||||||
@ -57,7 +55,6 @@ public class Command_spawnmob extends FreedomCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int max = ConfigEntry.SPAWNMOB_MAX.getInteger();
|
|
||||||
int amount = 1;
|
int amount = 1;
|
||||||
if (args.length > 1)
|
if (args.length > 1)
|
||||||
{
|
{
|
||||||
@ -72,9 +69,9 @@ public class Command_spawnmob extends FreedomCommand
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amount > max || amount < 1)
|
if (amount > 10 || amount < 1)
|
||||||
{
|
{
|
||||||
msg("Invalid amount: " + args[1] + ". Must be 1-" + max + ".", ChatColor.RED);
|
msg("Invalid amount: " + args[1] + ". Must be 1-10.", ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,11 +105,6 @@ public class Command_tag extends FreedomCommand
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (args.length >= 2)
|
else if (args.length >= 2)
|
||||||
@ -284,11 +279,6 @@ public class Command_tag extends FreedomCommand
|
|||||||
msg("Tag set to '" + outputTag + ChatColor.GRAY + "'." + (save ? " (Saved)" : "") + from + to);
|
msg("Tag set to '" + outputTag + ChatColor.GRAY + "'." + (save ? " (Saved)" : "") + from + to);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -0,0 +1,143 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
|
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||||
|
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true)
|
||||||
|
@CommandParameters(description = "Temporarily bans a player for five minutes.", usage = "/<command> [-q] <username> [reason]", aliases = "noob")
|
||||||
|
public class Command_tban extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean quiet = args[0].equalsIgnoreCase("-q");
|
||||||
|
if (quiet)
|
||||||
|
{
|
||||||
|
args = org.apache.commons.lang3.ArrayUtils.subarray(args, 1, args.length);
|
||||||
|
|
||||||
|
if (args.length < 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final String username;
|
||||||
|
|
||||||
|
final Player player = getPlayer(args[0]);
|
||||||
|
final PlayerData entry;
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
entry = plugin.pl.getData(args[0]);
|
||||||
|
|
||||||
|
if (entry == null)
|
||||||
|
{
|
||||||
|
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
username = entry.getName();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entry = plugin.pl.getData(player);
|
||||||
|
username = player.getName();
|
||||||
|
}
|
||||||
|
final List<String> ips = new ArrayList<>(entry.getIps());
|
||||||
|
|
||||||
|
String reason = null;
|
||||||
|
if (args.length > 1)
|
||||||
|
{
|
||||||
|
reason = StringUtils.join(args, " ", 1, args.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder kick = new StringBuilder()
|
||||||
|
.append(ChatColor.RED)
|
||||||
|
.append("You have been temporarily banned for five minutes. Please read totalfreedom.me for more info.");
|
||||||
|
|
||||||
|
if (!quiet)
|
||||||
|
{
|
||||||
|
// Strike with lightning
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
final Location targetPos = player.getLocation();
|
||||||
|
for (int x = -1; x <= 1; x++)
|
||||||
|
{
|
||||||
|
for (int z = -1; z <= 1; z++)
|
||||||
|
{
|
||||||
|
final Location strike_pos = new Location(targetPos.getWorld(), targetPos.getBlockX() + x, targetPos.getBlockY(), targetPos.getBlockZ() + z);
|
||||||
|
Objects.requireNonNull(targetPos.getWorld()).strikeLightning(strike_pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kill player
|
||||||
|
player.setHealth(0.0);
|
||||||
|
|
||||||
|
if (reason != null)
|
||||||
|
{
|
||||||
|
FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes - Reason: " + reason, true);
|
||||||
|
kick.append("\n")
|
||||||
|
.append(ChatColor.RED)
|
||||||
|
.append("Reason: ")
|
||||||
|
.append(ChatColor.GOLD)
|
||||||
|
.append(reason);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
if (reason != null)
|
||||||
|
{
|
||||||
|
msg("Quietly temporarily banned " + player.getName() + " for 5 minutes.");
|
||||||
|
kick.append("\n")
|
||||||
|
.append(ChatColor.RED)
|
||||||
|
.append("Reason: ")
|
||||||
|
.append(ChatColor.GOLD)
|
||||||
|
.append(reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ban player
|
||||||
|
Ban ban = Ban.forPlayerName(username, sender, FUtil.parseDateOffset("5m"), reason);
|
||||||
|
for (String ip : ips)
|
||||||
|
{
|
||||||
|
ban.addIp(ip);
|
||||||
|
}
|
||||||
|
plugin.bm.addBan(ban);
|
||||||
|
|
||||||
|
// Kick player
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
player.kickPlayer(kick.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log ban
|
||||||
|
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import com.earth2me.essentials.User;
|
|
||||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||||
@ -21,7 +21,7 @@ import org.bukkit.command.CommandSender;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||||
@CommandParameters(description = "Temporarily ban someone.", usage = "/<command> [-q] <username> [duration] [reason]", aliases = "tban,noob")
|
@CommandParameters(description = "Temporarily ban someone.", usage = "/<command> [-q] <username> [duration] [reason]")
|
||||||
public class Command_tempban extends FreedomCommand
|
public class Command_tempban extends FreedomCommand
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -47,72 +47,49 @@ public class Command_tempban extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
final String username;
|
final String username;
|
||||||
final String ip;
|
final List<String> ips = new ArrayList<>();
|
||||||
|
|
||||||
final Player player = getPlayer(args[0]);
|
final Player player = getPlayer(args[0]);
|
||||||
PlayerData entry;
|
final PlayerData entry;
|
||||||
if (player == null)
|
if (player == null)
|
||||||
{
|
{
|
||||||
// Gets the IP using Essentials data if available
|
entry = plugin.pl.getData(args[0]);
|
||||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
|
||||||
|
if (entry == null)
|
||||||
{
|
{
|
||||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||||
//
|
return true;
|
||||||
username = essUser.getName();
|
|
||||||
ip = essUser.getLastLoginAddress();
|
|
||||||
}
|
|
||||||
// Last resort - Getting the first result from the username itself
|
|
||||||
else
|
|
||||||
{
|
|
||||||
entry = plugin.pl.getData(args[0]);
|
|
||||||
if (entry == null)
|
|
||||||
{
|
|
||||||
msg(PLAYER_NOT_FOUND);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
username = entry.getName();
|
|
||||||
ip = entry.getIps().get(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
username = entry.getName();
|
||||||
|
ips.addAll(entry.getIps());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
entry = plugin.pl.getData(player);
|
||||||
username = player.getName();
|
username = player.getName();
|
||||||
ip = FUtil.getIp(player);
|
ips.add(FUtil.getIp(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
final StringBuilder message = new StringBuilder("Temporarily banned " + username);
|
final StringBuilder message = new StringBuilder("Temporarily banned " + username);
|
||||||
|
|
||||||
// Default expiration date is 5 minutes
|
Date expires = FUtil.parseDateOffset("30m");
|
||||||
Date expires = FUtil.parseDateOffset("5m");
|
|
||||||
|
|
||||||
// Parses what comes after as a duration
|
|
||||||
if (args.length > 1)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
expires = FUtil.parseDateOffset(args[1]);
|
|
||||||
}
|
|
||||||
catch (NumberFormatException error)
|
|
||||||
{
|
|
||||||
msg("Invalid duration: " + args[1], ChatColor.RED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message.append(" until ").append(date_format.format(expires));
|
message.append(" until ").append(date_format.format(expires));
|
||||||
|
|
||||||
// If a reason appears to exist, set it.
|
|
||||||
String reason = null;
|
String reason = null;
|
||||||
if (args.length > 2)
|
if (args.length >= 2)
|
||||||
{
|
{
|
||||||
reason = StringUtils.join(ArrayUtils.subarray(args, 2, args.length), " ") + " (" + sender.getName() + ")";
|
Date parsed_offset = FUtil.parseDateOffset(args[1]);
|
||||||
|
reason = StringUtils.join(ArrayUtils.subarray(args, parsed_offset == null ? 1 : 2, args.length), " ") + " (" + sender.getName() + ")";
|
||||||
|
if (parsed_offset != null)
|
||||||
|
{
|
||||||
|
expires = parsed_offset;
|
||||||
|
}
|
||||||
message.append(", Reason: \"").append(reason).append("\"");
|
message.append(", Reason: \"").append(reason).append("\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ban ban;
|
Ban ban;
|
||||||
|
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
ban = Ban.forPlayer(player, sender, expires, reason);
|
ban = Ban.forPlayer(player, sender, expires, reason);
|
||||||
@ -121,8 +98,11 @@ public class Command_tempban extends FreedomCommand
|
|||||||
{
|
{
|
||||||
ban = Ban.forPlayerName(username, sender, expires, reason);
|
ban = Ban.forPlayerName(username, sender, expires, reason);
|
||||||
}
|
}
|
||||||
ban.addIp(ip);
|
|
||||||
|
|
||||||
|
for (String ip : ips)
|
||||||
|
{
|
||||||
|
ban.addIp(ip);
|
||||||
|
}
|
||||||
plugin.bm.addBan(ban);
|
plugin.bm.addBan(ban);
|
||||||
|
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
@ -139,8 +119,6 @@ public class Command_tempban extends FreedomCommand
|
|||||||
Objects.requireNonNull(targetPos.getWorld()).strikeLightningEffect(strike_pos);
|
Objects.requireNonNull(targetPos.getWorld()).strikeLightningEffect(strike_pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.kickPlayer(ban.bakeKickMessage());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), message.toString(), true);
|
FUtil.adminAction(sender.getName(), message.toString(), true);
|
||||||
@ -150,15 +128,19 @@ public class Command_tempban extends FreedomCommand
|
|||||||
msg("Quietly temporarily banned " + username + ".");
|
msg("Quietly temporarily banned " + username + ".");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Player p : Bukkit.getOnlinePlayers())
|
if (player != null)
|
||||||
{
|
{
|
||||||
if (FUtil.getIp(p).equals(ip))
|
player.kickPlayer(ban.bakeKickMessage());
|
||||||
|
for (Player p : Bukkit.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
|
if (FUtil.getIp(p).equals(FUtil.getIp(player)))
|
||||||
|
{
|
||||||
|
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.TEMPBAN, reason));
|
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,12 +16,6 @@ import org.bukkit.entity.Player;
|
|||||||
@CommandParameters(description = "Toggles TotalFreedomMod settings", usage = "/<command> [option] [value] [value]")
|
@CommandParameters(description = "Toggles TotalFreedomMod settings", usage = "/<command> [option] [value] [value]")
|
||||||
public class Command_toggle extends FreedomCommand
|
public class Command_toggle extends FreedomCommand
|
||||||
{
|
{
|
||||||
private final List<String> toggles = Arrays.asList(
|
|
||||||
"waterplace", "fireplace", "lavaplace", "fluidspread", "lavadmg", "firespread", "frostwalk",
|
|
||||||
"firework", "prelog", "lockdown", "petprotect", "entitywipe", "nonuke [range] [count]",
|
|
||||||
"explosives [radius]", "unsafeenchs", "bells", "armorstands", "masterblocks", "grindstones",
|
|
||||||
"jukeboxes", "spawners", "4chan", "beehives", "respawnanchors", "autotp", "autoclear", "minecarts", "mp44",
|
|
||||||
"landmines", "tossmob", "gravity");
|
|
||||||
|
|
||||||
@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)
|
||||||
@ -29,10 +23,38 @@ public class Command_toggle extends FreedomCommand
|
|||||||
if (args.length == 0)
|
if (args.length == 0)
|
||||||
{
|
{
|
||||||
msg("Available toggles: ");
|
msg("Available toggles: ");
|
||||||
for (String toggle : toggles)
|
msg("- waterplace");
|
||||||
{
|
msg("- fireplace");
|
||||||
msg("- " + toggle);
|
msg("- lavaplace");
|
||||||
}
|
msg("- fluidspread");
|
||||||
|
msg("- lavadmg");
|
||||||
|
msg("- firespread");
|
||||||
|
msg("- frostwalk");
|
||||||
|
msg("- firework");
|
||||||
|
msg("- prelog");
|
||||||
|
msg("- lockdown");
|
||||||
|
msg("- petprotect");
|
||||||
|
msg("- entitywipe");
|
||||||
|
msg("- nonuke [range] [count]");
|
||||||
|
msg("- explosives [radius]");
|
||||||
|
msg("- unsafeenchs");
|
||||||
|
msg("- bells");
|
||||||
|
msg("- armorstands");
|
||||||
|
msg("- structureblocks");
|
||||||
|
msg("- jigsaws");
|
||||||
|
msg("- grindstones");
|
||||||
|
msg("- jukeboxes");
|
||||||
|
msg("- spawners");
|
||||||
|
msg("- 4chan");
|
||||||
|
msg("- beehives");
|
||||||
|
msg("- respawnanchors");
|
||||||
|
msg("- autotp");
|
||||||
|
msg("- autoclear");
|
||||||
|
msg("- minecarts");
|
||||||
|
msg("- landmines");
|
||||||
|
msg("- mp44");
|
||||||
|
msg("- tossmob");
|
||||||
|
msg("- gravity");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,9 +215,15 @@ public class Command_toggle extends FreedomCommand
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case "masterblocks":
|
case "structureblocks":
|
||||||
{
|
{
|
||||||
toggle("Master blocks are", ConfigEntry.ALLOW_MASTERBLOCKS);
|
toggle("Structure blocks are", ConfigEntry.ALLOW_STRUCTURE_BLOCKS);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "jigsaws":
|
||||||
|
{
|
||||||
|
toggle("Jigsaws are", ConfigEntry.ALLOW_JIGSAWS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,16 +304,6 @@ public class Command_toggle extends FreedomCommand
|
|||||||
toggle("Block gravity is", ConfigEntry.ALLOW_GRAVITY);
|
toggle("Block gravity is", ConfigEntry.ALLOW_GRAVITY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
msg("Available toggles: ");
|
|
||||||
for (String toggle : toggles)
|
|
||||||
{
|
|
||||||
msg("- " + toggle);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.shop.ShopItem;
|
|
||||||
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.ONLY_IN_GAME)
|
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME)
|
||||||
@CommandParameters(description = "Trails rainbow wool behind you as you walk/fly.", usage = "/<command>")
|
@CommandParameters(description = "Trails rainbow wool behind you as you walk/fly.", usage = "/<command>")
|
||||||
public class Command_trail extends FreedomCommand
|
public class Command_trail extends FreedomCommand
|
||||||
{
|
{
|
||||||
@ -15,12 +13,6 @@ public class Command_trail 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.pl.getData(playerSender).hasItem(ShopItem.RAINBOW_TRAIL))
|
|
||||||
{
|
|
||||||
msg("You didn't purchase the ability to have a " + ShopItem.RAINBOW_TRAIL.getName() + "! Purchase it from the shop.", ChatColor.RED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plugin.tr.contains(playerSender))
|
if (plugin.tr.contains(playerSender))
|
||||||
{
|
{
|
||||||
plugin.tr.remove(playerSender);
|
plugin.tr.remove(playerSender);
|
||||||
@ -29,7 +21,7 @@ public class Command_trail extends FreedomCommand
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
plugin.tr.add(playerSender);
|
plugin.tr.add(playerSender);
|
||||||
msg("Trail enabled. Run this command again to disable it.");
|
msg("Trail enabled. Use \"/trail off\" to disable.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import com.earth2me.essentials.User;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
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;
|
||||||
@ -19,33 +22,20 @@ public class Command_unban extends FreedomCommand
|
|||||||
if (args.length > 0)
|
if (args.length > 0)
|
||||||
{
|
{
|
||||||
String username;
|
String username;
|
||||||
String ip;
|
final PlayerData entry = plugin.pl.getData(args[0]);
|
||||||
|
|
||||||
// Gets the IP using Essentials data if available
|
if (entry == null)
|
||||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
|
||||||
{
|
{
|
||||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||||
//
|
return true;
|
||||||
username = essUser.getName();
|
|
||||||
ip = essUser.getLastLoginAddress();
|
|
||||||
}
|
|
||||||
// Secondary method - using Essentials if available
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final PlayerData entry = plugin.pl.getData(args[0]);
|
|
||||||
if (entry == null)
|
|
||||||
{
|
|
||||||
msg(PLAYER_NOT_FOUND);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
username = entry.getName();
|
|
||||||
ip = entry.getIps().get(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
username = entry.getName();
|
||||||
|
final List<String> ips = new ArrayList<>(entry.getIps());
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Unbanning " + username, true);
|
FUtil.adminAction(sender.getName(), "Unbanning " + username, true);
|
||||||
|
msg(username + " has been unbanned along with the following IPs: " + StringUtils.join(ips, ", "));
|
||||||
plugin.bm.removeBan(plugin.bm.getByUsername(username));
|
plugin.bm.removeBan(plugin.bm.getByUsername(username));
|
||||||
plugin.bm.removeBan(plugin.bm.getByIp(ip));
|
|
||||||
msg(username + " has been unbanned along with the IP: " + ip);
|
|
||||||
|
|
||||||
if (args.length >= 2)
|
if (args.length >= 2)
|
||||||
{
|
{
|
||||||
@ -55,6 +45,20 @@ public class Command_unban extends FreedomCommand
|
|||||||
msg("Restored edits for: " + username);
|
msg("Restored edits for: " + username);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (String ip : ips)
|
||||||
|
{
|
||||||
|
Ban ban = plugin.bm.getByIp(ip);
|
||||||
|
if (ban != null)
|
||||||
|
{
|
||||||
|
plugin.bm.removeBan(ban);
|
||||||
|
}
|
||||||
|
ban = plugin.bm.getByIp(FUtil.getFuzzyIp(ip));
|
||||||
|
if (ban != null)
|
||||||
|
{
|
||||||
|
plugin.bm.removeBan(ban);
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -17,7 +17,7 @@ public class Command_unlinkdiscord extends FreedomCommand
|
|||||||
{
|
{
|
||||||
if (!plugin.dc.enabled)
|
if (!plugin.dc.enabled)
|
||||||
{
|
{
|
||||||
msg("The Discord integration system is currently disabled.", ChatColor.RED);
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ public class Command_unlinkdiscord extends FreedomCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
playerData.setDiscordID(null);
|
playerData.setDiscordID(null);
|
||||||
msg("Unlinked " + args[0] + "'s Discord account.", ChatColor.GREEN);
|
msg("Unlinked " + args[0] + "'s discord account.", ChatColor.GREEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,6 +42,7 @@ public class Command_unlinkdiscord extends FreedomCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
data.setDiscordID(null);
|
data.setDiscordID(null);
|
||||||
|
data.setVerification(false);
|
||||||
plugin.pl.save(data);
|
plugin.pl.save(data);
|
||||||
msg("Your Minecraft account has been successfully unlinked from the Discord account.", ChatColor.GREEN);
|
msg("Your Minecraft account has been successfully unlinked from the Discord account.", ChatColor.GREEN);
|
||||||
return true;
|
return true;
|
||||||
|
@ -45,7 +45,7 @@ public class Command_vanish extends FreedomCommand
|
|||||||
msg("You have unvanished.", ChatColor.GOLD);
|
msg("You have unvanished.", ChatColor.GOLD);
|
||||||
FUtil.bcastMsg(plugin.rm.craftLoginMessage(playerSender, null));
|
FUtil.bcastMsg(plugin.rm.craftLoginMessage(playerSender, null));
|
||||||
FUtil.bcastMsg(playerSender.getName() + " joined the game.", ChatColor.YELLOW);
|
FUtil.bcastMsg(playerSender.getName() + " joined the game.", ChatColor.YELLOW);
|
||||||
plugin.dc.messageChatChannel("**" + playerSender.getName() + " joined the server" + "**", true);
|
plugin.dc.messageChatChannel("**" + playerSender.getName() + " joined the server" + "**");
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerData playerData = plugin.pl.getData(playerSender);
|
PlayerData playerData = plugin.pl.getData(playerSender);
|
||||||
@ -91,7 +91,7 @@ public class Command_vanish extends FreedomCommand
|
|||||||
{
|
{
|
||||||
msg("You have vanished.", ChatColor.GOLD);
|
msg("You have vanished.", ChatColor.GOLD);
|
||||||
FUtil.bcastMsg(playerSender.getName() + " left the game.", ChatColor.YELLOW);
|
FUtil.bcastMsg(playerSender.getName() + " left the game.", ChatColor.YELLOW);
|
||||||
plugin.dc.messageChatChannel("**" + playerSender.getName() + " left the server" + "**", true);
|
plugin.dc.messageChatChannel("**" + playerSender.getName() + " left the server" + "**");
|
||||||
}
|
}
|
||||||
|
|
||||||
FLog.info(playerSender.getName() + " is now vanished.");
|
FLog.info(playerSender.getName() + " is now vanished.");
|
||||||
|
@ -0,0 +1,101 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||||
|
import me.totalfreedom.totalfreedommod.discord.Discord;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.IMPOSTOR, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Sends a verification code to the player, or the player can input the sent code. Admins can manually verify a player impostor.", usage = "/<command> <code | <playername>>")
|
||||||
|
public class Command_verify extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||||
|
if (!plugin.dc.enabled)
|
||||||
|
{
|
||||||
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!verificationEnabled)
|
||||||
|
{
|
||||||
|
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (senderIsConsole)
|
||||||
|
{
|
||||||
|
msg("/manuallyverify <playername>", ChatColor.WHITE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!plugin.pl.IsImpostor(playerSender))
|
||||||
|
{
|
||||||
|
msg("You are not an impostor, therefore you do not need to verify.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerData playerData = plugin.pl.getData(playerSender);
|
||||||
|
String discordId = playerData.getDiscordID();
|
||||||
|
|
||||||
|
if (playerData.getDiscordID() == null)
|
||||||
|
{
|
||||||
|
msg("You do not have a Discord account linked to your Minecraft account, please verify the manual way.", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length == 0)
|
||||||
|
{
|
||||||
|
String code = plugin.dc.generateCode(10);
|
||||||
|
plugin.dc.addVerificationCode(code, playerData);
|
||||||
|
plugin.dc.getUser(discordId).openPrivateChannel().complete().sendMessage("A user with the IP `" + FUtil.getIp(playerSender) + "` has sent a verification request. Please run the following in-game command: `/verify " + code + "`").complete();
|
||||||
|
msg("A verification code has been sent to your account, please copy the code and run /verify <code>", ChatColor.GREEN);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String code = args[0];
|
||||||
|
String backupCode = null;
|
||||||
|
|
||||||
|
if (plugin.pl.IsImpostor(playerSender))
|
||||||
|
{
|
||||||
|
PlayerData mapPlayer = plugin.dc.getVerificationCodes().get(code);
|
||||||
|
if (mapPlayer == null)
|
||||||
|
{
|
||||||
|
if (!playerData.getBackupCodes().contains(Discord.getMD5(code)))
|
||||||
|
{
|
||||||
|
msg("You have entered an invalid verification code", ChatColor.RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
backupCode = Discord.getMD5(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plugin.dc.removeVerificationCode(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
final FPlayer fPlayer = plugin.pl.getPlayer(playerSender);
|
||||||
|
if (fPlayer.getFreezeData().isFrozen())
|
||||||
|
{
|
||||||
|
fPlayer.getFreezeData().setFrozen(false);
|
||||||
|
msg("You have been unfrozen.");
|
||||||
|
}
|
||||||
|
FUtil.bcastMsg(playerSender.getName() + " has verified!", ChatColor.GOLD);
|
||||||
|
playerSender.setOp(true);
|
||||||
|
plugin.pl.verify(playerSender, backupCode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||||
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||||
|
@CommandParameters(description = "Verify an admin without giving them admin permissions.", usage = "/<command> <player>", aliases = "vns,verifynostaff,vna")
|
||||||
|
public class Command_verifynoadmin extends FreedomCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||||
|
{
|
||||||
|
if (args.length < 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = getPlayer(args[0]);
|
||||||
|
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
msg(PLAYER_NOT_FOUND);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.al.isAdminImpostor(player))
|
||||||
|
{
|
||||||
|
String ip = FUtil.getIp(player);
|
||||||
|
if (!plugin.al.verifiedNoAdmin.containsKey(player.getName()))
|
||||||
|
{
|
||||||
|
List<String> ips = new ArrayList<>();
|
||||||
|
ips.add(ip);
|
||||||
|
plugin.al.verifiedNoAdmin.put(player.getName(), ips);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
List<String> ips = plugin.al.verifiedNoAdmin.get(player.getName());
|
||||||
|
if (!ips.contains(ip))
|
||||||
|
{
|
||||||
|
ips.add(ip);
|
||||||
|
plugin.al.verifiedNoAdmin.remove(player.getName());
|
||||||
|
plugin.al.verifiedNoAdmin.put(player.getName(), ips);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
plugin.rm.updateDisplay(player);
|
||||||
|
FUtil.adminAction(sender.getName(), "Verified " + player.getName() + ", without admin permissions.", true);
|
||||||
|
player.setOp(true);
|
||||||
|
msg(player, YOU_ARE_OP);
|
||||||
|
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||||
|
if (fPlayer.getFreezeData().isFrozen())
|
||||||
|
{
|
||||||
|
fPlayer.getFreezeData().setFrozen(false);
|
||||||
|
msg(player, "You have been unfrozen.");
|
||||||
|
}
|
||||||
|
msg("Verified " + player.getName() + " but didn't give them admin permissions", ChatColor.GREEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg(player.getName() + " is not an admin imposter.", ChatColor.RED);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||||
|
{
|
||||||
|
if (args.length == 1)
|
||||||
|
{
|
||||||
|
List<String> adminImposters = new ArrayList<>();
|
||||||
|
for (Player player : server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (plugin.al.isAdminImpostor(player))
|
||||||
|
{
|
||||||
|
adminImposters.add(player.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adminImposters;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,6 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
|
||||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
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;
|
||||||
@ -56,28 +53,25 @@ public class Command_warn extends FreedomCommand
|
|||||||
|
|
||||||
String warnReason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
String warnReason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
||||||
player.sendTitle(ChatColor.RED + "You've been warned.", ChatColor.YELLOW + "Reason: " + warnReason, 20, 100, 60);
|
player.sendTitle(ChatColor.RED + "You've been warned.", ChatColor.YELLOW + "Reason: " + warnReason, 20, 100, 60);
|
||||||
msg(player, ChatColor.RED + "[WARNING] You received a warning from " + sender.getName() + ": " + warnReason);
|
msg(ChatColor.GREEN + "You have successfully warned " + player.getName());
|
||||||
plugin.pl.getPlayer(player).incrementWarnings(quiet);
|
|
||||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.WARN, warnReason));
|
|
||||||
|
|
||||||
if (quiet)
|
if (quiet)
|
||||||
{
|
{
|
||||||
msg("You have successfully warned " + player.getName() + " quietly.");
|
msg("Warned " + player.getName() + " quietly");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
String adminNotice = ChatColor.RED +
|
|
||||||
sender.getName() +
|
|
||||||
" - " +
|
|
||||||
"Warning: " +
|
|
||||||
player.getName() +
|
|
||||||
" - Reason: " +
|
|
||||||
ChatColor.YELLOW +
|
|
||||||
warnReason;
|
|
||||||
plugin.al.messageAllAdmins(adminNotice);
|
|
||||||
|
|
||||||
msg("You have successfully warned " + player.getName() + ".");
|
msg(player, ChatColor.RED + "[WARNING] You received a warning from " + sender.getName() + ": " + warnReason);
|
||||||
}
|
String adminNotice = ChatColor.RED +
|
||||||
|
sender.getName() +
|
||||||
|
" - " +
|
||||||
|
"Warning: " +
|
||||||
|
player.getName() +
|
||||||
|
" - Reason: " +
|
||||||
|
ChatColor.YELLOW +
|
||||||
|
warnReason;
|
||||||
|
plugin.al.messageAllAdmins(adminNotice);
|
||||||
|
plugin.pl.getPlayer(player).incrementWarnings();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,6 +5,7 @@ import java.util.Arrays;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.DepreciationAggregator;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@ -94,7 +95,7 @@ public class Command_whitelist extends FreedomCommand
|
|||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
{
|
{
|
||||||
player = server.getOfflinePlayer(search_name);
|
player = DepreciationAggregator.getOfflinePlayer(server, search_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
FUtil.adminAction(sender.getName(), "Adding " + player.getName() + " to the whitelist", false);
|
FUtil.adminAction(sender.getName(), "Adding " + player.getName() + " to the whitelist", false);
|
||||||
@ -116,7 +117,7 @@ public class Command_whitelist extends FreedomCommand
|
|||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
{
|
{
|
||||||
player = server.getOfflinePlayer(search_name);
|
player = DepreciationAggregator.getOfflinePlayer(server, search_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.isWhitelisted())
|
if (player.isWhitelisted())
|
||||||
@ -157,7 +158,7 @@ public class Command_whitelist extends FreedomCommand
|
|||||||
if (args[0].equalsIgnoreCase("purge"))
|
if (args[0].equalsIgnoreCase("purge"))
|
||||||
{
|
{
|
||||||
FUtil.adminAction(sender.getName(), "Removing all players from the whitelist", false);
|
FUtil.adminAction(sender.getName(), "Removing all players from the whitelist", false);
|
||||||
msg("Removed " + purge() + " players from the whitelist.");
|
msg("Removed " + plugin.si.purgeWhitelist() + " players from the whitelist.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -197,21 +198,10 @@ public class Command_whitelist extends FreedomCommand
|
|||||||
public List<String> getWhitelistedNames()
|
public List<String> getWhitelistedNames()
|
||||||
{
|
{
|
||||||
List<String> names = new ArrayList<>();
|
List<String> names = new ArrayList<>();
|
||||||
for (OfflinePlayer player : server.getWhitelistedPlayers())
|
for (Object name : plugin.si.getWhitelisted())
|
||||||
{
|
{
|
||||||
names.add(player.getName());
|
names.add(String.valueOf(name));
|
||||||
}
|
}
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int purge()
|
|
||||||
{
|
|
||||||
int removed = 0;
|
|
||||||
for (OfflinePlayer player : server.getWhitelistedPlayers())
|
|
||||||
{
|
|
||||||
player.setWhitelisted(false);
|
|
||||||
removed++;
|
|
||||||
}
|
|
||||||
return removed;
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,27 +1,33 @@
|
|||||||
package me.totalfreedom.totalfreedommod.command;
|
package me.totalfreedom.totalfreedommod.command;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
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.player.PlayerData;
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
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;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.command.*;
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandMap;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
|
import org.bukkit.command.PluginCommand;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.Plugin;
|
|
||||||
import org.bukkit.util.StringUtil;
|
import org.bukkit.util.StringUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||||
{
|
{
|
||||||
@ -34,6 +40,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
|||||||
public static final String NO_PERMISSION = ChatColor.RED + "You do not have permission to execute this command.";
|
public static final String NO_PERMISSION = ChatColor.RED + "You do not have permission to execute this command.";
|
||||||
public static final Timer timer = new Timer();
|
public static final Timer timer = new Timer();
|
||||||
public static final Map<CommandSender, FreedomCommand> COOLDOWN_TIMERS = new HashMap<>();
|
public static final Map<CommandSender, FreedomCommand> COOLDOWN_TIMERS = new HashMap<>();
|
||||||
|
private static CommandMap commandMap;
|
||||||
protected final TotalFreedomMod plugin = TotalFreedomMod.getPlugin();
|
protected final TotalFreedomMod plugin = TotalFreedomMod.getPlugin();
|
||||||
protected final Server server = plugin.getServer();
|
protected final Server server = plugin.getServer();
|
||||||
private final String name;
|
private final String name;
|
||||||
@ -62,22 +69,34 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
|||||||
this.cooldown = perms.cooldown();
|
this.cooldown = perms.cooldown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static CommandMap getCommandMap()
|
||||||
|
{
|
||||||
|
if (commandMap == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final Field f = Bukkit.getServer().getPluginManager().getClass().getDeclaredField("commandMap");
|
||||||
|
f.setAccessible(true);
|
||||||
|
commandMap = (CommandMap)f.get(Bukkit.getServer().getPluginManager());
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return commandMap;
|
||||||
|
}
|
||||||
|
|
||||||
public static FreedomCommand getFrom(Command command)
|
public static FreedomCommand getFrom(Command command)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (command instanceof FCommand)
|
return (FreedomCommand)(((PluginCommand)command).getExecutor());
|
||||||
{
|
|
||||||
return ((FCommand) command).getExecutor();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
FLog.severe(ex);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getCommandPrefix()
|
public static String getCommandPrefix()
|
||||||
@ -100,7 +119,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
|||||||
{
|
{
|
||||||
cmd.setUsage(this.usage);
|
cmd.setUsage(this.usage);
|
||||||
}
|
}
|
||||||
server.getCommandMap().register("totalfreedommod", cmd);
|
getCommandMap().register("totalfreedommod", cmd);
|
||||||
cmd.setExecutor(this);
|
cmd.setExecutor(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,16 +246,6 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
|||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected OfflinePlayer getOfflinePlayer(String name)
|
|
||||||
{
|
|
||||||
return Arrays.stream(Bukkit.getOfflinePlayers())
|
|
||||||
.filter(player -> player.getName() != null)
|
|
||||||
.filter(player -> player.getName().equalsIgnoreCase(name))
|
|
||||||
.findFirst()
|
|
||||||
.orElse(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Admin getAdmin(CommandSender sender)
|
protected Admin getAdmin(CommandSender sender)
|
||||||
{
|
{
|
||||||
return plugin.al.getAdmin(sender);
|
return plugin.al.getAdmin(sender);
|
||||||
@ -307,7 +316,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
|||||||
return perms;
|
return perms;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class FCommand extends Command implements PluginIdentifiableCommand
|
private final class FCommand extends Command
|
||||||
{
|
{
|
||||||
private FreedomCommand cmd = null;
|
private FreedomCommand cmd = null;
|
||||||
|
|
||||||
@ -316,11 +325,6 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
|||||||
super(command);
|
super(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final FreedomCommand getExecutor()
|
|
||||||
{
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExecutor(FreedomCommand cmd)
|
public void setExecutor(FreedomCommand cmd)
|
||||||
{
|
{
|
||||||
this.cmd = cmd;
|
this.cmd = cmd;
|
||||||
@ -423,11 +427,5 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
|||||||
}
|
}
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull Plugin getPlugin()
|
|
||||||
{
|
|
||||||
return plugin;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -25,6 +25,8 @@ public enum ConfigEntry
|
|||||||
ALLOW_BELLS(Boolean.class, "allow.bells"),
|
ALLOW_BELLS(Boolean.class, "allow.bells"),
|
||||||
ALLOW_ARMOR_STANDS(Boolean.class, "allow.armorstands"),
|
ALLOW_ARMOR_STANDS(Boolean.class, "allow.armorstands"),
|
||||||
ALLOW_MINECARTS(Boolean.class, "allow.minecarts"),
|
ALLOW_MINECARTS(Boolean.class, "allow.minecarts"),
|
||||||
|
ALLOW_STRUCTURE_BLOCKS(Boolean.class, "allow.structureblocks"),
|
||||||
|
ALLOW_JIGSAWS(Boolean.class, "allow.jigsaws"),
|
||||||
ALLOW_GRINDSTONES(Boolean.class, "allow.grindstones"),
|
ALLOW_GRINDSTONES(Boolean.class, "allow.grindstones"),
|
||||||
ALLOW_JUKEBOXES(Boolean.class, "allow.jukeboxes"),
|
ALLOW_JUKEBOXES(Boolean.class, "allow.jukeboxes"),
|
||||||
ALLOW_SPAWNERS(Boolean.class, "allow.spawners"),
|
ALLOW_SPAWNERS(Boolean.class, "allow.spawners"),
|
||||||
@ -33,7 +35,6 @@ public enum ConfigEntry
|
|||||||
AUTO_TP(Boolean.class, "allow.auto_tp"),
|
AUTO_TP(Boolean.class, "allow.auto_tp"),
|
||||||
AUTO_CLEAR(Boolean.class, "allow.auto_clear"),
|
AUTO_CLEAR(Boolean.class, "allow.auto_clear"),
|
||||||
ALLOW_GRAVITY(Boolean.class, "allow.gravity"),
|
ALLOW_GRAVITY(Boolean.class, "allow.gravity"),
|
||||||
ALLOW_MASTERBLOCKS(Boolean.class, "allow.masterblocks"),
|
|
||||||
//
|
//
|
||||||
BLOCKED_CHATCODES(String.class, "blocked_chatcodes"),
|
BLOCKED_CHATCODES(String.class, "blocked_chatcodes"),
|
||||||
//
|
//
|
||||||
@ -44,8 +45,6 @@ public enum ConfigEntry
|
|||||||
MOB_LIMITER_DISABLE_GIANT(Boolean.class, "moblimiter.disable.giant"),
|
MOB_LIMITER_DISABLE_GIANT(Boolean.class, "moblimiter.disable.giant"),
|
||||||
MOB_LIMITER_DISABLE_SLIME(Boolean.class, "moblimiter.disable.slime"),
|
MOB_LIMITER_DISABLE_SLIME(Boolean.class, "moblimiter.disable.slime"),
|
||||||
//
|
//
|
||||||
SPAWNMOB_MAX(Integer.class, "spawnmob.max"),
|
|
||||||
//
|
|
||||||
HTTPD_ENABLED(Boolean.class, "httpd.enabled"),
|
HTTPD_ENABLED(Boolean.class, "httpd.enabled"),
|
||||||
HTTPD_HOST(String.class, "httpd.host"),
|
HTTPD_HOST(String.class, "httpd.host"),
|
||||||
HTTPD_PORT(Integer.class, "httpd.port"),
|
HTTPD_PORT(Integer.class, "httpd.port"),
|
||||||
@ -72,10 +71,9 @@ public enum ConfigEntry
|
|||||||
SERVER_WHITELIST_MOTD(String.class, "server.motds.whitelist"),
|
SERVER_WHITELIST_MOTD(String.class, "server.motds.whitelist"),
|
||||||
SERVER_FULL_MOTD(String.class, "server.motds.full"),
|
SERVER_FULL_MOTD(String.class, "server.motds.full"),
|
||||||
//
|
//
|
||||||
|
DISCORD_VERIFICATION(Boolean.class, "discord.verification"),
|
||||||
DISCORD_TOKEN(String.class, "discord.token"),
|
DISCORD_TOKEN(String.class, "discord.token"),
|
||||||
DISCORD_PREFIX(String.class, "discord.prefix"),
|
|
||||||
DISCORD_REPORT_CHANNEL_ID(String.class, "discord.report_channel_id"),
|
DISCORD_REPORT_CHANNEL_ID(String.class, "discord.report_channel_id"),
|
||||||
DISCORD_REPORT_ARCHIVE_CHANNEL_ID(String.class, "discord.report_archive_channel_id"),
|
|
||||||
DISCORD_CHAT_CHANNEL_ID(String.class, "discord.chat_channel_id"),
|
DISCORD_CHAT_CHANNEL_ID(String.class, "discord.chat_channel_id"),
|
||||||
DISCORD_ADMINCHAT_CHANNEL_ID(String.class, "discord.adminchat_channel_id"),
|
DISCORD_ADMINCHAT_CHANNEL_ID(String.class, "discord.adminchat_channel_id"),
|
||||||
|
|
||||||
@ -88,7 +86,6 @@ public enum ConfigEntry
|
|||||||
DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID(String.class, "discord.assistant_executive_role_id"),
|
DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID(String.class, "discord.assistant_executive_role_id"),
|
||||||
DISCORD_EXECUTIVE_ROLE_ID(String.class, "discord.executive_role_id"),
|
DISCORD_EXECUTIVE_ROLE_ID(String.class, "discord.executive_role_id"),
|
||||||
DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"),
|
DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"),
|
||||||
DISCORD_INVITE_LINK(String.class, "discord.invite_link"),
|
|
||||||
//
|
//
|
||||||
PTERO_URL(String.class, "ptero.url"),
|
PTERO_URL(String.class, "ptero.url"),
|
||||||
PTERO_DEFAULT_EMAIL_DOMAIN(String.class, "ptero.default_email_domain"),
|
PTERO_DEFAULT_EMAIL_DOMAIN(String.class, "ptero.default_email_domain"),
|
||||||
@ -113,7 +110,6 @@ public enum ConfigEntry
|
|||||||
SHOP_PRICES_STACKING_POTATO(Integer.class, "shop.prices.stacking_potato"),
|
SHOP_PRICES_STACKING_POTATO(Integer.class, "shop.prices.stacking_potato"),
|
||||||
SHOP_PRICES_CLOWN_FISH(Integer.class, "shop.prices.clown_fish"),
|
SHOP_PRICES_CLOWN_FISH(Integer.class, "shop.prices.clown_fish"),
|
||||||
SHOP_PRICES_LOGIN_MESSAGES(Integer.class, "shop.prices.login_messages"),
|
SHOP_PRICES_LOGIN_MESSAGES(Integer.class, "shop.prices.login_messages"),
|
||||||
SHOP_PRICES_RAINBOW_TRAIL(Integer.class, "shop.prices.rainbow_trail"),
|
|
||||||
//
|
//
|
||||||
ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"),
|
ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"),
|
||||||
ADMINLIST_CONSOLE_IS_ADMIN(Boolean.class, "adminlist.console_is_admin"),
|
ADMINLIST_CONSOLE_IS_ADMIN(Boolean.class, "adminlist.console_is_admin"),
|
||||||
@ -169,8 +165,6 @@ public enum ConfigEntry
|
|||||||
ADMIN_INFO(List.class, "admininfo"),
|
ADMIN_INFO(List.class, "admininfo"),
|
||||||
VOTING_INFO(List.class, "votinginfo"),
|
VOTING_INFO(List.class, "votinginfo"),
|
||||||
MASTER_BUILDER_INFO(List.class, "masterbuilderinfo"),
|
MASTER_BUILDER_INFO(List.class, "masterbuilderinfo"),
|
||||||
FIRST_JOIN_INFO(List.class, "first_join_info.text"),
|
|
||||||
FIRST_JOIN_INFO_ENABLED(Boolean.class, "first_join_info.enabled"),
|
|
||||||
AUTO_ENTITY_WIPE(Boolean.class, "auto_wipe"),
|
AUTO_ENTITY_WIPE(Boolean.class, "auto_wipe"),
|
||||||
TOGGLE_CHAT(Boolean.class, "toggle_chat"),
|
TOGGLE_CHAT(Boolean.class, "toggle_chat"),
|
||||||
DEVELOPER_MODE(Boolean.class, "developer_mode"),
|
DEVELOPER_MODE(Boolean.class, "developer_mode"),
|
||||||
|
@ -1,24 +1,28 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord;
|
package me.totalfreedom.totalfreedommod.discord;
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.SplittableRandom;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import javax.security.auth.login.LoginException;
|
import javax.security.auth.login.LoginException;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
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.discord.command.DiscordCommandManager;
|
|
||||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.JDA;
|
import net.dv8tion.jda.api.JDA;
|
||||||
import net.dv8tion.jda.api.JDABuilder;
|
import net.dv8tion.jda.api.JDABuilder;
|
||||||
@ -37,12 +41,10 @@ import net.dv8tion.jda.api.requests.GatewayIntent;
|
|||||||
import net.dv8tion.jda.api.utils.ChunkingFilter;
|
import net.dv8tion.jda.api.utils.ChunkingFilter;
|
||||||
import net.dv8tion.jda.api.utils.MemberCachePolicy;
|
import net.dv8tion.jda.api.utils.MemberCachePolicy;
|
||||||
import net.dv8tion.jda.internal.utils.concurrent.CountingThreadFactory;
|
import net.dv8tion.jda.internal.utils.concurrent.CountingThreadFactory;
|
||||||
import net.kyori.adventure.text.Component;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.lang.WordUtils;
|
import org.apache.commons.lang.WordUtils;
|
||||||
import org.apache.commons.lang3.RandomStringUtils;
|
|
||||||
import org.bukkit.GameRule;
|
import org.bukkit.GameRule;
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
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;
|
||||||
@ -55,12 +57,17 @@ public class Discord extends FreedomService
|
|||||||
{
|
{
|
||||||
|
|
||||||
public static HashMap<String, PlayerData> LINK_CODES = new HashMap<>();
|
public static HashMap<String, PlayerData> LINK_CODES = new HashMap<>();
|
||||||
|
public static HashMap<String, PlayerData> VERIFICATION_CODES = new HashMap<>();
|
||||||
public static JDA bot = null;
|
public static JDA bot = null;
|
||||||
public static DiscordCommandManager DISCORD_COMMAND_MANAGER;
|
|
||||||
public ScheduledThreadPoolExecutor RATELIMIT_EXECUTOR;
|
public ScheduledThreadPoolExecutor RATELIMIT_EXECUTOR;
|
||||||
public List<CompletableFuture<Message>> sentMessages = new ArrayList<>();
|
public List<CompletableFuture<Message>> sentMessages = new ArrayList<>();
|
||||||
public Boolean enabled = false;
|
public Boolean enabled = false;
|
||||||
private static final ImmutableList<String> DISCORD_SUBDOMAINS = ImmutableList.of("discordapp.com", "discord.com", "discord.gg");
|
private final Pattern DISCORD_MENTION_PATTERN = Pattern.compile("(<@!?([0-9]{16,20})>)");
|
||||||
|
|
||||||
|
public static String getMD5(String string)
|
||||||
|
{
|
||||||
|
return DigestUtils.md5Hex(string);
|
||||||
|
}
|
||||||
|
|
||||||
public static String getCode(PlayerData playerData)
|
public static String getCode(PlayerData playerData)
|
||||||
{
|
{
|
||||||
@ -150,8 +157,11 @@ public class Discord extends FreedomService
|
|||||||
|
|
||||||
public void startBot()
|
public void startBot()
|
||||||
{
|
{
|
||||||
DISCORD_COMMAND_MANAGER = new DiscordCommandManager();
|
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||||
DISCORD_COMMAND_MANAGER.init(this);
|
if (!verificationEnabled)
|
||||||
|
{
|
||||||
|
FLog.info("Discord Verification has been manually disabled.");
|
||||||
|
}
|
||||||
|
|
||||||
enabled = !Strings.isNullOrEmpty(ConfigEntry.DISCORD_TOKEN.getString());
|
enabled = !Strings.isNullOrEmpty(ConfigEntry.DISCORD_TOKEN.getString());
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
@ -175,7 +185,6 @@ public class Discord extends FreedomService
|
|||||||
.addEventListeners(new PrivateMessageListener(),
|
.addEventListeners(new PrivateMessageListener(),
|
||||||
new DiscordToMinecraftListener(),
|
new DiscordToMinecraftListener(),
|
||||||
new DiscordToAdminChatListener(),
|
new DiscordToAdminChatListener(),
|
||||||
new MessageReactionListener(),
|
|
||||||
new ListenerAdapter()
|
new ListenerAdapter()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
@ -190,20 +199,20 @@ public class Discord extends FreedomService
|
|||||||
.setMemberCachePolicy(MemberCachePolicy.ALL)
|
.setMemberCachePolicy(MemberCachePolicy.ALL)
|
||||||
.enableIntents(GatewayIntent.GUILD_MEMBERS)
|
.enableIntents(GatewayIntent.GUILD_MEMBERS)
|
||||||
.build();
|
.build();
|
||||||
FLog.info("Discord integration has successfully enabled!");
|
FLog.info("Discord verification bot has successfully enabled!");
|
||||||
}
|
}
|
||||||
catch (LoginException e)
|
catch (LoginException e)
|
||||||
{
|
{
|
||||||
FLog.warning("An invalid token for Discord integration was provided, the bot will not enable.");
|
FLog.warning("An invalid token for the discord verification bot, the bot will not enable.");
|
||||||
}
|
}
|
||||||
catch (IllegalArgumentException e)
|
catch (IllegalArgumentException e)
|
||||||
{
|
{
|
||||||
FLog.warning("Discord integration failed to start.");
|
FLog.warning("Discord verification bot failed to start.");
|
||||||
}
|
}
|
||||||
catch (NoClassDefFoundError e)
|
catch (NoClassDefFoundError e)
|
||||||
{
|
{
|
||||||
FLog.warning("The JDA plugin is not installed, therefore the discord bot cannot start.");
|
FLog.warning("The JDA plugin is not installed, therefore the discord bot cannot start.");
|
||||||
FLog.warning("To resolve this error, please download the latest JDA from: https://github.com/AtlasMediaGroup/Minecraft-JDA/releases");
|
FLog.warning("To resolve this error, please download the latest JDA from: https://github.com/TFPatches/Minecraft-JDA/releases");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -223,7 +232,7 @@ public class Discord extends FreedomService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
sentMessages.clear();
|
sentMessages.clear();
|
||||||
messageChatChannel("**Message queue cleared**", true);
|
messageChatChannel("**Message queue cleared**");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendPteroInfo(PlayerData playerData, String username, String password)
|
public void sendPteroInfo(PlayerData playerData, String username, String password)
|
||||||
@ -252,9 +261,96 @@ public class Discord extends FreedomService
|
|||||||
return member.getUser();
|
return member.getUser();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean sendBackupCodes(PlayerData playerData)
|
||||||
|
{
|
||||||
|
List<String> codes = generateBackupCodes();
|
||||||
|
List<String> encryptedCodes = generateEncryptedBackupCodes(codes);
|
||||||
|
User user = getUser(playerData.getDiscordID());
|
||||||
|
File file = generateBackupCodesFile(playerData.getName(), codes);
|
||||||
|
if (file == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
PrivateChannel privateChannel = user.openPrivateChannel().complete();
|
||||||
|
privateChannel.sendMessage("Do not share these codes with anyone as they can be used to impose as you.").addFile(file).complete();
|
||||||
|
playerData.setBackupCodes(encryptedCodes);
|
||||||
|
plugin.pl.save(playerData);
|
||||||
|
//noinspection ResultOfMethodCallIgnored
|
||||||
|
file.delete();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> generateBackupCodes()
|
||||||
|
{
|
||||||
|
List<String> codes = new ArrayList<>();
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
codes.add(FUtil.randomAlphanumericString(10));
|
||||||
|
}
|
||||||
|
return codes;
|
||||||
|
}
|
||||||
|
|
||||||
public String generateCode(int size)
|
public String generateCode(int size)
|
||||||
{
|
{
|
||||||
return RandomStringUtils.randomNumeric(size);
|
StringBuilder code = new StringBuilder();
|
||||||
|
SplittableRandom random = new SplittableRandom();
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
code.append(random.nextInt(10));
|
||||||
|
}
|
||||||
|
return code.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> generateEncryptedBackupCodes(List<String> codes)
|
||||||
|
{
|
||||||
|
List<String> encryptedCodes = new ArrayList<>();
|
||||||
|
for (String code : codes)
|
||||||
|
{
|
||||||
|
encryptedCodes.add(getMD5(code));
|
||||||
|
}
|
||||||
|
return encryptedCodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File generateBackupCodesFile(String name, List<String> codes)
|
||||||
|
{
|
||||||
|
StringBuilder text = new StringBuilder();
|
||||||
|
text.append("Below are your backup codes for use on TotalFreedom in the event you lose access to your discord account.\n")
|
||||||
|
.append("Simply pick a code, and run /verify <code> on the server. Each code is one use, so be sure to cross it off once you use it.\n")
|
||||||
|
.append("To generate new codes, simply run /generatebackupcodes\n\n");
|
||||||
|
|
||||||
|
for (String code : codes)
|
||||||
|
{
|
||||||
|
text.append(code).append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
String fileUrl = plugin.getDataFolder().getAbsolutePath() + "/TF-Backup-Codes-" + name + ".txt";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileWriter fileWriter = new FileWriter(fileUrl);
|
||||||
|
fileWriter.write(text.toString());
|
||||||
|
fileWriter.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
FLog.severe("Failed to generate backup codes file: " + e.toString());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new File(fileUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addVerificationCode(String code, PlayerData playerData)
|
||||||
|
{
|
||||||
|
VERIFICATION_CODES.put(code, playerData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVerificationCode(String code)
|
||||||
|
{
|
||||||
|
VERIFICATION_CODES.remove(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap<String, PlayerData> getVerificationCodes()
|
||||||
|
{
|
||||||
|
return VERIFICATION_CODES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
@ -267,11 +363,9 @@ public class Discord extends FreedomService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Component deathMessage = event.deathMessage();
|
if (event.getDeathMessage() != null)
|
||||||
|
|
||||||
if (deathMessage != null)
|
|
||||||
{
|
{
|
||||||
messageChatChannel("**" + deformat(PlainTextComponentSerializer.plainText().serialize(deathMessage)) + "**", true);
|
messageChatChannel("**" + event.getDeathMessage() + "**");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,7 +380,7 @@ public class Discord extends FreedomService
|
|||||||
{
|
{
|
||||||
if (!plugin.al.isVanished(event.getPlayer().getName()))
|
if (!plugin.al.isVanished(event.getPlayer().getName()))
|
||||||
{
|
{
|
||||||
messageChatChannel("**" + deformat(event.getPlayer().getName()) + " joined the server" + "**", true);
|
messageChatChannel("**" + event.getPlayer().getName() + " joined the server" + "**");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,77 +389,74 @@ public class Discord extends FreedomService
|
|||||||
{
|
{
|
||||||
if (!plugin.al.isVanished(event.getPlayer().getName()))
|
if (!plugin.al.isVanished(event.getPlayer().getName()))
|
||||||
{
|
{
|
||||||
messageChatChannel("**" + deformat(event.getPlayer().getName()) + " left the server" + "**", true);
|
messageChatChannel("**" + event.getPlayer().getName() + " left the server" + "**");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String sanitizeChatMessage(String message)
|
|
||||||
{
|
|
||||||
String newMessage = message;
|
|
||||||
|
|
||||||
if (message.contains("@"))
|
|
||||||
{
|
|
||||||
// \u200B is Zero Width Space, invisible on Discord
|
|
||||||
newMessage = message.replaceAll("@", "@\u200B");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.toLowerCase().contains("discord.gg")) // discord.gg/invite works as an invite
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String subdomain : DISCORD_SUBDOMAINS)
|
|
||||||
{
|
|
||||||
if (message.toLowerCase().contains(subdomain + "/invite"))
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.contains("§"))
|
|
||||||
{
|
|
||||||
newMessage = message.replaceAll("§", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
return deformat(newMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void messageChatChannel(String message)
|
public void messageChatChannel(String message)
|
||||||
{
|
|
||||||
messageChatChannel(message, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void messageChatChannel(String message, boolean system)
|
|
||||||
{
|
{
|
||||||
String chat_channel_id = ConfigEntry.DISCORD_CHAT_CHANNEL_ID.getString();
|
String chat_channel_id = ConfigEntry.DISCORD_CHAT_CHANNEL_ID.getString();
|
||||||
|
if (message.contains("@everyone") || message.contains("@here"))
|
||||||
|
{
|
||||||
|
message = StringUtils.remove(message, "@");
|
||||||
|
}
|
||||||
|
|
||||||
String sanitizedMessage = (system) ? message : sanitizeChatMessage(message);
|
if (message.toLowerCase().contains("discord.gg"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (sanitizedMessage.isBlank()) return;
|
if (message.contains("§"))
|
||||||
|
{
|
||||||
|
message = StringUtils.remove(message, "§");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Matcher DISCORD_MENTION_MATCHER = DISCORD_MENTION_PATTERN.matcher(message);
|
||||||
|
|
||||||
|
while (DISCORD_MENTION_MATCHER.find())
|
||||||
|
{
|
||||||
|
String mention = DISCORD_MENTION_MATCHER.group(1);
|
||||||
|
message = message.replace(mention, mention.replace("@",""));
|
||||||
|
}
|
||||||
|
|
||||||
if (enabled && !chat_channel_id.isEmpty())
|
if (enabled && !chat_channel_id.isEmpty())
|
||||||
{
|
{
|
||||||
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(sanitizedMessage).submit(true);
|
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(deformat(message)).submit(true);
|
||||||
sentMessages.add(sentMessage);
|
sentMessages.add(sentMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void messageAdminChatChannel(String message)
|
public void messageAdminChatChannel(String message)
|
||||||
{
|
|
||||||
messageAdminChatChannel(message, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void messageAdminChatChannel(String message, boolean system)
|
|
||||||
{
|
{
|
||||||
String chat_channel_id = ConfigEntry.DISCORD_ADMINCHAT_CHANNEL_ID.getString();
|
String chat_channel_id = ConfigEntry.DISCORD_ADMINCHAT_CHANNEL_ID.getString();
|
||||||
|
if (message.contains("@everyone") || message.contains("@here"))
|
||||||
|
{
|
||||||
|
message = StringUtils.remove(message, "@");
|
||||||
|
}
|
||||||
|
|
||||||
String sanitizedMessage = sanitizeChatMessage(message);
|
if (message.toLowerCase().contains("discord.gg"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (sanitizedMessage.isBlank()) return;
|
if (message.contains("§"))
|
||||||
|
{
|
||||||
|
message = StringUtils.remove(message, "§");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Matcher DISCORD_MENTION_MATCHER = DISCORD_MENTION_PATTERN.matcher(message);
|
||||||
|
|
||||||
|
while (DISCORD_MENTION_MATCHER.find())
|
||||||
|
{
|
||||||
|
String mention = DISCORD_MENTION_MATCHER.group(1);
|
||||||
|
message = message.replace(mention, mention.replace("@",""));
|
||||||
|
}
|
||||||
|
|
||||||
if (enabled && !chat_channel_id.isEmpty())
|
if (enabled && !chat_channel_id.isEmpty())
|
||||||
{
|
{
|
||||||
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(sanitizedMessage).submit(true);
|
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(deformat(message)).submit(true);
|
||||||
sentMessages.add(sentMessage);
|
sentMessages.add(sentMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -373,7 +464,7 @@ public class Discord extends FreedomService
|
|||||||
public String formatBotTag()
|
public String formatBotTag()
|
||||||
{
|
{
|
||||||
SelfUser user = bot.getSelfUser();
|
SelfUser user = bot.getSelfUser();
|
||||||
return user.getAsTag();
|
return user.getName() + "#" + user.getDiscriminator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -381,18 +472,18 @@ public class Discord extends FreedomService
|
|||||||
{
|
{
|
||||||
if (bot != null)
|
if (bot != null)
|
||||||
{
|
{
|
||||||
messageChatChannel("**Server has stopped**", true);
|
messageChatChannel("**Server has stopped**");
|
||||||
}
|
}
|
||||||
|
|
||||||
FLog.info("Discord integration has successfully shutdown.");
|
FLog.info("Discord verification bot has successfully shutdown.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String deformat(String input)
|
public String deformat(String input)
|
||||||
{
|
{
|
||||||
return input.replaceAll("([_\\\\`*>|])", "\\\\$1");
|
return input.replace("_", "\\_");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldISendReport()
|
public boolean sendReport(Player reporter, Player reported, String reason)
|
||||||
{
|
{
|
||||||
if (ConfigEntry.DISCORD_REPORT_CHANNEL_ID.getString().isEmpty())
|
if (ConfigEntry.DISCORD_REPORT_CHANNEL_ID.getString().isEmpty())
|
||||||
{
|
{
|
||||||
@ -407,7 +498,6 @@ public class Discord extends FreedomService
|
|||||||
|
|
||||||
Guild server = bot.getGuildById(ConfigEntry.DISCORD_SERVER_ID.getString());
|
Guild server = bot.getGuildById(ConfigEntry.DISCORD_SERVER_ID.getString());
|
||||||
if (server == null)
|
if (server == null)
|
||||||
|
|
||||||
{
|
{
|
||||||
FLog.severe("The Discord server ID specified is invalid, or the bot is not on the server.");
|
FLog.severe("The Discord server ID specified is invalid, or the bot is not on the server.");
|
||||||
return false;
|
return false;
|
||||||
@ -420,83 +510,7 @@ public class Discord extends FreedomService
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||||
}
|
|
||||||
|
|
||||||
public boolean sendReportOffline(Player reporter, OfflinePlayer reported, String reason)
|
|
||||||
{
|
|
||||||
if (!shouldISendReport())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Guild server = bot.getGuildById(ConfigEntry.DISCORD_SERVER_ID.getString());
|
|
||||||
|
|
||||||
if (server == null)
|
|
||||||
{
|
|
||||||
FLog.severe("The guild ID specified in the config is invalid.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final TextChannel channel = server.getTextChannelById(ConfigEntry.DISCORD_REPORT_CHANNEL_ID.getString());
|
|
||||||
|
|
||||||
if (channel == null)
|
|
||||||
{
|
|
||||||
FLog.severe("The report channel ID specified in the config is invalid.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final EmbedBuilder embedBuilder = new EmbedBuilder();
|
|
||||||
embedBuilder.setTitle("Report for " + reported.getName() + " (offline)");
|
|
||||||
embedBuilder.setDescription(reason);
|
|
||||||
embedBuilder.setFooter("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png");
|
|
||||||
embedBuilder.setTimestamp(Instant.from(ZonedDateTime.now()));
|
|
||||||
if (plugin.esb.isEnabled())
|
|
||||||
{
|
|
||||||
com.earth2me.essentials.User user = plugin.esb.getEssentialsUser(reported.getName());
|
|
||||||
String location = "World: " + Objects.requireNonNull(user.getLastLocation().getWorld()).getName() + ", X: " + user.getLastLocation().getBlockX() + ", Y: " + user.getLastLocation().getBlockY() + ", Z: " + user.getLastLocation().getBlockZ();
|
|
||||||
embedBuilder.addField("Location", location, true);
|
|
||||||
embedBuilder.addField("God Mode", WordUtils.capitalizeFully(String.valueOf(user.isGodModeEnabled())), true);
|
|
||||||
if (user.getNickname() != null)
|
|
||||||
{
|
|
||||||
embedBuilder.addField("Nickname", user.getNickname(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MessageEmbed embed = embedBuilder.build();
|
|
||||||
Message message = channel.sendMessageEmbeds(embed).complete();
|
|
||||||
|
|
||||||
if (!ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString().isEmpty())
|
|
||||||
{
|
|
||||||
message.addReaction("\uD83D\uDCCB").complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean sendReport(Player reporter, Player reported, String reason)
|
|
||||||
{
|
|
||||||
if (!shouldISendReport())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Guild server = bot.getGuildById(ConfigEntry.DISCORD_SERVER_ID.getString());
|
|
||||||
|
|
||||||
if (server == null)
|
|
||||||
{
|
|
||||||
FLog.severe("The guild ID specified in the config is invalid.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final TextChannel channel = server.getTextChannelById(ConfigEntry.DISCORD_REPORT_CHANNEL_ID.getString());
|
|
||||||
|
|
||||||
if (channel == null)
|
|
||||||
{
|
|
||||||
FLog.severe("The report channel ID specified in the config is invalid.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final EmbedBuilder embedBuilder = new EmbedBuilder();
|
|
||||||
embedBuilder.setTitle("Report for " + reported.getName());
|
embedBuilder.setTitle("Report for " + reported.getName());
|
||||||
embedBuilder.setDescription(reason);
|
embedBuilder.setDescription(reason);
|
||||||
embedBuilder.setFooter("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png");
|
embedBuilder.setFooter("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png");
|
||||||
@ -504,25 +518,14 @@ public class Discord extends FreedomService
|
|||||||
String location = "World: " + Objects.requireNonNull(reported.getLocation().getWorld()).getName() + ", X: " + reported.getLocation().getBlockX() + ", Y: " + reported.getLocation().getBlockY() + ", Z: " + reported.getLocation().getBlockZ();
|
String location = "World: " + Objects.requireNonNull(reported.getLocation().getWorld()).getName() + ", X: " + reported.getLocation().getBlockX() + ", Y: " + reported.getLocation().getBlockY() + ", Z: " + reported.getLocation().getBlockZ();
|
||||||
embedBuilder.addField("Location", location, true);
|
embedBuilder.addField("Location", location, true);
|
||||||
embedBuilder.addField("Game Mode", WordUtils.capitalizeFully(reported.getGameMode().name()), true);
|
embedBuilder.addField("Game Mode", WordUtils.capitalizeFully(reported.getGameMode().name()), true);
|
||||||
|
com.earth2me.essentials.User user = plugin.esb.getEssentialsUser(reported.getName());
|
||||||
if (plugin.esb.isEnabled())
|
embedBuilder.addField("God Mode", WordUtils.capitalizeFully(String.valueOf(user.isGodModeEnabled())), true);
|
||||||
|
if (user.getNickname() != null)
|
||||||
{
|
{
|
||||||
com.earth2me.essentials.User user = plugin.esb.getEssentialsUser(reported.getName());
|
embedBuilder.addField("Nickname", user.getNickname(), true);
|
||||||
embedBuilder.addField("God Mode", WordUtils.capitalizeFully(String.valueOf(user.isGodModeEnabled())), true);
|
|
||||||
if (user.getNickname() != null)
|
|
||||||
{
|
|
||||||
embedBuilder.addField("Nickname", user.getNickname(), true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageEmbed embed = embedBuilder.build();
|
MessageEmbed embed = embedBuilder.build();
|
||||||
Message message = channel.sendMessageEmbeds(embed).complete();
|
channel.sendMessage(embed).complete();
|
||||||
|
|
||||||
if (!ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString().isEmpty())
|
|
||||||
{
|
|
||||||
message.addReaction("\uD83D\uDCCB").complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -531,7 +534,7 @@ public class Discord extends FreedomService
|
|||||||
{
|
{
|
||||||
public void start()
|
public void start()
|
||||||
{
|
{
|
||||||
messageChatChannel("**Server has started**", true);
|
messageChatChannel("**Server has started**");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,16 +5,14 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||||
import me.totalfreedom.totalfreedommod.rank.Title;
|
import me.totalfreedom.totalfreedommod.rank.Title;
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
import net.dv8tion.jda.api.entities.*;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||||
import net.md_5.bungee.api.chat.BaseComponent;
|
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||||
import net.md_5.bungee.api.chat.HoverEvent;
|
|
||||||
import net.md_5.bungee.api.chat.TextComponent;
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
|
||||||
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;
|
||||||
@ -23,108 +21,50 @@ public class DiscordToMinecraftListener extends ListenerAdapter
|
|||||||
{
|
{
|
||||||
public void onMessageReceived(MessageReceivedEvent event)
|
public void onMessageReceived(MessageReceivedEvent event)
|
||||||
{
|
{
|
||||||
final String chat_channel_id = ConfigEntry.DISCORD_CHAT_CHANNEL_ID.getString();
|
String chat_channel_id = ConfigEntry.DISCORD_CHAT_CHANNEL_ID.getString();
|
||||||
final MessageChannel genericChannel = event.getChannel();
|
if (event.getMember() != null && !chat_channel_id.isEmpty() && event.getChannel().getId().equals(chat_channel_id))
|
||||||
|
|
||||||
if (event.getMember() == null)
|
|
||||||
{
|
{
|
||||||
return;
|
if (!event.getAuthor().getId().equals(Discord.bot.getSelfUser().getId()))
|
||||||
}
|
|
||||||
|
|
||||||
if (chat_channel_id.isEmpty())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.getAuthor().getId().equals(Discord.bot.getSelfUser().getId()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!genericChannel.getId().equals(chat_channel_id))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(genericChannel instanceof TextChannel))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final TextChannel textChannel = (TextChannel) genericChannel;
|
|
||||||
|
|
||||||
final Member member = event.getMember();
|
|
||||||
final String tag = getDisplay(member);
|
|
||||||
final Message msg = event.getMessage();
|
|
||||||
final String content = msg.getContentStripped();
|
|
||||||
|
|
||||||
if (content.startsWith(ConfigEntry.DISCORD_PREFIX.getString()))
|
|
||||||
{
|
|
||||||
Discord.DISCORD_COMMAND_MANAGER.parse(content, member, textChannel);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ComponentBuilder emsg = new ComponentBuilder();
|
|
||||||
|
|
||||||
// Prefix
|
|
||||||
emsg.append(ChatColor.DARK_GRAY + "[");
|
|
||||||
TextComponent inviteLink = new TextComponent("Discord");
|
|
||||||
inviteLink.setColor(ChatColor.DARK_AQUA.asBungee());
|
|
||||||
inviteLink.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
|
|
||||||
new Text("Click here to get the invite link!")));
|
|
||||||
inviteLink.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL,
|
|
||||||
ConfigEntry.DISCORD_INVITE_LINK.getString()));
|
|
||||||
emsg.append(inviteLink);
|
|
||||||
emsg.append(ChatColor.DARK_GRAY + "] ", ComponentBuilder.FormatRetention.NONE);
|
|
||||||
|
|
||||||
// Tag (if they have one)
|
|
||||||
if (tag != null)
|
|
||||||
{
|
|
||||||
emsg.append(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
emsg.append(" ");
|
|
||||||
|
|
||||||
// User
|
|
||||||
TextComponent user = new TextComponent(FUtil.stripColors(member.getEffectiveName()));
|
|
||||||
user.setColor(ChatColor.RED.asBungee());
|
|
||||||
emsg.append(user);
|
|
||||||
|
|
||||||
// Message
|
|
||||||
emsg.append(ChatColor.DARK_GRAY + ": " + ChatColor.RESET
|
|
||||||
+ FUtil.stripColors(msg.getContentDisplay()), ComponentBuilder.FormatRetention.NONE);
|
|
||||||
|
|
||||||
// Attachments
|
|
||||||
if (!msg.getAttachments().isEmpty())
|
|
||||||
{
|
|
||||||
if (!msg.getContentDisplay().isEmpty())
|
|
||||||
emsg.append(" ");
|
|
||||||
|
|
||||||
for (Message.Attachment attachment : msg.getAttachments())
|
|
||||||
{
|
{
|
||||||
TextComponent media = new TextComponent("[Media] ");
|
Member member = event.getMember();
|
||||||
media.setColor(ChatColor.YELLOW.asBungee());
|
String tag = getDisplay(member);
|
||||||
media.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl()));
|
StringBuilder message = new StringBuilder(ChatColor.DARK_GRAY + "[" + ChatColor.DARK_AQUA + "Discord" + ChatColor.DARK_GRAY + "]");
|
||||||
media.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(attachment.getUrl())));
|
Message msg = event.getMessage();
|
||||||
|
if (tag != null)
|
||||||
emsg.append(media, ComponentBuilder.FormatRetention.NONE);
|
{
|
||||||
|
message.append(" ").append(tag);
|
||||||
|
}
|
||||||
|
message.append(" ").append(ChatColor.RED).append(ChatColor.stripColor(member.getEffectiveName())).append(ChatColor.DARK_GRAY).append(":").append(ChatColor.RESET);
|
||||||
|
ComponentBuilder builder = new ComponentBuilder(message.toString());
|
||||||
|
if (!msg.getContentDisplay().isEmpty())
|
||||||
|
{
|
||||||
|
builder.append(" ").append(ChatColor.stripColor(msg.getContentDisplay()));
|
||||||
|
message.append(" ").append(ChatColor.stripColor(msg.getContentDisplay())); // for logging
|
||||||
|
}
|
||||||
|
if (!msg.getAttachments().isEmpty())
|
||||||
|
{
|
||||||
|
for (Message.Attachment attachment : msg.getAttachments())
|
||||||
|
{
|
||||||
|
attachment.getUrl();
|
||||||
|
builder.append(" ");
|
||||||
|
TextComponent text = new TextComponent(ChatColor.YELLOW + "[Media]");
|
||||||
|
text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl()));
|
||||||
|
builder.append(text);
|
||||||
|
message.append(" [Media]"); // for logging
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (TotalFreedomMod.getPlugin().pl.getData(player).doesDisplayDiscord())
|
||||||
|
{
|
||||||
|
player.spigot().sendMessage(builder.create());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FLog.info(message.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseComponent[] components = emsg.create();
|
|
||||||
|
|
||||||
for (Player player : Bukkit.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
if (TotalFreedomMod.getPlugin().pl.getData(player).doesDisplayDiscord())
|
|
||||||
{
|
|
||||||
player.sendMessage(components);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FLog.info(TextComponent.toLegacyText(components), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getDisplay(Member member)
|
public String getDisplay(Member member)
|
||||||
{
|
{
|
||||||
Guild server = Discord.bot.getGuildById(ConfigEntry.DISCORD_SERVER_ID.getString());
|
Guild server = Discord.bot.getGuildById(ConfigEntry.DISCORD_SERVER_ID.getString());
|
||||||
|
@ -1,68 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
import net.dv8tion.jda.api.entities.Message;
|
|
||||||
import net.dv8tion.jda.api.entities.MessageEmbed;
|
|
||||||
import net.dv8tion.jda.api.entities.TextChannel;
|
|
||||||
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
|
|
||||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
|
||||||
|
|
||||||
public class MessageReactionListener extends ListenerAdapter
|
|
||||||
{
|
|
||||||
public void onMessageReactionAdd(MessageReactionAddEvent messageReactionAddEvent)
|
|
||||||
{
|
|
||||||
if (!messageReactionAddEvent.isFromGuild())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messageReactionAddEvent.getMember() == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messageReactionAddEvent.getMember().getUser().getId().equals(Discord.bot.getSelfUser().getId()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!messageReactionAddEvent.getChannel().getId().equals(ConfigEntry.DISCORD_REPORT_CHANNEL_ID.getString()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!messageReactionAddEvent.getReactionEmote().getEmoji().equals("\uD83D\uDCCB"))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final TextChannel archiveChannel = Discord.bot.getTextChannelById(ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString());
|
|
||||||
|
|
||||||
if (archiveChannel == null)
|
|
||||||
{
|
|
||||||
FLog.warning("Report archive channel is defined in the config, yet doesn't actually exist!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Message message = messageReactionAddEvent.retrieveMessage().complete();
|
|
||||||
final Member completer = messageReactionAddEvent.getMember();
|
|
||||||
|
|
||||||
if (!message.getAuthor().getId().equals(Discord.bot.getSelfUser().getId()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We don't need other embeds... yet?
|
|
||||||
final MessageEmbed embed = message.getEmbeds().get(0);
|
|
||||||
final MessageBuilder archiveMessageBuilder = new MessageBuilder();
|
|
||||||
archiveMessageBuilder.setContent("Report completed by " + completer.getUser().getAsMention() + " (" + Discord.deformat(completer.getUser().getAsTag() + ")"));
|
|
||||||
archiveMessageBuilder.setEmbed(embed);
|
|
||||||
final Message archiveMessage = archiveMessageBuilder.build();
|
|
||||||
|
|
||||||
archiveChannel.sendMessage(archiveMessage).complete();
|
|
||||||
message.delete().complete();
|
|
||||||
}
|
|
||||||
}
|
|
@ -22,8 +22,9 @@ public class PrivateMessageListener extends ListenerAdapter
|
|||||||
PlayerData player = Discord.LINK_CODES.get(code);
|
PlayerData player = Discord.LINK_CODES.get(code);
|
||||||
name = player.getName();
|
name = player.getName();
|
||||||
player.setDiscordID(event.getMessage().getAuthor().getId());
|
player.setDiscordID(event.getMessage().getAuthor().getId());
|
||||||
|
player.setVerification(true);
|
||||||
|
|
||||||
Admin admin = TotalFreedomMod.getPlugin().al.getEntryByUuid(player.getUuid());
|
Admin admin = TotalFreedomMod.getPlugin().al.getEntryByName(name);
|
||||||
if (admin != null)
|
if (admin != null)
|
||||||
{
|
{
|
||||||
Discord.syncRoles(admin, player.getDiscordID());
|
Discord.syncRoles(admin, player.getDiscordID());
|
||||||
@ -36,7 +37,8 @@ public class PrivateMessageListener extends ListenerAdapter
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.getChannel().sendMessage("Link successful. Now this Discord account is linked with your Minecraft account **" + name + "**.").complete();
|
event.getChannel().sendMessage("Link successful. Now this Discord account is linked with your Minecraft account **" + name + "**.\n"
|
||||||
|
+ "Now when you are an impostor on the server, you may use `/verify` to verify.").complete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord.command;
|
|
||||||
|
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface DiscordCommand
|
|
||||||
{
|
|
||||||
String getCommandName();
|
|
||||||
|
|
||||||
String getDescription();
|
|
||||||
|
|
||||||
String getCategory();
|
|
||||||
|
|
||||||
List<String> getAliases();
|
|
||||||
|
|
||||||
boolean isAdmin();
|
|
||||||
|
|
||||||
boolean canExecute(Member member);
|
|
||||||
|
|
||||||
MessageBuilder execute(Member member, List<String> args);
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord.command;
|
|
||||||
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
|
|
||||||
public abstract class DiscordCommandImpl implements DiscordCommand
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean canExecute(Member member)
|
|
||||||
{
|
|
||||||
// TODO Implement administrator checks if/when any administrative Discord commands are added to the bot
|
|
||||||
return !isAdmin();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord.command;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.Discord;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
import net.dv8tion.jda.api.entities.Message;
|
|
||||||
import net.dv8tion.jda.api.entities.TextChannel;
|
|
||||||
import org.reflections.Reflections;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
|
|
||||||
public class DiscordCommandManager
|
|
||||||
{
|
|
||||||
public static final String PREFIX = ConfigEntry.DISCORD_PREFIX.getString();
|
|
||||||
private Discord discord;
|
|
||||||
public final List<DiscordCommand> commands = new ArrayList<>();
|
|
||||||
|
|
||||||
public void init(Discord discord)
|
|
||||||
{
|
|
||||||
this.discord = discord;
|
|
||||||
|
|
||||||
final Reflections discordCommandsDir = new Reflections("me.totalfreedom.totalfreedommod.discord.commands");
|
|
||||||
|
|
||||||
final Set<Class<? extends DiscordCommand>> commandClasses = discordCommandsDir.getSubTypesOf(DiscordCommand.class);
|
|
||||||
|
|
||||||
for (Class<? extends DiscordCommand> commandClass : commandClasses)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
commands.add(commandClass.getDeclaredConstructor().newInstance());
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
FLog.warning("Failed to load Discord command: " + commandClass.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FLog.info("Loaded " + commands.size() + " Discord commands.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void parse(String content, Member member, TextChannel channel)
|
|
||||||
{
|
|
||||||
List<String> args = new ArrayList<>(Arrays.asList(content.split(" ")));
|
|
||||||
|
|
||||||
final String alias = args.remove(0).split(PREFIX)[1]; // The joys of command parsing
|
|
||||||
|
|
||||||
for (DiscordCommand command : commands)
|
|
||||||
{
|
|
||||||
if (command.getCommandName().equalsIgnoreCase(alias) || command.getAliases().contains(alias.toLowerCase()))
|
|
||||||
{
|
|
||||||
if (command.canExecute(member))
|
|
||||||
{
|
|
||||||
final MessageBuilder messageBuilder = command.execute(member, args);
|
|
||||||
final Message message = messageBuilder.build();
|
|
||||||
final CompletableFuture<Message> futureMessage = channel.sendMessage(message).submit(true);
|
|
||||||
|
|
||||||
this.discord.sentMessages.add(futureMessage);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final MessageBuilder messageBuilder = new MessageBuilder();
|
|
||||||
final EmbedBuilder embedBuilder = new EmbedBuilder();
|
|
||||||
embedBuilder.setTitle("Command error");
|
|
||||||
embedBuilder.setColor(Color.RED);
|
|
||||||
embedBuilder.setDescription("You don't have permission to execute this command.");
|
|
||||||
messageBuilder.setEmbed(embedBuilder.build());
|
|
||||||
final Message message = messageBuilder.build();
|
|
||||||
|
|
||||||
final CompletableFuture<Message> futureMessage = channel.sendMessage(message).submit(true);
|
|
||||||
|
|
||||||
this.discord.sentMessages.add(futureMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord.commands;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.Discord;
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.command.DiscordCommand;
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.command.DiscordCommandImpl;
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.command.DiscordCommandManager;
|
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class HelpCommand extends DiscordCommandImpl
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public String getCommandName()
|
|
||||||
{
|
|
||||||
return "help";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "Displays the help command";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getCategory()
|
|
||||||
{
|
|
||||||
return "Help";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<String> getAliases()
|
|
||||||
{
|
|
||||||
return List.of("cmds", "commands", "elp");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAdmin()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MessageBuilder execute(Member member, List<String> args)
|
|
||||||
{
|
|
||||||
final EmbedBuilder embedBuilder = new EmbedBuilder();
|
|
||||||
embedBuilder.setColor(Color.GREEN);
|
|
||||||
embedBuilder.setTitle("Help Command");
|
|
||||||
|
|
||||||
final Map<String, List<DiscordCommand>> commandCategories = new HashMap<>();
|
|
||||||
|
|
||||||
for (DiscordCommand command : Discord.DISCORD_COMMAND_MANAGER.commands)
|
|
||||||
{
|
|
||||||
if (!commandCategories.containsKey(command.getCategory()))
|
|
||||||
{
|
|
||||||
commandCategories.put(command.getCategory(), new ArrayList<>(List.of(command)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
commandCategories.get(command.getCategory()).add(command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Map.Entry<String, List<DiscordCommand>> entry : commandCategories.entrySet())
|
|
||||||
{
|
|
||||||
final String category = entry.getKey();
|
|
||||||
final List<DiscordCommand> commands = entry.getValue();
|
|
||||||
final StringBuilder fieldValue = new StringBuilder();
|
|
||||||
|
|
||||||
for (DiscordCommand command : commands)
|
|
||||||
{
|
|
||||||
fieldValue.append("**").append(DiscordCommandManager.PREFIX).append(command.getCommandName()).append("** - ").append(command.getDescription()).append("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
embedBuilder.addField(category, fieldValue.toString().trim(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new MessageBuilder().setEmbeds(embedBuilder.build());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,105 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord.commands;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
|
||||||
import me.totalfreedom.totalfreedommod.admin.AdminList;
|
|
||||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.Discord;
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.command.DiscordCommandImpl;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
|
||||||
import me.totalfreedom.totalfreedommod.rank.RankManager;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class ListCommand extends DiscordCommandImpl
|
|
||||||
{
|
|
||||||
private static final TotalFreedomMod PLUGIN = TotalFreedomMod.plugin();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getCommandName()
|
|
||||||
{
|
|
||||||
return "list";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "Gives a list of online players.";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getCategory()
|
|
||||||
{
|
|
||||||
return "Server Commands";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<String> getAliases()
|
|
||||||
{
|
|
||||||
return List.of("online", "who", "l", "lsit");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAdmin()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MessageBuilder execute(Member member, List<String> args)
|
|
||||||
{
|
|
||||||
if (PLUGIN == null)
|
|
||||||
{
|
|
||||||
throw new IllegalStateException("TotalFreedomMod somehow null while executing a command!");
|
|
||||||
}
|
|
||||||
|
|
||||||
final AdminList adminList = PLUGIN.al;
|
|
||||||
final RankManager rankManager = PLUGIN.rm;
|
|
||||||
|
|
||||||
EmbedBuilder embedBuilder = new EmbedBuilder()
|
|
||||||
.setTitle("Player List - " + ConfigEntry.SERVER_NAME.getString())
|
|
||||||
.setDescription("There are " + FUtil.getFakePlayerCount() + " / " + Bukkit.getMaxPlayers() + " online players");
|
|
||||||
|
|
||||||
Map<Displayable, List<String>> displayables = new HashMap<>();
|
|
||||||
|
|
||||||
for (Player onlinePlayer : Bukkit.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
if (adminList.isVanished(onlinePlayer.getName()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Displayable displayable = rankManager.getDisplay(onlinePlayer);
|
|
||||||
|
|
||||||
final String name = Discord.deformat(onlinePlayer.getName());
|
|
||||||
|
|
||||||
if (displayables.containsKey(displayable))
|
|
||||||
{
|
|
||||||
displayables.get(displayable).add(name);
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
displayables.put(displayable, new ArrayList<>(List.of(name)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Map.Entry<Displayable, List<String>> entry : displayables.entrySet())
|
|
||||||
{
|
|
||||||
final Displayable displayable = entry.getKey();
|
|
||||||
final List<String> players = entry.getValue();
|
|
||||||
|
|
||||||
embedBuilder.addField(displayable.getPlural() + " (" + players.size() + ")",
|
|
||||||
String.join(", ", players), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new MessageBuilder().setEmbeds(embedBuilder.build());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
package me.totalfreedom.totalfreedommod.discord.commands;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.discord.command.DiscordCommandImpl;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class TPSCommand extends DiscordCommandImpl
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public String getCommandName()
|
|
||||||
{
|
|
||||||
return "tps";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "Lag information regarding the server.";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getCategory()
|
|
||||||
{
|
|
||||||
return "Server Commands";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<String> getAliases()
|
|
||||||
{
|
|
||||||
return Collections.singletonList("lag");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAdmin()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MessageBuilder execute(Member member, List<String> args)
|
|
||||||
{
|
|
||||||
final EmbedBuilder builder = new EmbedBuilder();
|
|
||||||
builder.setTitle("Server lag information");
|
|
||||||
builder.addField("TPS", String.valueOf(Math.round(FUtil.getMeanAverageDouble(Bukkit.getServer().getTPS()))), false);
|
|
||||||
builder.addField("Uptime", FUtil.getUptime(), false);
|
|
||||||
builder.addField("Maximum Memory", Math.ceil(FUtil.getMaxMem()) + " MB", false);
|
|
||||||
builder.addField("Allocated Memory", Math.ceil(FUtil.getTotalMem()) + " MB", false);
|
|
||||||
builder.addField("Free Memory", Math.ceil(FUtil.getFreeMem()) + " MB", false);
|
|
||||||
|
|
||||||
return new MessageBuilder().setEmbeds(builder.build());
|
|
||||||
}
|
|
||||||
}
|
|
@ -61,8 +61,11 @@ public class FreezeData
|
|||||||
@Override
|
@Override
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
FUtil.adminAction("TotalFreedom", "Unfreezing " + player.getName(), false);
|
if (!Objects.requireNonNull(plugin()).al.isAdminImpostor(player) && Objects.requireNonNull(plugin()).pl.isPlayerImpostor(player))
|
||||||
setFrozen(false);
|
{
|
||||||
|
FUtil.adminAction("TotalFreedom", "Unfreezing " + player.getName(), false);
|
||||||
|
setFrozen(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}.runTaskLater(Objects.requireNonNull(plugin()), AUTO_PURGE_TICKS);
|
}.runTaskLater(Objects.requireNonNull(plugin()), AUTO_PURGE_TICKS);
|
||||||
|
@ -128,7 +128,7 @@ public class ItemFun extends FreedomService
|
|||||||
|
|
||||||
LivingEntity livingEntity = (LivingEntity)event.getRightClicked();
|
LivingEntity livingEntity = (LivingEntity)event.getRightClicked();
|
||||||
EntityType entityType = livingEntity.getType();
|
EntityType entityType = livingEntity.getType();
|
||||||
if (entityType != fPlayer.mobThrowerCreature())
|
if (!(entityType == fPlayer.mobThrowerCreature()))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -304,11 +304,6 @@ public class ItemFun extends FreedomService
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
{
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ public class Landminer extends FreedomService
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.getLocation().distanceSquared(location) > (landmine.radius * landmine.radius))
|
if (!(player.getLocation().distanceSquared(location) <= (landmine.radius * landmine.radius)))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,7 @@ import java.util.HashSet;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SplittableRandom;
|
import java.util.SplittableRandom;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||||
import me.totalfreedom.totalfreedommod.shop.ShopItem;
|
|
||||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -21,7 +18,7 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
|||||||
public class Trailer extends FreedomService
|
public class Trailer extends FreedomService
|
||||||
{
|
{
|
||||||
private final SplittableRandom random = new SplittableRandom();
|
private final SplittableRandom random = new SplittableRandom();
|
||||||
private final Set<UUID> trailPlayers = new HashSet<>(); // player UUID
|
private final Set<String> trailPlayers = new HashSet<>(); // player name
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart()
|
public void onStart()
|
||||||
@ -36,17 +33,17 @@ public class Trailer extends FreedomService
|
|||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onPlayerMove(PlayerMoveEvent event)
|
public void onPlayerMove(PlayerMoveEvent event)
|
||||||
{
|
{
|
||||||
/* Doesn't continue any further if...
|
if (trailPlayers.isEmpty())
|
||||||
* - The trail list is empty
|
{
|
||||||
* - The player doesn't have their trail enabled in the first place
|
return;
|
||||||
* - The player doesn't have the trail item in the shop at all
|
}
|
||||||
* - The player doesn't have permission to modify blocks in their current world
|
|
||||||
*/
|
if (!trailPlayers.contains(event.getPlayer().getName()))
|
||||||
if (trailPlayers.isEmpty()
|
{
|
||||||
|| !trailPlayers.contains(event.getPlayer().getUniqueId())
|
return;
|
||||||
|| !plugin.pl.getData(event.getPlayer()).hasItem(ShopItem.RAINBOW_TRAIL)
|
}
|
||||||
|| plugin.wr.doRestrict(event.getPlayer())
|
|
||||||
|| !plugin.wgb.canEditCurrentWorld(event.getPlayer()))
|
if (event.getPlayer().getWorld().equals(plugin.wm.masterBuilderWorld.getWorld()))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -72,7 +69,7 @@ public class Trailer extends FreedomService
|
|||||||
{
|
{
|
||||||
final Location trail_pos;
|
final Location trail_pos;
|
||||||
trail_pos = new Location(event.getPlayer().getWorld(), fromBlock.getX() + x, fromBlock.getY(), fromBlock.getZ() + z);
|
trail_pos = new Location(event.getPlayer().getWorld(), fromBlock.getX() + x, fromBlock.getY(), fromBlock.getZ() + z);
|
||||||
if (trailPlayers.contains(event.getPlayer().getUniqueId()) && plugin.cpb.isEnabled())
|
if (trailPlayers.contains(event.getPlayer().getName()) && plugin.cpb.isEnabled())
|
||||||
{
|
{
|
||||||
plugin.cpb.getCoreProtectAPI().logPlacement(event.getPlayer().getName(), trail_pos, material, data);
|
plugin.cpb.getCoreProtectAPI().logPlacement(event.getPlayer().getName(), trail_pos, material, data);
|
||||||
}
|
}
|
||||||
@ -82,16 +79,16 @@ public class Trailer extends FreedomService
|
|||||||
|
|
||||||
public void remove(Player player)
|
public void remove(Player player)
|
||||||
{
|
{
|
||||||
trailPlayers.remove(player.getUniqueId());
|
trailPlayers.remove(player.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(Player player)
|
public void add(Player player)
|
||||||
{
|
{
|
||||||
trailPlayers.add(player.getUniqueId());
|
trailPlayers.add(player.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean contains(Player player)
|
public boolean contains(Player player)
|
||||||
{
|
{
|
||||||
return trailPlayers.contains(player.getUniqueId());
|
return trailPlayers.contains(player.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,15 +11,9 @@ public class HTMLGenerationTools
|
|||||||
return "<p>" + escapeHtml4(data) + "</p>\r\n";
|
return "<p>" + escapeHtml4(data) + "</p>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String heading(String data, String id, int level)
|
|
||||||
{
|
|
||||||
return "<h" + level + (id != null ? " id=\"" + id + "\"" : "") + ">" + escapeHtml4(data)
|
|
||||||
+ "</h" + level + ">\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String heading(String data, int level)
|
public static String heading(String data, int level)
|
||||||
{
|
{
|
||||||
return heading(data, null, level);
|
return "<h" + level + ">" + escapeHtml4(data) + "</h" + level + ">\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <K, V> String list(Map<K, V> map)
|
public static <K, V> String list(Map<K, V> map)
|
||||||
|
@ -337,12 +337,12 @@ public abstract class NanoHTTPD
|
|||||||
*/
|
*/
|
||||||
protected String decodePercent(String str)
|
protected String decodePercent(String str)
|
||||||
{
|
{
|
||||||
String decoded = str;
|
String decoded = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
decoded = URLDecoder.decode(str, "UTF8");
|
decoded = URLDecoder.decode(str, "UTF8");
|
||||||
}
|
}
|
||||||
catch (UnsupportedEncodingException | IllegalArgumentException ignored)
|
catch (UnsupportedEncodingException ignored)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
return decoded;
|
return decoded;
|
||||||
|
@ -1,67 +1,52 @@
|
|||||||
package me.totalfreedom.totalfreedommod.httpd.module;
|
package me.totalfreedom.totalfreedommod.httpd.module;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||||
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
|
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
|
||||||
import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD;
|
import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD;
|
||||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
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.PluginIdentifiableCommand;
|
import org.bukkit.command.PluginIdentifiableCommand;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.bukkit.command.SimpleCommandMap;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.heading;
|
import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.heading;
|
||||||
import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.paragraph;
|
import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.paragraph;
|
||||||
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
|
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
|
||||||
|
|
||||||
public class Module_help extends HTTPDModule
|
public class Module_help extends HTTPDModule
|
||||||
{
|
{
|
||||||
|
|
||||||
public Module_help(NanoHTTPD.HTTPSession session)
|
public Module_help(NanoHTTPD.HTTPSession session)
|
||||||
{
|
{
|
||||||
super(session);
|
super(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String buildDescription(@NotNull Command command)
|
private static String buildDescription(Command command)
|
||||||
{
|
|
||||||
return buildDescription(command.getName(), command.getDescription(), command.getUsage(), StringUtils.join(command.getAliases(), ", "));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String buildDescription(@NotNull FreedomCommand command)
|
|
||||||
{
|
|
||||||
return buildDescription(command.getName(), command.getDescription(), command.getUsage(), command.getAliases());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String buildDescription(@NotNull String name, @Nullable String description, @NotNull String usage, @NotNull String aliases)
|
|
||||||
{
|
{
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
sb.append(
|
sb.append(
|
||||||
"<li><span class=\"commandName\">{$CMD_NAME}</span> - Usage: <span class=\"commandUsage\">{$CMD_USAGE}</span>"
|
"<li><span class=\"commandName\">{$CMD_NAME}</span> - Usage: <span class=\"commandUsage\">{$CMD_USAGE}</span>"
|
||||||
.replace("{$CMD_NAME}", escapeHtml4(name.trim()))
|
.replace("{$CMD_NAME}", escapeHtml4(command.getName().trim()))
|
||||||
.replace("{$CMD_USAGE}", escapeHtml4(usage.trim())));
|
.replace("{$CMD_USAGE}", escapeHtml4(command.getUsage().trim())));
|
||||||
|
|
||||||
if (!aliases.isEmpty())
|
if (!command.getAliases().isEmpty())
|
||||||
{
|
{
|
||||||
sb.append(
|
sb.append(
|
||||||
" - Aliases: <span class=\"commandAliases\">{$CMD_ALIASES}</span>"
|
" - Aliases: <span class=\"commandAliases\">{$CMD_ALIASES}</span>"
|
||||||
.replace("{$CMD_ALIASES}", escapeHtml4(aliases.trim())));
|
.replace("{$CMD_ALIASES}", escapeHtml4(StringUtils.join(command.getAliases(), ", "))));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (description != null)
|
sb.append(
|
||||||
{
|
"<br><span class=\"commandDescription\">{$CMD_DESC}</span></li>\r\n"
|
||||||
sb.append(
|
.replace("{$CMD_DESC}", escapeHtml4(command.getDescription().trim())));
|
||||||
"<br><span class=\"commandDescription\">{$CMD_DESC}</span></li>\r\n"
|
|
||||||
.replace("{$CMD_DESC}", escapeHtml4(description.trim())));
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
@ -69,7 +54,11 @@ public class Module_help extends HTTPDModule
|
|||||||
@Override
|
@Override
|
||||||
public String getBody()
|
public String getBody()
|
||||||
{
|
{
|
||||||
final CommandMap map = Bukkit.getCommandMap();
|
final CommandMap map = FreedomCommand.getCommandMap();
|
||||||
|
if (!(map instanceof SimpleCommandMap))
|
||||||
|
{
|
||||||
|
return paragraph("Error loading commands.");
|
||||||
|
}
|
||||||
|
|
||||||
final StringBuilder responseBody = new StringBuilder()
|
final StringBuilder responseBody = new StringBuilder()
|
||||||
.append(heading("Command Help", 1))
|
.append(heading("Command Help", 1))
|
||||||
@ -77,7 +66,7 @@ public class Module_help extends HTTPDModule
|
|||||||
"This page is an automatically generated listing of all plugin commands that are currently live on the server. "
|
"This page is an automatically generated listing of all plugin commands that are currently live on the server. "
|
||||||
+ "Please note that it does not include vanilla server commands."));
|
+ "Please note that it does not include vanilla server commands."));
|
||||||
|
|
||||||
final Collection<Command> knownCommands = map.getKnownCommands().values();
|
final Collection<Command> knownCommands = ((SimpleCommandMap)map).getCommands();
|
||||||
final Map<String, List<Command>> commandsByPlugin = new HashMap<>();
|
final Map<String, List<Command>> commandsByPlugin = new HashMap<>();
|
||||||
|
|
||||||
for (Command command : knownCommands)
|
for (Command command : knownCommands)
|
||||||
@ -90,47 +79,34 @@ public class Module_help extends HTTPDModule
|
|||||||
|
|
||||||
List<Command> pluginCommands = commandsByPlugin.computeIfAbsent(pluginName, k -> Lists.newArrayList());
|
List<Command> pluginCommands = commandsByPlugin.computeIfAbsent(pluginName, k -> Lists.newArrayList());
|
||||||
|
|
||||||
if (!pluginCommands.contains(command))
|
pluginCommands.add(command);
|
||||||
{
|
|
||||||
pluginCommands.add(command);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final CommandComparator comparator = new CommandComparator();
|
|
||||||
|
|
||||||
// For every plugin...
|
|
||||||
for (Map.Entry<String, List<Command>> entry : commandsByPlugin.entrySet())
|
for (Map.Entry<String, List<Command>> entry : commandsByPlugin.entrySet())
|
||||||
{
|
{
|
||||||
final String pluginName = entry.getKey();
|
final String pluginName = entry.getKey();
|
||||||
final List<Command> commands = entry.getValue();
|
final List<Command> commands = entry.getValue();
|
||||||
|
|
||||||
// Sort them alphabetically
|
commands.sort(new CommandComparator());
|
||||||
commands.sort(comparator);
|
|
||||||
|
|
||||||
responseBody.append(heading(pluginName, pluginName, 2)).append("<ul>\r\n");
|
responseBody.append(heading(pluginName, 2)).append("<ul>\r\n");
|
||||||
|
|
||||||
if (!plugin.getName().equals(pluginName))
|
Displayable lastTfmCommandLevel = null;
|
||||||
|
for (Command command : commands)
|
||||||
{
|
{
|
||||||
commands.forEach((command) -> responseBody.append(buildDescription(command)));
|
if (!TotalFreedomMod.pluginName.equals(pluginName))
|
||||||
}
|
{
|
||||||
else
|
responseBody.append(buildDescription(command));
|
||||||
{
|
continue;
|
||||||
Map<Rank, List<FreedomCommand>> freedomCommands = new HashMap<>();
|
}
|
||||||
|
|
||||||
// Filters out non-TFM commands
|
Displayable tfmCommandLevel = Objects.requireNonNull(FreedomCommand.getFrom(command)).getPerms().level();
|
||||||
commands.stream().filter((cmd) -> cmd instanceof FreedomCommand.FCommand).forEach((tfmCmd) -> {
|
if (lastTfmCommandLevel == null || lastTfmCommandLevel != tfmCommandLevel)
|
||||||
Rank rank = FreedomCommand.getFrom(tfmCmd).getLevel();
|
{
|
||||||
if (!freedomCommands.containsKey(rank))
|
responseBody.append("</ul>\r\n").append(heading(tfmCommandLevel.getName(), 3)).append("<ul>\r\n");
|
||||||
freedomCommands.put(rank, new ArrayList<>());
|
}
|
||||||
freedomCommands.get(rank).add(FreedomCommand.getFrom(tfmCmd));
|
lastTfmCommandLevel = tfmCommandLevel;
|
||||||
});
|
responseBody.append(buildDescription(command));
|
||||||
|
|
||||||
// Finally dumps them to HTML
|
|
||||||
Arrays.stream(Rank.values()).filter(freedomCommands::containsKey)
|
|
||||||
.sorted(comparator::compare).forEach((rank -> {
|
|
||||||
responseBody.append("</ul>\r\n").append(heading(rank.getName(), 3)).append("<ul>\r\n");
|
|
||||||
freedomCommands.get(rank).stream().sorted(comparator::compare).forEach((command) -> responseBody.append(buildDescription(command)));
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
responseBody.append("</ul>\r\n");
|
responseBody.append("</ul>\r\n");
|
||||||
@ -142,7 +118,7 @@ public class Module_help extends HTTPDModule
|
|||||||
@Override
|
@Override
|
||||||
public String getTitle()
|
public String getTitle()
|
||||||
{
|
{
|
||||||
return plugin.getName() + " :: Command Help";
|
return "TotalFreedomMod :: Command Help";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -153,23 +129,23 @@ public class Module_help extends HTTPDModule
|
|||||||
|
|
||||||
public static class CommandComparator implements Comparator<Command>
|
public static class CommandComparator implements Comparator<Command>
|
||||||
{
|
{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(Command a, Command b)
|
public int compare(Command a, Command b)
|
||||||
{
|
{
|
||||||
return a.getName().compareTo(b.getName());
|
FreedomCommand ca = FreedomCommand.getFrom(a);
|
||||||
}
|
FreedomCommand cb = FreedomCommand.getFrom(b);
|
||||||
|
|
||||||
public int compare(FreedomCommand a, FreedomCommand b)
|
if (ca == null
|
||||||
{
|
|| cb == null
|
||||||
return a.getName().compareTo(b.getName());
|
|| ca.getPerms() == null
|
||||||
}
|
|| cb.getPerms() == null)
|
||||||
|
{
|
||||||
|
return a.getName().compareTo(b.getName());
|
||||||
|
}
|
||||||
|
|
||||||
public int compare(Rank a, Rank b)
|
return ca.getPerms().level().getName().compareTo(cb.getPerms().level().getName());
|
||||||
{
|
|
||||||
Integer levelA = a.getLevel();
|
|
||||||
Integer levelB = b.getLevel();
|
|
||||||
|
|
||||||
return levelB.compareTo(levelA);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user