49 Commits
1.1 ... 1.2

Author SHA1 Message Date
22199be335 Plex v1.2 2022-08-25 20:28:13 -05:00
2e077c40d2 lets see if its fixed 2022-08-25 19:06:18 -05:00
517b829420 Merge remote-tracking branch 'origin/master' 2022-08-02 17:03:24 -07:00
7fa26f9a64 add admin chat redis support 2022-08-02 17:03:04 -07:00
09846f1d33 Switch to Component for CommandSpy 2022-08-02 18:57:12 -05:00
ed70a0ec8b Remove debug line 2022-08-02 17:29:39 -05:00
16e29b80a7 make getPlayer a function because mongo doesnt call constructors 2022-08-02 15:23:54 -07:00
829bb88959 Fix CI 2022-08-02 12:13:57 -05:00
d6b44863aa Remove the API component - closes #51 2022-08-02 22:08:52 +10:00
f806470fd5 Actually fix colors in nicknames
Co-Authored-By: Taahh <9047036+Taahh@users.noreply.github.com>
2022-08-01 23:38:18 -05:00
3611148b4c Remove non-ASCII characters from tags & chat messages (closes #48) 2022-08-02 03:23:08 +01:00
262af44193 Add run/ to .gitignore 2022-08-02 02:49:54 +01:00
a014a38e2f Check if array is empty in disabled effect (closes #50) 2022-08-02 02:48:25 +01:00
d896179f47 Block more tags 2022-08-01 19:36:43 -05:00
9dac0e799e Fix display name always being set in the config
Also, fix an unintentional double space
2022-08-01 19:23:57 -05:00
5c27fb00e7 Roll back to 7.4.2 2022-08-01 17:05:49 -05:00
679d8bcbc0 Attempt to update gradle again 2022-08-01 16:55:15 -05:00
46de6dba84 Update Gradle and plugins 2022-08-01 16:45:41 -05:00
d2649508b3 *sigh* 2022-07-30 19:26:26 -05:00
dd8e22b676 Ok 2022-07-27 23:22:45 -05:00
b26e489e83 Fix whitespace bypassing command blocker 2022-07-24 03:44:54 +01:00
5f64e02cae Fix NPE in PlexCommand 2022-07-24 01:12:30 +01:00
4a14f94158 Use ComponentLogger + update dependencies 2022-06-29 18:11:03 -05:00
6763e12d81 Back to snapshot 2022-06-14 00:17:19 -05:00
1d0fb85fa1 Remove maven local 2022-06-13 23:19:24 -05:00
665a2f4e72 Merge branch '1.19' 2022-06-13 23:18:39 -05:00
9c67911c1b Plex v1.1.1 2022-06-13 23:17:10 -05:00
f1ebbc3664 Fix incorrect permission 2022-06-09 21:12:19 -05:00
4aa3ae7c50 Update Blossom
(cherry picked from commit 08e2f31eae)
2022-06-08 17:21:35 -05:00
08e2f31eae Update Blossom 2022-06-08 17:20:44 -05:00
a1c009909d Lang to lang3 2022-06-08 15:09:42 -05:00
7d2c44975d Update for 1.19 2022-06-08 14:37:16 -05:00
b2faec70a9 oops 2022-06-08 14:33:04 -05:00
a0cca2aea5 Update codeql-analysis.yml 2022-06-08 14:32:09 -05:00
337334d403 Update gradle.yml 2022-06-08 14:30:23 -05:00
2e8fe8767e Update codeql-analysis.yml 2022-06-08 14:28:25 -05:00
dbdf720a9e Update workflow 2022-06-08 14:22:14 -05:00
5a9d6dd60d fix messages 2022-06-05 22:55:11 -05:00
84a9535123 ok so apparently this matters 2022-06-05 22:39:41 -05:00
41aff575d0 big think, it should be public 2022-06-05 22:34:16 -05:00
65b8188b37 Merge branch 'master' of https://github.com/plexusorg/Plex 2022-06-05 22:27:25 -05:00
c8a35c8e0e Add the ability to add messages into Plex
Code originally from TFMExtras by taah
2022-06-05 22:27:24 -05:00
13acf7ba9d Properly disable explosions (#45)
* Remove unused import

* Properly disable explosions
2022-06-05 15:29:49 -05:00
5fe48cfd7f Allow toggling redstone 2022-06-04 22:48:18 -05:00
abf2aca0f2 Resolves #12 (major config changes)
Also allows more customization within the updater
2022-06-04 22:08:13 -05:00
dc4ac39fe4 Switch legacy to MiniMessage 2022-06-04 21:31:36 -05:00
1ae8e779b1 Merge pull request #44 from plexusorg/codeql-readme
Add CodeQL to the README.md
2022-06-01 01:56:58 -07:00
658f4a4b05 Add CodeQL to the README.md 2022-06-01 09:55:40 +01:00
7ccfb2ad27 Back to snapshot 2022-05-28 22:55:48 -05:00
91 changed files with 686 additions and 714 deletions

View File

@ -1,14 +1,3 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL" name: "CodeQL"
on: on:
@ -18,7 +7,7 @@ on:
# The branches below must be a subset of the branches above # The branches below must be a subset of the branches above
branches: [ master ] branches: [ master ]
schedule: schedule:
- cron: '29 4 * * *' - cron: '30 4 * * *'
jobs: jobs:
analyze: analyze:
@ -33,45 +22,26 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
language: [ 'java' ] language: [ 'java' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] java: [17]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Set up JDK 17 - name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v2 uses: actions/setup-java@v3
with: with:
distribution: temurin distribution: temurin
java-version: 17 java-version: ${{ matrix.java }}
cache: gradle cache: gradle
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@v2 uses: github/codeql-action/init@v2
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.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# 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@v2
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
- run: |
chmod +x gradlew
./gradlew build --no-daemon
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2 uses: github/codeql-action/analyze@v2

View File

@ -1,18 +1,26 @@
name: Gradle # Adapted from Paper's build script
name: Build
on: [ push ] on: [push, pull_request]
jobs: jobs:
build: build:
runs-on: ubuntu-latest # Only run on PRs if the source branch is on someone else's repo
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
steps: runs-on: ubuntu-latest
- uses: actions/checkout@v2 strategy:
- name: Set up JDK 17 matrix:
uses: actions/setup-java@v2 java: [17]
with: fail-fast: true
distribution: temurin steps:
java-version: 17 - uses: actions/checkout@v3
cache: gradle - name: JDK ${{ matrix.java }}
- name: Build with Gradle uses: actions/setup-java@v3
run: chmod a+x gradlew && ./gradlew build --no-daemon with:
java-version: ${{ matrix.java }}
cache: 'gradle'
distribution: 'temurin'
- name: Build
run: |
git config --global user.email "no-reply@github.com"
git config --global user.name "Github Actions"
./gradlew build --stacktrace

5
.gitignore vendored
View File

@ -14,4 +14,7 @@ Thumbs.db
# Gradle # Gradle
/build/ /build/
/*/build/ /*/build/
/.gradle/ /.gradle/
# Common working directory
run/

View File

@ -1,5 +1,5 @@
For those who are wanting to contribute, we fully encourage doing so. There are a few rules we require following when For those who are wanting to contribute, we fully encourage doing so. There are a few rules we require following when
contributing however. contributing.
## Steps ## Steps
@ -17,7 +17,8 @@ contributing however.
- Keep in mind that it **must** be formatted correctly. If you are using IntelliJ, there is a `codeStyle.xml` file that - Keep in mind that it **must** be formatted correctly. If you are using IntelliJ, there is a `codeStyle.xml` file that
tells IntelliJ how to format your code. Check this link for information on how to use the tells IntelliJ how to format your code. Check this link for information on how to use the
file: https://www.jetbrains.com/help/idea/configuring-code-style.html#import-export-schemes file: https://www.jetbrains.com/help/idea/configuring-code-style.html#import-export-schemes
- If you are not using IntelliJ, that is fine. We use Allman style so please format your code accordingly. - If you are not using IntelliJ, that is fine. We use the Plexus Code Style (which is almost the same as Allman) so
please format your code accordingly.
6. Push your changes to your new branch and make a PR based off of that branch. 6. Push your changes to your new branch and make a PR based off of that branch.

4
Jenkinsfile vendored
View File

@ -24,9 +24,9 @@ pipeline {
post { post {
always { always {
archiveArtifacts artifacts: "build/libs/*.jar", fingerprint: true archiveArtifacts artifacts: "build/libs/*.jar", fingerprint: true
javadoc javadocDir: "api/build/docs/javadoc", keepAll: false javadoc javadocDir: "server/build/docs/javadoc", keepAll: false
discordSend description: "**Build:** ${env.BUILD_NUMBER}\n**Status:** ${currentBuild.currentResult}", enableArtifactsList: true, footer: "Built with Jenkins", link: env.BUILD_URL, result: currentBuild.currentResult, scmWebUrl: "https://github.com/plexusorg/Plex", showChangeset: true, title: env.JOB_NAME, webhookURL: env.WEBHOOK_URL discordSend description: "**Build:** ${env.BUILD_NUMBER}\n**Status:** ${currentBuild.currentResult}", enableArtifactsList: true, footer: "Built with Jenkins", link: env.BUILD_URL, result: currentBuild.currentResult, scmWebUrl: "https://github.com/plexusorg/Plex", showChangeset: true, title: env.JOB_NAME, webhookURL: env.WEBHOOK_URL
cleanWs() cleanWs()
} }
} }
} }

View File

@ -1,8 +1,8 @@
# Plex [![Build Status](https://ci.plex.us.org/job/Plex/job/master/badge/icon)](https://ci.plex.us.org/job/Plex/job/master/) # Plex [![Build Status](https://ci.plex.us.org/job/Plex/job/master/badge/icon)](https://ci.plex.us.org/job/Plex/job/master/) ![CodeQL](https://github.com/plexusorg/Plex/workflows/CodeQL/badge.svg)
Plex is a new freedom plugin. It is an alternative to TotalFreedomMod. It has many of the features that make a freedom Plex is a new freedom plugin. It is an alternative to TotalFreedomMod. It has many of the features that make a freedom
server unique, but also many features that TotalFreedomMod doesnt have. For example, there is full support for using a server unique, but also many features that TotalFreedomMod doesnt have. For example, there is full support for using a
permissions plugin instead of ranks. It is also much more performance oriented. You can use Redis to store indefinite permissions plugin instead of ranks. It is also much more performance oriented. You can use Redis to store indefinite
bans and store player data in MongoDB, MariaDB, or SQLite. Plex is also fully customizable as you can change almost all bans and store player data in MongoDB, MariaDB, or SQLite. Plex is also fully customizable as you can change almost all
of the messages within the plugin. Plex also has a module system which can be used to add additional functionality. Plex of the messages within the plugin. Plex also has a module system which can be used to add additional functionality. Plex
is not a rewrite, "debloat", or related to TotalFreedomMod. Plex is an entirely new experience. is not a rewrite, "debloat", or related to TotalFreedomMod. Plex is an entirely new experience.

View File

@ -1,32 +0,0 @@
group = rootProject.group
version = rootProject.version
description = "Plex-API"
jar {
archiveBaseName.set("Plex-API")
}
tasks {
jar {
finalizedBy(rootProject.tasks.copyJars)
}
shadowJar {
enabled = false
}
}
publishing {
publications {
maven(MavenPublication) {
from components.java
}
}
}
dependencies {
compileOnly "org.projectlombok:lombok:1.18.24"
annotationProcessor "org.projectlombok:lombok:1.18.24"
compileOnly "io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT"
compileOnly "org.json:json:20220320"
}

View File

@ -1,11 +0,0 @@
package dev.plex.api;
import java.util.Map;
import java.util.UUID;
public interface IPlayerCache<T>
{
Map<UUID, T> getPlexPlayerMap();
T getPlexPlayer(UUID uuid);
}

View File

@ -1,6 +0,0 @@
package dev.plex.api;
public interface PlexApi
{
IPlayerCache<?> getPlayerCache();
}

View File

@ -1,6 +0,0 @@
package dev.plex.api;
public interface PlexApiProvider
{
PlexApi getApi();
}

View File

@ -1,8 +0,0 @@
package dev.plex.api.chat;
import io.papermc.paper.event.player.AsyncChatEvent;
public interface IChatHandler
{
void doChat(AsyncChatEvent event);
}

View File

@ -1,32 +0,0 @@
package dev.plex.api.permission;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface IPermissionHandler
{
default boolean hasPermission(@NotNull Player player, @Nullable String permission)
{
if (permission == null)
{
return true;
}
return player.hasPermission(permission);
}
default boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission)
{
if (permission == null)
{
return true;
}
if (player.isOnline() && Bukkit.getPlayer(player.getUniqueId()) != null)
{
return Bukkit.getPlayer(player.getUniqueId()).hasPermission(permission);
}
throw new UnsupportedOperationException("Not implemented yet");
}
}

View File

@ -1,67 +0,0 @@
package dev.plex.api.player;
import java.util.List;
import java.util.UUID;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
public interface IPlexPlayer
{
String getId();
UUID getUuid();
String getName();
Player getPlayer();
void setPlayer(Player player);
String getLoginMessage();
void setLoginMessage(String message);
String getPrefix();
void setPrefix(String prefix);
boolean isVanished();
void setVanished(boolean vanished);
boolean isCommandSpy();
void setCommandSpy(boolean commandSpy);
boolean isFrozen();
void setFrozen(boolean frozen);
boolean isMuted();
void setMuted(boolean muted);
boolean isLockedUp();
void setLockedUp(boolean lockedUp);
boolean isAdminActive();
void setAdminActive(boolean active);
long getCoins();
void setCoins(long coins);
String getRank();
void setRank(String rank);
List<String> getIps();
void setIps(List<String> ips);
PermissionAttachment getPermissionAttachment();
void setPermissionAttachment(PermissionAttachment attachment);
}

View File

@ -1,30 +0,0 @@
package dev.plex.api.plugin;
import dev.plex.api.chat.IChatHandler;
import dev.plex.api.permission.IPermissionHandler;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.plugin.java.JavaPlugin;
@Getter
@Setter
public abstract class PlexPlugin extends JavaPlugin
{
@Setter(AccessLevel.NONE)
private static PlexPlugin plugin;
private IChatHandler chatHandler;
private IPermissionHandler permissionHandler;
@Override
public void onLoad()
{
plugin = this;
}
public static PlexPlugin get()
{
return plugin;
}
}

View File

@ -1,26 +0,0 @@
package dev.plex.api.rank;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.json.JSONObject;
public interface IRank<T>
{
int getLevel();
String getLoginMessage();
void setLoginMessage(String message);
String getReadable();
Component getPrefix();
void setPrefix(String prefix);
NamedTextColor getColor();
boolean isAtLeast(T rank);
JSONObject toJSON();
}

View File

@ -5,7 +5,7 @@ plugins {
} }
group = "dev.plex" group = "dev.plex"
version = "1.1" version = "1.2"
description = "Plex" description = "Plex"
subprojects { subprojects {
@ -60,7 +60,6 @@ subprojects {
} }
clean { clean {
dependsOn(":api:clean")
dependsOn(":server:clean") dependsOn(":server:clean")
dependsOn(":proxy:clean") dependsOn(":proxy:clean")
} }
@ -70,4 +69,4 @@ task copyJars(type: Copy, dependsOn: subprojects.jar) {
from(subprojects.jar) from(subprojects.jar)
from(subprojects.shadowJar) from(subprojects.shadowJar)
into project.file('build/libs') into project.file('build/libs')
} }

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-7.6-20220825090952+0000-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -1,5 +1,5 @@
plugins { plugins {
id("net.kyori.blossom") version "1.2.0" id("net.kyori.blossom") version "1.3.0"
} }
group = rootProject.group group = rootProject.group
@ -42,5 +42,4 @@ dependencies {
compileOnly("org.json:json:20220320") compileOnly("org.json:json:20220320")
compileOnly("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT") compileOnly("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT")
annotationProcessor("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT") annotationProcessor("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT")
implementation(project(":api"))
} }

View File

@ -1,5 +1,5 @@
plugins { plugins {
id "net.minecrell.plugin-yml.bukkit" version "0.6.1-SNAPSHOT" id "net.minecrell.plugin-yml.bukkit" version "0.5.2"
} }
dependencies { dependencies {
@ -7,28 +7,27 @@ dependencies {
annotationProcessor "org.projectlombok:lombok:1.18.24" annotationProcessor "org.projectlombok:lombok:1.18.24"
library "org.json:json:20220320" library "org.json:json:20220320"
library "commons-io:commons-io:2.11.0" library "commons-io:commons-io:2.11.0"
library "dev.morphia.morphia:morphia-core:2.2.6" library "dev.morphia.morphia:morphia-core:2.2.7"
library "redis.clients:jedis:4.2.2" library "redis.clients:jedis:4.2.3"
library "org.mariadb.jdbc:mariadb-java-client:3.0.4" library "org.mariadb.jdbc:mariadb-java-client:3.0.6"
library "com.zaxxer:HikariCP:5.0.1" library "com.zaxxer:HikariCP:5.0.1"
library "org.apache.httpcomponents:httpclient:4.5.13" library "org.apache.httpcomponents.client5:httpclient5:5.2-beta1"
library "org.apache.commons:commons-lang3:3.12.0" library "org.apache.commons:commons-lang3:3.12.0"
library "org.apache.maven.resolver:maven-resolver-api:1.8.0" library "org.apache.maven.resolver:maven-resolver-api:1.8.2"
library "org.apache.maven.resolver:maven-resolver-impl:1.8.0" library "org.apache.maven.resolver:maven-resolver-impl:1.8.2"
library "org.apache.maven.resolver:maven-resolver-connector-basic:1.8.0" library "org.apache.maven.resolver:maven-resolver-connector-basic:1.8.2"
library "org.apache.maven.resolver:maven-resolver-transport-http:1.8.0" library "org.apache.maven.resolver:maven-resolver-transport-http:1.8.2"
library "org.apache.maven:maven-resolver-provider:3.8.5" library "org.apache.maven:maven-resolver-provider:3.8.5"
library "org.eclipse.jetty:jetty-server:11.0.9" library "org.eclipse.jetty:jetty-server:11.0.11"
library "org.eclipse.jetty:jetty-servlet:11.0.9" library "org.eclipse.jetty:jetty-servlet:11.0.11"
library "org.eclipse.jetty:jetty-proxy:11.0.9" library "org.eclipse.jetty:jetty-proxy:11.0.11"
library "com.google.code.gson:gson:2.9.0" library "com.google.code.gson:gson:2.9.0"
compileOnly "io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT" compileOnly "io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT"
compileOnly("com.github.MilkBowl:VaultAPI:1.7") { compileOnly("com.github.MilkBowl:VaultAPI:1.7.1") {
exclude group: "org.bukkit", module: "bukkit" exclude group: "org.bukkit", module: "bukkit"
} }
implementation "org.bstats:bstats-base:3.0.0" implementation "org.bstats:bstats-base:3.0.0"
implementation "org.bstats:bstats-bukkit:3.0.0" implementation "org.bstats:bstats-bukkit:3.0.0"
implementation project(":api")
} }
group = rootProject.group group = rootProject.group

View File

@ -2,19 +2,12 @@ package dev.plex;
import dev.plex.admin.Admin; import dev.plex.admin.Admin;
import dev.plex.admin.AdminList; import dev.plex.admin.AdminList;
import dev.plex.api.PlexApi;
import dev.plex.api.PlexApiProvider;
import dev.plex.api.plugin.PlexPlugin;
import dev.plex.cache.DataUtils; import dev.plex.cache.DataUtils;
import dev.plex.cache.PlayerCache; import dev.plex.cache.PlayerCache;
import dev.plex.config.Config; import dev.plex.config.Config;
import dev.plex.handlers.CommandHandler; import dev.plex.handlers.CommandHandler;
import dev.plex.handlers.ListenerHandler; import dev.plex.handlers.ListenerHandler;
import dev.plex.hook.VaultHook;
import dev.plex.listener.impl.ChatListener;
import dev.plex.module.ModuleManager; import dev.plex.module.ModuleManager;
import dev.plex.permission.handler.NativePermissionHandler;
import dev.plex.permission.handler.VaultPermissionHandler;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.punishment.PunishmentManager; import dev.plex.punishment.PunishmentManager;
import dev.plex.rank.RankManager; import dev.plex.rank.RankManager;
@ -33,33 +26,31 @@ import dev.plex.util.BungeeUtil;
import dev.plex.util.PlexLog; import dev.plex.util.PlexLog;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import dev.plex.util.UpdateChecker; import dev.plex.util.UpdateChecker;
import dev.plex.util.redis.MessageUtil;
import dev.plex.world.CustomWorld; import dev.plex.world.CustomWorld;
import java.io.File; import java.io.File;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.bson.conversions.Bson; import net.milkbowl.vault.chat.Chat;
import net.milkbowl.vault.permission.Permission;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
@Getter @Getter
@Setter @Setter
public class Plex extends PlexPlugin implements PlexApiProvider public class Plex extends JavaPlugin
{ {
public static final BuildInfo build = new BuildInfo();
private static Plex plugin; private static Plex plugin;
public Config config; public Config config;
public Config messages; public Config messages;
public Config indefBans; public Config indefBans;
public Config commands; public Config commands;
public Config toggles; public Config toggles;
private PlexProvider provider;
public File modulesFolder; public File modulesFolder;
private StorageType storageType = StorageType.SQLITE; private StorageType storageType = StorageType.SQLITE;
public static final BuildInfo build = new BuildInfo();
private SQLConnection sqlConnection; private SQLConnection sqlConnection;
private MongoConnection mongoConnection; private MongoConnection mongoConnection;
private RedisConnection redisConnection; private RedisConnection redisConnection;
@ -82,6 +73,9 @@ public class Plex extends PlexPlugin implements PlexApiProvider
private UpdateChecker updateChecker; private UpdateChecker updateChecker;
private String system; private String system;
private Permission permissions;
private Chat chat;
public static Plex get() public static Plex get()
{ {
@ -110,8 +104,7 @@ public class Plex extends PlexPlugin implements PlexApiProvider
moduleManager.loadAllModules(); moduleManager.loadAllModules();
moduleManager.loadModules(); moduleManager.loadModules();
this.setChatHandler(new ChatListener.ChatHandlerImpl()); //this.setChatHandler(new ChatListener.ChatHandlerImpl());
} }
@Override @Override
@ -145,21 +138,15 @@ public class Plex extends PlexPlugin implements PlexApiProvider
e.printStackTrace(); e.printStackTrace();
} }
boolean permissions = false; if (system.equals("permissions"))
if (getServer().getPluginManager().isPluginEnabled("Vault"))
{ {
VaultPermissionHandler handler = new VaultPermissionHandler(); if (!getServer().getPluginManager().isPluginEnabled("Vault"))
if (VaultHook.getPermission() != null)
{ {
this.setPermissionHandler(handler); throw new RuntimeException("Vault is required to run on the server if you use permissions!");
permissions = true;
PlexLog.debug("Enabling Vault support for permissions with a permission plugin: " + VaultHook.getPermission().getName());
} }
}
if (!permissions) permissions = setupPermissions();
{ chat = setupChat();
this.setPermissionHandler(new NativePermissionHandler());
} }
updateChecker = new UpdateChecker(); updateChecker = new UpdateChecker();
@ -173,6 +160,8 @@ public class Plex extends PlexPlugin implements PlexApiProvider
{ {
redisConnection.getJedis(); redisConnection.getJedis();
PlexLog.log("Connected to Redis!"); PlexLog.log("Connected to Redis!");
MessageUtil.subscribe();
} }
else else
{ {
@ -221,8 +210,6 @@ public class Plex extends PlexPlugin implements PlexApiProvider
} }
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
provider = new PlexProvider();
moduleManager.enableModules(); moduleManager.enableModules();
} }
@ -284,9 +271,17 @@ public class Plex extends PlexPlugin implements PlexApiProvider
}); });
} }
@Override private Permission setupPermissions()
public PlexApi getApi()
{ {
return provider; RegisteredServiceProvider<Permission> rsp = Bukkit.getServicesManager().getRegistration(Permission.class);
permissions = rsp.getProvider();
return permissions;
}
private Chat setupChat()
{
RegisteredServiceProvider<Chat> rsp = Bukkit.getServicesManager().getRegistration(Chat.class);
chat = rsp.getProvider();
return chat;
} }
} }

View File

@ -1,14 +0,0 @@
package dev.plex;
import dev.plex.api.IPlayerCache;
import dev.plex.api.PlexApi;
import dev.plex.player.PlexPlayer;
public class PlexProvider implements PlexApi
{
@Override
public IPlayerCache<PlexPlayer> getPlayerCache()
{
return Plex.get().getPlayerCache();
}
}

View File

@ -1,7 +1,6 @@
package dev.plex.cache; package dev.plex.cache;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import dev.plex.api.IPlayerCache;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -10,7 +9,7 @@ import java.util.UUID;
* Cache storage * Cache storage
*/ */
public class PlayerCache implements IPlayerCache<PlexPlayer> public class PlayerCache
{ {
/** /**
* A key/value pair where the key is the unique ID of the Plex Player * A key/value pair where the key is the unique ID of the Plex Player

View File

@ -132,6 +132,11 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
{ {
PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId()); PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId());
if (plexPlayer == null)
{
return false;
}
if (plugin.getSystem().equalsIgnoreCase("ranks")) if (plugin.getSystem().equalsIgnoreCase("ranks"))
{ {
if (!plexPlayer.getRankFromString().isAtLeast(getLevel())) if (!plexPlayer.getRankFromString().isAtLeast(getLevel()))
@ -150,7 +155,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
} }
else if (plugin.getSystem().equalsIgnoreCase("permissions")) else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(player, perms.permission())) if (!perms.permission().isEmpty() && !player.hasPermission(perms.permission()))
{ {
send(sender, messageComponent("noPermissionNode", perms.permission())); send(sender, messageComponent("noPermissionNode", perms.permission()));
return true; return true;
@ -186,7 +191,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
} }
else if (plugin.getSystem().equalsIgnoreCase("permissions")) else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(Bukkit.getOfflinePlayer(plexPlayer.getName()), perms.permission())) if (!perms.permission().isEmpty() && !plugin.getPermissions().playerHas(null, Bukkit.getPlayer(plexPlayer.getName()), perms.permission()))
{ {
send(sender, messageComponent("noPermissionNode", perms.permission())); send(sender, messageComponent("noPermissionNode", perms.permission()));
return true; return true;
@ -201,7 +206,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
} }
try try
{ {
Component component = this.execute(sender, isConsole(sender) ? null : (Player) sender, args); Component component = this.execute(sender, isConsole(sender) ? null : (Player)sender, args);
if (component != null) if (component != null)
{ {
send(sender, component); send(sender, component);
@ -287,7 +292,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
{ {
if (!isConsole(sender)) if (!isConsole(sender))
{ {
return checkRank((Player) sender, rank, permission); return checkRank((Player)sender, rank, permission);
} }
if (!sender.getName().equalsIgnoreCase("console")) if (!sender.getName().equalsIgnoreCase("console"))
{ {
@ -305,7 +310,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
} }
else if (plugin.getSystem().equalsIgnoreCase("permissions")) else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(Bukkit.getOfflinePlayer(plexPlayer.getName()), perms.permission())) if (!perms.permission().isEmpty() && !plugin.getPermissions().playerHas(null, Bukkit.getOfflinePlayer(plexPlayer.getName()), perms.permission()))
{ {
throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission)); throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission));
} }
@ -343,7 +348,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
} }
else if (plugin.getSystem().equalsIgnoreCase("permissions")) else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(player, permission)) if (!perms.permission().isEmpty() && !player.hasPermission(perms.permission()))
{ {
throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission)); throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission));
} }
@ -364,7 +369,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
} }
else if (plugin.getSystem().equalsIgnoreCase("permissions")) else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
return !perms.permission().isEmpty() && plugin.getPermissionHandler().hasPermission(player, permission); return !perms.permission().isEmpty() && player.hasPermission(permission);
} }
return false; return false;
} }
@ -382,7 +387,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
{ {
if (!isConsole(sender)) if (!isConsole(sender))
{ {
return checkTab((Player) sender, rank, permission); return checkTab((Player)sender, rank, permission);
} }
return true; return true;
} }
@ -405,7 +410,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC
} }
else if (plugin.getSystem().equalsIgnoreCase("permissions")) else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
return !perms.permission().isEmpty() && plugin.getPermissionHandler().hasPermission(player, permission); return !perms.permission().isEmpty() && player.hasPermission(permission);
} }
return true; return true;
} }

View File

@ -1,9 +1,6 @@
package dev.plex.command.impl; package dev.plex.command.impl;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import dev.plex.api.event.AdminAddEvent;
import dev.plex.api.event.AdminRemoveEvent;
import dev.plex.api.event.AdminSetRankEvent;
import dev.plex.cache.DataUtils; import dev.plex.cache.DataUtils;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
@ -12,13 +9,16 @@ import dev.plex.command.annotation.System;
import dev.plex.command.exception.ConsoleOnlyException; import dev.plex.command.exception.ConsoleOnlyException;
import dev.plex.command.exception.PlayerNotFoundException; import dev.plex.command.exception.PlayerNotFoundException;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.event.AdminAddEvent;
import dev.plex.event.AdminRemoveEvent;
import dev.plex.event.AdminSetRankEvent;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -1,5 +1,6 @@
package dev.plex.command.impl; package dev.plex.command.impl;
import dev.plex.cache.DataUtils;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.annotation.CommandPermissions;
@ -7,9 +8,12 @@ import dev.plex.command.source.RequiredCommandSource;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import dev.plex.util.minimessage.SafeMiniMessage;
import dev.plex.util.redis.MessageUtil;
import java.util.UUID;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.BooleanUtils;
import org.bukkit.Bukkit; import org.apache.commons.lang3.StringUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -24,33 +28,17 @@ public class AdminChatCMD extends PlexCommand
{ {
if (args.length == 0) if (args.length == 0)
{ {
if (playerSender != null) {
PlexPlayer player = DataUtils.getPlayer(playerSender.getUniqueId());
player.setStaffChat(!player.isStaffChat());
return messageComponent("adminChatToggled", BooleanUtils.toStringOnOff(player.isStaffChat()));
}
return usage(); return usage();
} }
adminChat(sender, StringUtils.join(args, " ")); String message = StringUtils.join(args, " ");
plugin.getServer().getConsoleSender().sendMessage(messageComponent("adminChatFormat", sender.getName(), message));
MessageUtil.sendStaffChat(sender, SafeMiniMessage.mmDeserialize(message), PlexUtils.adminChat(sender.getName(), message).toArray(UUID[]::new));
return null; return null;
} }
private void adminChat(CommandSender sender, String message)
{
for (Player player : Bukkit.getOnlinePlayers())
{
if (plugin.getSystem().equalsIgnoreCase("ranks"))
{
PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId());
if (plexPlayer.getRankFromString().isAtLeast(Rank.ADMIN) && plexPlayer.isAdminActive())
{
player.sendMessage(PlexUtils.messageComponent("adminChatFormat", sender.getName(), message));
}
}
else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{
if (plugin.getPermissionHandler().hasPermission(player, "plex.adminchat"))
{
player.sendMessage(PlexUtils.messageComponent("adminChatFormat", sender.getName(), message));
}
}
}
plugin.getServer().getConsoleSender().sendMessage(PlexUtils.messageComponent("adminChatFormat", sender.getName(), message));
}
} }

View File

@ -1,12 +1,12 @@
package dev.plex.command.impl; package dev.plex.command.impl;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import dev.plex.api.event.GameModeUpdateEvent;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.exception.CommandFailException; import dev.plex.command.exception.CommandFailException;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.event.GameModeUpdateEvent;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import java.util.List; import java.util.List;

View File

@ -22,7 +22,7 @@ import java.time.ZonedDateTime;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -7,7 +7,7 @@ import dev.plex.command.source.RequiredCommandSource;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

View File

@ -1,12 +1,12 @@
package dev.plex.command.impl; package dev.plex.command.impl;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import dev.plex.api.event.GameModeUpdateEvent;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.exception.CommandFailException; import dev.plex.command.exception.CommandFailException;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.event.GameModeUpdateEvent;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import java.util.List; import java.util.List;

View File

@ -1,11 +1,11 @@
package dev.plex.command.impl; package dev.plex.command.impl;
import dev.plex.api.event.GameModeUpdateEvent;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.exception.CommandFailException; import dev.plex.command.exception.CommandFailException;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.event.GameModeUpdateEvent;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import java.util.Arrays; import java.util.Arrays;

View File

@ -18,7 +18,7 @@ import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.UUID; import java.util.UUID;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@CommandParameters(name = "localspawn", description = "Teleport to the spawnpoint of the world you are in") @CommandParameters(name = "localspawn", description = "Teleport to the spawnpoint of the world you are in")
@CommandPermissions(level = Rank.OP, permission = "plex.spawnpoint", source = RequiredCommandSource.IN_GAME) @CommandPermissions(level = Rank.OP, permission = "plex.localspawn", source = RequiredCommandSource.IN_GAME)
public class LocalSpawnCMD extends PlexCommand public class LocalSpawnCMD extends PlexCommand
{ {
@Override @Override

View File

@ -16,7 +16,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -7,7 +7,7 @@ import dev.plex.command.source.RequiredCommandSource;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

View File

@ -7,7 +7,7 @@ import dev.plex.command.source.RequiredCommandSource;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

View File

@ -17,8 +17,8 @@ import java.util.List;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.title.Title; import net.kyori.adventure.title.Title;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;

View File

@ -1,12 +1,12 @@
package dev.plex.command.impl; package dev.plex.command.impl;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import dev.plex.api.event.GameModeUpdateEvent;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.exception.CommandFailException; import dev.plex.command.exception.CommandFailException;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.event.GameModeUpdateEvent;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import java.util.List; import java.util.List;

View File

@ -1,12 +1,12 @@
package dev.plex.command.impl; package dev.plex.command.impl;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import dev.plex.api.event.GameModeUpdateEvent;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.exception.CommandFailException; import dev.plex.command.exception.CommandFailException;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.event.GameModeUpdateEvent;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import java.util.List; import java.util.List;

View File

@ -7,11 +7,12 @@ import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.source.RequiredCommandSource; import dev.plex.command.source.RequiredCommandSource;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils;
import dev.plex.util.minimessage.SafeMiniMessage; import dev.plex.util.minimessage.SafeMiniMessage;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -46,7 +47,7 @@ public class TagCMD extends PlexCommand
{ {
return usage("/tag set <prefix>"); return usage("/tag set <prefix>");
} }
String prefix = StringUtils.join(args, " ", 1, args.length); String prefix = PlexUtils.cleanString(StringUtils.join(args, " ", 1, args.length));
Component convertedComponent = SafeMiniMessage.mmDeserializeWithoutEvents(prefix); Component convertedComponent = SafeMiniMessage.mmDeserializeWithoutEvents(prefix);

View File

@ -18,7 +18,7 @@ import dev.plex.util.WebUtils;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -31,6 +31,7 @@ public class ToggleCMD extends PlexCommand
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Explosions" + status("explosions"))); sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Explosions" + status("explosions")));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Fluidspread" + status("fluidspread"))); sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Fluidspread" + status("fluidspread")));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Drops" + status("drops"))); sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Drops" + status("drops")));
sender.sendMessage(PlexUtils.mmDeserialize("<gray> - Redstone" + status("redstone")));
return null; return null;
} }
switch (args[0].toLowerCase()) switch (args[0].toLowerCase())
@ -47,6 +48,10 @@ public class ToggleCMD extends PlexCommand
{ {
return toggle("drops"); return toggle("drops");
} }
case "redstone" ->
{
return toggle("redstone");
}
default -> default ->
{ {
return messageComponent("invalidToggle"); return messageComponent("invalidToggle");

View File

@ -1,6 +1,6 @@
package dev.plex.api.event; package dev.plex.event;
import dev.plex.api.player.IPlexPlayer; import dev.plex.player.PlexPlayer;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -24,7 +24,7 @@ public class AdminAddEvent extends Event
/** /**
* The PlexPlayer that was added * The PlexPlayer that was added
*/ */
private final IPlexPlayer plexPlayer; private final PlexPlayer plexPlayer;
public static HandlerList getHandlerList() public static HandlerList getHandlerList()
{ {

View File

@ -1,6 +1,6 @@
package dev.plex.api.event; package dev.plex.event;
import dev.plex.api.player.IPlexPlayer; import dev.plex.player.PlexPlayer;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -24,7 +24,7 @@ public class AdminRemoveEvent extends Event
/** /**
* The PlexPlayer that was removed * The PlexPlayer that was removed
*/ */
private final IPlexPlayer plexPlayer; private final PlexPlayer plexPlayer;
public static HandlerList getHandlerList() public static HandlerList getHandlerList()
{ {

View File

@ -1,7 +1,7 @@
package dev.plex.api.event; package dev.plex.event;
import dev.plex.api.player.IPlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.api.rank.IRank; import dev.plex.rank.enums.Rank;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -25,12 +25,12 @@ public class AdminSetRankEvent extends Event
/** /**
* The PlexPlayer that was removed * The PlexPlayer that was removed
*/ */
private final IPlexPlayer plexPlayer; private final PlexPlayer plexPlayer;
/** /**
* The rank the player was set to * The rank the player was set to
*/ */
private final IRank rank; private final Rank rank;
public static HandlerList getHandlerList() public static HandlerList getHandlerList()
{ {

View File

@ -1,4 +1,4 @@
package dev.plex.api.event; package dev.plex.event;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View File

@ -1,6 +1,6 @@
package dev.plex.api.event; package dev.plex.event;
import dev.plex.api.player.IPlexPlayer; import dev.plex.player.PlexPlayer;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -16,7 +16,7 @@ public abstract class PunishedPlayerEvent extends PlayerEvent implements Cancell
/** /**
* The player who was punished * The player who was punished
*/ */
protected IPlexPlayer punishedPlayer; protected PlexPlayer punishedPlayer;
/** /**
* Whether the event was cancelled * Whether the event was cancelled
@ -28,9 +28,9 @@ public abstract class PunishedPlayerEvent extends PlayerEvent implements Cancell
* Creates an event object * Creates an event object
* *
* @param punishedPlayer The player who was punished * @param punishedPlayer The player who was punished
* @see IPlexPlayer * @see PlexPlayer
*/ */
protected PunishedPlayerEvent(IPlexPlayer punishedPlayer) protected PunishedPlayerEvent(PlexPlayer punishedPlayer)
{ {
super(Bukkit.getPlayer(punishedPlayer.getUuid())); super(Bukkit.getPlayer(punishedPlayer.getUuid()));
this.punishedPlayer = punishedPlayer; this.punishedPlayer = punishedPlayer;

View File

@ -1,6 +1,6 @@
package dev.plex.api.event; package dev.plex.event;
import dev.plex.api.player.IPlexPlayer; import dev.plex.player.PlexPlayer;
import lombok.Getter; import lombok.Getter;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@ -24,7 +24,7 @@ public class PunishedPlayerFreezeEvent extends PunishedPlayerEvent implements Ca
* @param punishedPlayer The player who was punished * @param punishedPlayer The player who was punished
* @param frozen The new frozen status * @param frozen The new frozen status
*/ */
public PunishedPlayerFreezeEvent(IPlexPlayer punishedPlayer, boolean frozen) public PunishedPlayerFreezeEvent(PlexPlayer punishedPlayer, boolean frozen)
{ {
super(punishedPlayer); super(punishedPlayer);
this.frozen = frozen; this.frozen = frozen;

View File

@ -1,6 +1,6 @@
package dev.plex.api.event; package dev.plex.event;
import dev.plex.api.player.IPlexPlayer; import dev.plex.player.PlexPlayer;
import lombok.Getter; import lombok.Getter;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@ -24,7 +24,7 @@ public class PunishedPlayerLockupEvent extends PunishedPlayerEvent implements Ca
* @param punishedPlayer The player who was punished * @param punishedPlayer The player who was punished
* @param lockedUp The new muted status * @param lockedUp The new muted status
*/ */
public PunishedPlayerLockupEvent(IPlexPlayer punishedPlayer, boolean lockedUp) public PunishedPlayerLockupEvent(PlexPlayer punishedPlayer, boolean lockedUp)
{ {
super(punishedPlayer); super(punishedPlayer);
this.lockedUp = lockedUp; this.lockedUp = lockedUp;

View File

@ -1,6 +1,6 @@
package dev.plex.api.event; package dev.plex.event;
import dev.plex.api.player.IPlexPlayer; import dev.plex.player.PlexPlayer;
import lombok.Getter; import lombok.Getter;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@ -24,7 +24,7 @@ public class PunishedPlayerMuteEvent extends PunishedPlayerEvent implements Canc
* @param punishedPlayer The player who was punished * @param punishedPlayer The player who was punished
* @param muted The new muted status * @param muted The new muted status
*/ */
public PunishedPlayerMuteEvent(IPlexPlayer punishedPlayer, boolean muted) public PunishedPlayerMuteEvent(PlexPlayer punishedPlayer, boolean muted)
{ {
super(punishedPlayer); super(punishedPlayer);
this.muted = muted; this.muted = muted;

View File

@ -1,9 +1,9 @@
package dev.plex.listener.impl; package dev.plex.listener.impl;
import dev.plex.api.event.AdminAddEvent;
import dev.plex.api.event.AdminRemoveEvent;
import dev.plex.api.event.AdminSetRankEvent;
import dev.plex.cache.DataUtils; import dev.plex.cache.DataUtils;
import dev.plex.event.AdminAddEvent;
import dev.plex.event.AdminRemoveEvent;
import dev.plex.event.AdminSetRankEvent;
import dev.plex.listener.PlexListener; import dev.plex.listener.PlexListener;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
@ -17,7 +17,7 @@ public class AdminListener extends PlexListener
public void onAdminAdd(AdminAddEvent event) public void onAdminAdd(AdminAddEvent event)
{ {
String userSender = event.getSender().getName(); String userSender = event.getSender().getName();
PlexPlayer target = (PlexPlayer) event.getPlexPlayer(); PlexPlayer target = (PlexPlayer)event.getPlexPlayer();
if (target.getRankFromString().isAtLeast(Rank.ADMIN)) if (target.getRankFromString().isAtLeast(Rank.ADMIN))
{ {
PlexUtils.broadcast(messageComponent("adminReadded", userSender, target.getName(), target.getRankFromString().getReadable())); PlexUtils.broadcast(messageComponent("adminReadded", userSender, target.getName(), target.getRankFromString().getReadable()));
@ -35,7 +35,7 @@ public class AdminListener extends PlexListener
public void onAdminRemove(AdminRemoveEvent event) public void onAdminRemove(AdminRemoveEvent event)
{ {
String userSender = event.getSender().getName(); String userSender = event.getSender().getName();
PlexPlayer target = (PlexPlayer) event.getPlexPlayer(); PlexPlayer target = (PlexPlayer)event.getPlexPlayer();
target.setAdminActive(false); target.setAdminActive(false);
DataUtils.update(target); DataUtils.update(target);
PlexUtils.broadcast(messageComponent("adminRemoved", userSender, target.getName())); PlexUtils.broadcast(messageComponent("adminRemoved", userSender, target.getName()));
@ -45,8 +45,8 @@ public class AdminListener extends PlexListener
public void onAdminSetRank(AdminSetRankEvent event) public void onAdminSetRank(AdminSetRankEvent event)
{ {
String userSender = event.getSender().getName(); String userSender = event.getSender().getName();
PlexPlayer target = (PlexPlayer) event.getPlexPlayer(); PlexPlayer target = (PlexPlayer)event.getPlexPlayer();
Rank newRank = (Rank) event.getRank(); Rank newRank = (Rank)event.getRank();
target.setRank(newRank.name().toLowerCase()); target.setRank(newRank.name().toLowerCase());
DataUtils.update(target); DataUtils.update(target);
PlexUtils.broadcast(messageComponent("adminSetRank", userSender, target.getName(), newRank.getReadable())); PlexUtils.broadcast(messageComponent("adminSetRank", userSender, target.getName(), newRank.getReadable()));

View File

@ -16,13 +16,10 @@ import org.bukkit.event.block.BlockPlaceEvent;
public class BlockListener extends PlexListener public class BlockListener extends PlexListener
{ {
public List<String> blockedPlayers = new ArrayList<>();
private static final List<Material> blockedBlocks = new ArrayList<>(); private static final List<Material> blockedBlocks = new ArrayList<>();
private static List<String> cachedBlockedBlocksConfig = null;
private static final List<Material> SIGNS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SIGN")).toList(); private static final List<Material> SIGNS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SIGN")).toList();
private static List<String> cachedBlockedBlocksConfig = null;
public List<String> blockedPlayers = new ArrayList<>();
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onBlockPlace(BlockPlaceEvent event) public void onBlockPlace(BlockPlaceEvent event)
@ -38,9 +35,8 @@ public class BlockListener extends PlexListener
{ {
blockedBlocks.add(Material.valueOf(block.toUpperCase())); blockedBlocks.add(Material.valueOf(block.toUpperCase()));
} }
catch (IllegalArgumentException e) catch (IllegalArgumentException ignored)
{ {
//
} }
} }
} }
@ -61,7 +57,7 @@ public class BlockListener extends PlexListener
if (SIGNS.contains(block.getType())) if (SIGNS.contains(block.getType()))
{ {
Sign sign = (Sign) block.getState(); Sign sign = (Sign)block.getState();
boolean anythingChanged = false; boolean anythingChanged = false;
for (int i = 0; i < sign.lines().size(); i++) for (int i = 0; i < sign.lines().size(); i++)
{ {

View File

@ -24,6 +24,6 @@ public class BookListener extends PlexListener
} }
event.setNewBookMeta((BookMeta) event.getNewBookMeta().pages(pages)); event.setNewBookMeta((BookMeta)event.getNewBookMeta().pages(pages));
} }
} }

View File

@ -1,22 +1,20 @@
package dev.plex.listener.impl; package dev.plex.listener.impl;
import dev.plex.api.chat.IChatHandler;
import dev.plex.listener.PlexListener; import dev.plex.listener.PlexListener;
import dev.plex.listener.annotation.Toggleable; import dev.plex.listener.annotation.Toggleable;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import dev.plex.util.minimessage.SafeMiniMessage; import dev.plex.util.minimessage.SafeMiniMessage;
import dev.plex.util.redis.MessageUtil;
import io.papermc.paper.chat.ChatRenderer; import io.papermc.paper.chat.ChatRenderer;
import io.papermc.paper.event.player.AsyncChatEvent; import io.papermc.paper.event.player.AsyncChatEvent;
import java.util.UUID;
import java.util.function.Supplier; import java.util.function.Supplier;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.TextReplacementConfig;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.minimessage.tag.standard.StandardTags;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -24,7 +22,8 @@ import org.jetbrains.annotations.NotNull;
@Toggleable("chat.enabled") @Toggleable("chat.enabled")
public class ChatListener extends PlexListener public class ChatListener extends PlexListener
{ {
private final static TextReplacementConfig URL_REPLACEMENT_CONFIG = TextReplacementConfig
public static final TextReplacementConfig URL_REPLACEMENT_CONFIG = TextReplacementConfig
.builder() .builder()
.match("(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]") .match("(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]")
.replacement((matchResult, builder) -> Component.empty() .replacement((matchResult, builder) -> Component.empty()
@ -32,36 +31,32 @@ public class ChatListener extends PlexListener
.clickEvent(ClickEvent.openUrl( .clickEvent(ClickEvent.openUrl(
matchResult.group() matchResult.group()
))).build(); ))).build();
private final PlexChatRenderer renderer = new PlexChatRenderer();
@EventHandler @EventHandler
public void onChat(AsyncChatEvent event) public void onChat(AsyncChatEvent event)
{ {
plugin.getChatHandler().doChat(event); PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(event.getPlayer().getUniqueId());
} if (plexPlayer.isStaffChat()) {
MessageUtil.sendStaffChat(event.getPlayer(), event.message(), PlexUtils.adminChat(event.getPlayer().getName(), SafeMiniMessage.mmSerialize(event.message())).toArray(UUID[]::new));
public static class ChatHandlerImpl implements IChatHandler plugin.getServer().getConsoleSender().sendMessage(PlexUtils.messageComponent("adminChatFormat", event.getPlayer().getName(), SafeMiniMessage.mmSerialize(event.message())).replaceText(URL_REPLACEMENT_CONFIG));
{ event.setCancelled(true);
private final PlexChatRenderer renderer = new PlexChatRenderer(); return;
@Override
public void doChat(AsyncChatEvent event)
{
PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(event.getPlayer().getUniqueId());
Component prefix = plugin.getRankManager().getPrefix(plexPlayer);
if (prefix != null)
{
renderer.hasPrefix = true;
renderer.prefix = prefix;
}
else
{
renderer.hasPrefix = false;
renderer.prefix = null;
}
event.renderer(renderer);
} }
Component prefix = plugin.getRankManager().getPrefix(plexPlayer);
if (prefix != null)
{
renderer.hasPrefix = true;
renderer.prefix = prefix;
}
else
{
renderer.hasPrefix = false;
renderer.prefix = null;
}
event.renderer(renderer);
} }
public static class PlexChatRenderer implements ChatRenderer public static class PlexChatRenderer implements ChatRenderer
@ -73,7 +68,7 @@ public class ChatListener extends PlexListener
@Override @Override
public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer) public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer)
{ {
String text = PlexUtils.getTextFromComponent(message); String text = PlexUtils.cleanString(PlexUtils.getTextFromComponent(message));
Component component = Component.empty(); Component component = Component.empty();
@ -86,8 +81,12 @@ public class ChatListener extends PlexListener
component = component.append(prefix).append(Component.space()); component = component.append(prefix).append(Component.space());
} }
return component return component
.append(Component.space()) .append(Component.empty())
.append(PlexUtils.mmDeserialize(plugin.config.getString("chat.name-color", "<white>") + SafeMiniMessage.MINI_MESSAGE.serialize(sourceDisplayName))) .append(
source.name().equals(sourceDisplayName) ?
SafeMiniMessage.mmDeserialize(plugin.config.getString("chat.name-color") + SafeMiniMessage.mmSerialize(sourceDisplayName))
: SafeMiniMessage.mmDeserialize(plugin.config.getString("chat.name-color")).append(sourceDisplayName)
)
.append(Component.space()) .append(Component.space())
.append(Component.text("»").color(NamedTextColor.GRAY)) .append(Component.text("»").color(NamedTextColor.GRAY))
.append(Component.space()) .append(Component.space())

View File

@ -11,9 +11,10 @@ import java.util.Locale;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -24,13 +25,16 @@ public class CommandListener extends PlexListener
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
{ {
Bukkit.getOnlinePlayers().stream().filter(pl -> plugin.getPlayerCache().getPlexPlayer(pl.getUniqueId()).isCommandSpy() && hasCommandSpy(plugin.getPlayerCache().getPlexPlayer(pl.getUniqueId()))).forEach(pl -> Bukkit.getOnlinePlayers().stream().filter(pl -> {
PlexPlayer player = plugin.getPlayerCache().getPlexPlayer(pl.getUniqueId());
return player.isCommandSpy() && hasCommandSpy(plugin.getPlayerCache().getPlexPlayer(pl.getUniqueId()));
}).forEach(pl ->
{ {
Player player = event.getPlayer(); Player player = event.getPlayer();
String command = event.getMessage(); String command = event.getMessage();
if (pl != player) if (!pl.getUniqueId().equals(player.getUniqueId()))
{ {
pl.sendMessage(ChatColor.GRAY + player.getName() + ": " + command); pl.sendMessage(Component.text(player.getName() + ": " + command).color(NamedTextColor.GRAY));
} }
}); });
} }
@ -38,10 +42,11 @@ public class CommandListener extends PlexListener
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onCommandBlocking(PlayerCommandPreprocessEvent event) public void onCommandBlocking(PlayerCommandPreprocessEvent event)
{ {
String command = "/" + event.getMessage().replaceFirst("/", "").trim();
Player player = event.getPlayer(); Player player = event.getPlayer();
PlexPlayer plexPlayer = DataUtils.getPlayer(player.getUniqueId()); PlexPlayer plexPlayer = DataUtils.getPlayer(player.getUniqueId());
String commandName = StringUtils.normalizeSpace(event.getMessage()).split(" ")[0].replaceFirst("/", ""); String commandName = StringUtils.normalizeSpace(command).split(" ")[0].replaceFirst("/", "");
String arguments = StringUtils.normalizeSpace(StringUtils.normalizeSpace(event.getMessage()).replace(event.getMessage().split(" ")[0], "")); String arguments = StringUtils.normalizeSpace(StringUtils.normalizeSpace(command).replace(command.split(" ")[0], ""));
PlexLog.debug("Checking Command: {0} with args {1}", commandName, arguments); PlexLog.debug("Checking Command: {0} with args {1}", commandName, arguments);
AtomicReference<BlockedCommand> cmdRef = new AtomicReference<>(); AtomicReference<BlockedCommand> cmdRef = new AtomicReference<>();
PlexLog.debug("Blocked Commands List: " + CommandBlockerService.getBLOCKED_COMMANDS().size()); PlexLog.debug("Blocked Commands List: " + CommandBlockerService.getBLOCKED_COMMANDS().size());
@ -49,7 +54,7 @@ public class CommandListener extends PlexListener
{ {
boolean matches = true; boolean matches = true;
String[] args = blockedCommand.getCommand().split(" "); String[] args = blockedCommand.getCommand().split(" ");
String[] cmdArgs = event.getMessage().replaceFirst("/", "").split(" "); String[] cmdArgs = command.replaceFirst("/", "").split(" ");
for (int i = 0; i < args.length; i++) for (int i = 0; i < args.length; i++)
{ {
if (i + 1 > cmdArgs.length) if (i + 1 > cmdArgs.length)
@ -87,7 +92,7 @@ public class CommandListener extends PlexListener
if (blockedCommand.getRegex() != null) if (blockedCommand.getRegex() != null)
{ {
Pattern pattern = Pattern.compile(blockedCommand.getRegex(), Pattern.CASE_INSENSITIVE); Pattern pattern = Pattern.compile(blockedCommand.getRegex(), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(event.getMessage().replaceFirst("/", "")); Matcher matcher = pattern.matcher(command.replaceFirst("/", ""));
if (matcher.find()) if (matcher.find())
{ {
PlexLog.debug("Player attempted to use a blocked regex"); PlexLog.debug("Player attempted to use a blocked regex");

View File

@ -1,6 +1,6 @@
package dev.plex.listener.impl; package dev.plex.listener.impl;
import dev.plex.api.event.GameModeUpdateEvent; import dev.plex.event.GameModeUpdateEvent;
import dev.plex.listener.PlexListener; import dev.plex.listener.PlexListener;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -28,6 +28,27 @@ public class MobListener extends PlexListener
{ {
private static final List<Material> SPAWN_EGGS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SPAWN_EGG")).toList(); private static final List<Material> SPAWN_EGGS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SPAWN_EGG")).toList();
private static EntityType spawnEggToEntityType(Material mat)
{
EntityType eggType;
try
{
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)
{
return null;
}
return eggType;
}
@EventHandler @EventHandler
public void onEntitySpawn(EntitySpawnEvent event) public void onEntitySpawn(EntitySpawnEvent event)
{ {
@ -56,7 +77,7 @@ public class MobListener extends PlexListener
if (SPAWN_EGGS.contains(itemType)) if (SPAWN_EGGS.contains(itemType))
{ {
Block block = event.getBlock(); Block block = event.getBlock();
Location blockLoc = BlockUtils.relative(block.getLocation(), ((Directional) block.getBlockData()).getFacing()).add(.5, 0, .5); Location blockLoc = BlockUtils.relative(block.getLocation(), ((Directional)block.getBlockData()).getFacing()).add(.5, 0, .5);
EntityType eggType = spawnEggToEntityType(itemType); EntityType eggType = spawnEggToEntityType(itemType);
if (eggType != null) if (eggType != null)
{ {
@ -108,25 +129,4 @@ public class MobListener extends PlexListener
} }
} }
} }
private static EntityType spawnEggToEntityType(Material mat)
{
EntityType eggType;
try
{
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)
{
return null;
}
return eggType;
}
} }

View File

@ -7,10 +7,8 @@ import dev.plex.storage.StorageType;
import dev.plex.util.PermissionsUtil; import dev.plex.util.PermissionsUtil;
import dev.plex.util.PlexLog; import dev.plex.util.PlexLog;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
@ -36,7 +34,8 @@ public class PlayerListener<T> extends PlexListener
{ {
player.setOp(true); player.setOp(true);
PlexLog.debug("Automatically opped " + player.getName() + " since ranks are enabled."); PlexLog.debug("Automatically opped " + player.getName() + " since ranks are enabled.");
} else if (plugin.getSystem().equalsIgnoreCase("permissions")) }
else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
player.setOp(false); player.setOp(false);
PlexLog.debug("Automatically deopped " + player.getName() + " since ranks are disabled."); PlexLog.debug("Automatically deopped " + player.getName() + " since ranks are disabled.");
@ -49,7 +48,8 @@ public class PlayerListener<T> extends PlexListener
plexPlayer.setName(player.getName()); // set the name of the player plexPlayer.setName(player.getName()); // set the name of the player
plexPlayer.setIps(Arrays.asList(player.getAddress().getAddress().getHostAddress().trim())); // set the arraylist of ips plexPlayer.setIps(Arrays.asList(player.getAddress().getAddress().getHostAddress().trim())); // set the arraylist of ips
DataUtils.insert(plexPlayer); // insert data in some wack db DataUtils.insert(plexPlayer); // insert data in some wack db
} else }
else
{ {
plexPlayer = DataUtils.getPlayer(player.getUniqueId()); plexPlayer = DataUtils.getPlayer(player.getUniqueId());
List<String> ips = plexPlayer.getIps(); List<String> ips = plexPlayer.getIps();

View File

@ -1,9 +1,9 @@
package dev.plex.listener.impl; package dev.plex.listener.impl;
import dev.plex.api.event.AdminAddEvent;
import dev.plex.api.event.AdminRemoveEvent;
import dev.plex.api.event.AdminSetRankEvent;
import dev.plex.cache.DataUtils; import dev.plex.cache.DataUtils;
import dev.plex.event.AdminAddEvent;
import dev.plex.event.AdminRemoveEvent;
import dev.plex.event.AdminSetRankEvent;
import dev.plex.listener.PlexListener; import dev.plex.listener.PlexListener;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -25,7 +25,7 @@ public class TabListener extends PlexListener
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onAdminAdd(AdminAddEvent event) public void onAdminAdd(AdminAddEvent event)
{ {
PlexPlayer plexPlayer = (PlexPlayer) event.getPlexPlayer(); PlexPlayer plexPlayer = (PlexPlayer)event.getPlexPlayer();
Player player = event.getPlexPlayer().getPlayer(); Player player = event.getPlexPlayer().getPlayer();
if (player == null) if (player == null)
{ {
@ -37,7 +37,7 @@ public class TabListener extends PlexListener
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onAdminRemove(AdminRemoveEvent event) public void onAdminRemove(AdminRemoveEvent event)
{ {
PlexPlayer plexPlayer = (PlexPlayer) event.getPlexPlayer(); PlexPlayer plexPlayer = (PlexPlayer)event.getPlexPlayer();
Player player = event.getPlexPlayer().getPlayer(); Player player = event.getPlexPlayer().getPlayer();
if (player == null) if (player == null)
{ {
@ -49,7 +49,7 @@ public class TabListener extends PlexListener
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onAdminSetRank(AdminSetRankEvent event) public void onAdminSetRank(AdminSetRankEvent event)
{ {
PlexPlayer plexPlayer = (PlexPlayer) event.getPlexPlayer(); PlexPlayer plexPlayer = (PlexPlayer)event.getPlexPlayer();
Player player = event.getPlexPlayer().getPlayer(); Player player = event.getPlexPlayer().getPlayer();
if (player == null) if (player == null)
{ {

View File

@ -3,13 +3,24 @@ package dev.plex.listener.impl;
import dev.plex.listener.PlexListener; import dev.plex.listener.PlexListener;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
public class TogglesListener extends PlexListener public class TogglesListener extends PlexListener
{ {
@EventHandler @EventHandler
public void onEntityExplode(ExplosionPrimeEvent event) public void onBlockExplode(ExplosionPrimeEvent event)
{
if (!plugin.toggles.getBoolean("explosions"))
{
event.setCancelled(true);
}
}
@EventHandler
public void onEntityExplode(EntityExplodeEvent event)
{ {
if (!plugin.toggles.getBoolean("explosions")) if (!plugin.toggles.getBoolean("explosions"))
{ {
@ -34,4 +45,18 @@ public class TogglesListener extends PlexListener
event.setCancelled(true); event.setCancelled(true);
} }
} }
/* I have no idea if this is the best way to do this
There is a very weird bug where if you try to create a loop using two repeaters and a lever, after disabling
and re-enabling redstone, you are unable to recreate the loop with a lever. Using a redstone torch works fine.
Using a lever works fine also as long as you never toggle redstone.
*/
@EventHandler
public void onBlockRedstone(BlockRedstoneEvent event)
{
if (!plugin.toggles.getBoolean("redstone"))
{
event.setNewCurrent(0);
}
}
} }

View File

@ -1,7 +1,6 @@
package dev.plex.listener.impl; package dev.plex.listener.impl;
import dev.plex.Plex; import dev.plex.Plex;
import dev.plex.cache.DataUtils;
import dev.plex.listener.PlexListener; import dev.plex.listener.PlexListener;
import dev.plex.player.PlexPlayer; import dev.plex.player.PlexPlayer;
import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Rank;
@ -13,7 +12,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -31,42 +30,41 @@ import org.jetbrains.annotations.NotNull;
public class WorldListener extends PlexListener public class WorldListener extends PlexListener
{ {
private final List<String> EDIT_COMMANDS = Arrays.asList("bigtree", "ebigtree", "largetree", "elargetree", private final List<String> EDIT_COMMANDS = Arrays.asList("bigtree", "ebigtree", "largetree", "elargetree", "break", "ebreak", "antioch", "nuke", "editsign", "tree", "etree");
"break", "ebreak", "antioch", "nuke", "editsign", "tree", "etree");
@EventHandler @EventHandler
public void onBlockPlace(BlockPlaceEvent e) public void onBlockPlace(BlockPlaceEvent event)
{ {
if (!checkPermission(e.getPlayer(), true)) if (!canModifyWorld(event.getPlayer(), true))
{ {
e.setCancelled(true); event.setCancelled(true);
} }
} }
@EventHandler @EventHandler
public void onBlockBreak(BlockBreakEvent e) public void onBlockBreak(BlockBreakEvent event)
{ {
if (!checkPermission(e.getPlayer(), true)) if (!canModifyWorld(event.getPlayer(), true))
{ {
e.setCancelled(true); event.setCancelled(true);
} }
} }
@EventHandler @EventHandler
public void onEntitySpawn(EntitySpawnEvent e) public void onEntitySpawn(EntitySpawnEvent event)
{ {
if (e.getEntityType() != EntityType.SLIME) if (event.getEntityType() != EntityType.SLIME)
{ {
return; return;
} }
e.setCancelled(true); event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
{ {
// If the person has permission to modify the world, we don't need to block WorldEdit // If the person has permission to modify the world, we don't need to block WorldEdit
if (checkPermission(event.getPlayer(), false)) if (canModifyWorld(event.getPlayer(), false))
{ {
return; return;
} }
@ -78,8 +76,8 @@ public class WorldListener extends PlexListener
if (command != null) if (command != null)
{ {
// This does check for aliases // This does check for aliases
boolean isWeCommand = command instanceof PluginIdentifiableCommand && ((PluginIdentifiableCommand) command).getPlugin().equals(Bukkit.getPluginManager().getPlugin("WorldEdit")); boolean isWeCommand = command instanceof PluginIdentifiableCommand && ((PluginIdentifiableCommand)command).getPlugin().equals(Bukkit.getPluginManager().getPlugin("WorldEdit"));
boolean isFaweCommand = command instanceof PluginIdentifiableCommand && ((PluginIdentifiableCommand) command).getPlugin().equals(Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit")); boolean isFaweCommand = command instanceof PluginIdentifiableCommand && ((PluginIdentifiableCommand)command).getPlugin().equals(Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit"));
if (isWeCommand || isFaweCommand || EDIT_COMMANDS.contains(message.toLowerCase())) if (isWeCommand || isFaweCommand || EDIT_COMMANDS.contains(message.toLowerCase()))
{ {
event.getPlayer().sendMessage(Component.text("You do not have permission to use that command in this world.").color(NamedTextColor.RED)); event.getPlayer().sendMessage(Component.text("You do not have permission to use that command in this world.").color(NamedTextColor.RED));
@ -88,26 +86,12 @@ public class WorldListener extends PlexListener
} }
} }
// TODO: Add an entry setting in the config.yml and allow checking for all worlds
@EventHandler @EventHandler
public void onWorldTeleport(PlayerTeleportEvent e) public void onWorldTeleport(PlayerTeleportEvent event)
{ {
final World adminworld = Bukkit.getWorld("adminworld"); if (!canEnterWorld(event.getPlayer()))
if (adminworld == null)
{ {
return; event.setCancelled(true);
}
PlexPlayer plexPlayer = DataUtils.getPlayer(e.getPlayer().getUniqueId());
if (e.getTo().getWorld().equals(adminworld))
{
if (plugin.getSystem().equals("ranks") && !plexPlayer.isAdminActive())
{
e.setCancelled(true);
}
else if (plugin.getSystem().equals("permissions") && !plugin.getPermissionHandler().hasPermission(e.getPlayer(), "plex.adminworld.enter"))
{
e.setCancelled(true);
}
} }
} }
@ -152,27 +136,34 @@ public class WorldListener extends PlexListener
return hasAccess; return hasAccess;
} }
private boolean checkPermission(Player player, boolean showMessage) /**
* Check if a Player has the ability to modify the world they are in
*
* @param player The player who wants to modify the world
* @param showMessage Whether the message from the config.yml should be shown
* @return Returns true if the person has the ability to modify the world
*/
private boolean canModifyWorld(Player player, boolean showMessage)
{ {
PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId()); PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId());
World world = player.getWorld(); World world = player.getWorld();
if (plugin.getSystem().equalsIgnoreCase("permissions")) if (plugin.getSystem().equalsIgnoreCase("permissions"))
{ {
String permission = plugin.config.getString("plex." + world.getName().toLowerCase() + ".permission"); String permission = plugin.config.getString("worlds." + world.getName().toLowerCase() + ".modification.permission");
if (permission == null) if (permission == null)
{ {
return true; return true;
} }
if (plugin.getPermissionHandler().hasPermission(player, permission)) if (player.hasPermission(permission))
{ {
return true; return true;
} }
} }
else if (plugin.getSystem().equalsIgnoreCase("ranks")) else if (plugin.getSystem().equalsIgnoreCase("ranks"))
{ {
if (plugin.config.contains("worlds." + world.getName().toLowerCase() + ".requiredLevels")) if (plugin.config.contains("worlds." + world.getName().toLowerCase() + ".modification.requiredLevels"))
{ {
@NotNull List<String> requiredLevel = plugin.config.getStringList("worlds." + world.getName().toLowerCase() + ".requiredLevels"); @NotNull List<String> requiredLevel = plugin.config.getStringList("worlds." + world.getName().toLowerCase() + ".modification.requiredLevels");
if (checkLevel(plexPlayer, requiredLevel.toArray(String[]::new))) if (checkLevel(plexPlayer, requiredLevel.toArray(String[]::new)))
{ {
return true; return true;
@ -186,12 +177,58 @@ public class WorldListener extends PlexListener
if (showMessage) if (showMessage)
{ {
String noEdit = plugin.config.getString("worlds." + world.getName().toLowerCase() + ".noEdit"); String noEdit = plugin.config.getString("worlds." + world.getName().toLowerCase() + ".modification.message");
if (noEdit != null) if (noEdit != null)
{ {
player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(noEdit)); player.sendMessage(MiniMessage.miniMessage().deserialize(noEdit));
} }
} }
return false; return false;
} }
/**
* Check if a Player has the ability to enter the requested world
*
* @param player The player who wants to enter the world
* @return Returns true if the person has the ability to enter the world
*/
private boolean canEnterWorld(Player player)
{
PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId());
World world = player.getWorld();
if (plugin.getSystem().equalsIgnoreCase("permissions"))
{
String permission = plugin.config.getString("worlds." + world.getName().toLowerCase() + ".entry.permission");
if (permission == null)
{
return true;
}
if (player.hasPermission(permission))
{
return true;
}
}
else if (plugin.getSystem().equalsIgnoreCase("ranks"))
{
if (plugin.config.contains("worlds." + world.getName().toLowerCase() + ".entry.requiredLevels"))
{
@NotNull List<String> requiredLevel = plugin.config.getStringList("worlds." + world.getName().toLowerCase() + ".entry.requiredLevels");
if (checkLevel(plexPlayer, requiredLevel.toArray(String[]::new)))
{
return true;
}
}
else
{
return true;
}
}
String noEntry = plugin.config.getString("worlds." + world.getName().toLowerCase() + ".entry.message");
if (noEntry != null)
{
player.sendMessage(MiniMessage.miniMessage().deserialize(noEntry));
}
return false;
}
} }

View File

@ -12,7 +12,6 @@ import java.util.List;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -134,7 +133,7 @@ public class PunishedPlayerMenu extends AbstractMenu
{ {
return; return;
} }
openInv((Player) event.getWhoClicked(), getCurrentInventoryIndex(inv) + 1); openInv((Player)event.getWhoClicked(), getCurrentInventoryIndex(inv) + 1);
} }
else if (item.getItemMeta().displayName().equals(Component.text("Previous Page").color(NamedTextColor.LIGHT_PURPLE))) else if (item.getItemMeta().displayName().equals(Component.text("Previous Page").color(NamedTextColor.LIGHT_PURPLE)))
{ {
@ -150,23 +149,23 @@ public class PunishedPlayerMenu extends AbstractMenu
{ {
return; return;
} }
openInv((Player) event.getWhoClicked(), getCurrentInventoryIndex(inv) - 1); openInv((Player)event.getWhoClicked(), getCurrentInventoryIndex(inv) - 1);
} }
} }
else if (item.getType() == Material.BARRIER) else if (item.getType() == Material.BARRIER)
{ {
new PunishmentMenu().openInv((Player) event.getWhoClicked(), 0); new PunishmentMenu().openInv((Player)event.getWhoClicked(), 0);
} }
else if (item.getType() == Material.PLAYER_HEAD) else if (item.getType() == Material.PLAYER_HEAD)
{ {
SkullMeta meta = (SkullMeta) item.getItemMeta(); SkullMeta meta = (SkullMeta)item.getItemMeta();
OfflinePlayer player = meta.getOwningPlayer(); OfflinePlayer player = meta.getOwningPlayer();
assert player != null; assert player != null;
PlexPlayer punishedPlayer = DataUtils.getPlayer(player.getUniqueId()) == null ? null : Plex.get().getPlayerCache().getPlexPlayer(player.getUniqueId()); PlexPlayer punishedPlayer = DataUtils.getPlayer(player.getUniqueId()) == null ? null : Plex.get().getPlayerCache().getPlexPlayer(player.getUniqueId());
if (punishedPlayer == null) if (punishedPlayer == null)
{ {
event.getWhoClicked().sendMessage(ChatColor.RED + "This player does not exist. Try doing /punishments <player> instead."); event.getWhoClicked().sendMessage(Component.text("This player does not exist. Try doing /punishments <player> instead.").color(NamedTextColor.RED));
event.getWhoClicked().closeInventory(); event.getWhoClicked().closeInventory();
return; return;
} }

View File

@ -6,8 +6,9 @@ import dev.plex.player.PlexPlayer;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import dev.plex.util.menu.AbstractMenu; import dev.plex.util.menu.AbstractMenu;
import java.util.List; import java.util.List;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -71,7 +72,7 @@ public class PunishmentMenu extends AbstractMenu
ItemStack item = new ItemStack(Material.PLAYER_HEAD); ItemStack item = new ItemStack(Material.PLAYER_HEAD);
SkullMeta meta = (SkullMeta) item.getItemMeta(); SkullMeta meta = (SkullMeta)item.getItemMeta();
meta.setOwningPlayer(players); meta.setOwningPlayer(players);
meta.displayName(PlexUtils.mmDeserialize("<!italic><yellow>" + players.getName())); meta.displayName(PlexUtils.mmDeserialize("<!italic><yellow>" + players.getName()));
item.setItemMeta(meta); item.setItemMeta(meta);
@ -121,7 +122,7 @@ public class PunishmentMenu extends AbstractMenu
{ {
return; return;
} }
openInv((Player) event.getWhoClicked(), getCurrentInventoryIndex(inv) + 1); openInv((Player)event.getWhoClicked(), getCurrentInventoryIndex(inv) + 1);
} }
else if (item.getItemMeta().displayName().equals(PlexUtils.mmDeserialize("<light_purple>Previous Page"))) else if (item.getItemMeta().displayName().equals(PlexUtils.mmDeserialize("<light_purple>Previous Page")))
{ {
@ -137,23 +138,23 @@ public class PunishmentMenu extends AbstractMenu
{ {
return; return;
} }
openInv((Player) event.getWhoClicked(), getCurrentInventoryIndex(inv) - 1); openInv((Player)event.getWhoClicked(), getCurrentInventoryIndex(inv) - 1);
} }
} }
else if (item.getType() == Material.PLAYER_HEAD) else if (item.getType() == Material.PLAYER_HEAD)
{ {
SkullMeta meta = (SkullMeta) item.getItemMeta(); SkullMeta meta = (SkullMeta)item.getItemMeta();
OfflinePlayer player = meta.getOwningPlayer(); OfflinePlayer player = meta.getOwningPlayer();
assert player != null; assert player != null;
PlexPlayer punishedPlayer = DataUtils.getPlayer(player.getUniqueId()); PlexPlayer punishedPlayer = DataUtils.getPlayer(player.getUniqueId());
if (punishedPlayer == null) if (punishedPlayer == null)
{ {
event.getWhoClicked().sendMessage(ChatColor.RED + "This player does not exist. Try doing /punishments <player> instead."); event.getWhoClicked().sendMessage(Component.text("This player does not exist. Try doing /punishments <player> instead.").color(NamedTextColor.RED));
event.getWhoClicked().closeInventory(); event.getWhoClicked().closeInventory();
return; return;
} }
new PunishedPlayerMenu(punishedPlayer).openInv((Player) event.getWhoClicked(), 0); new PunishedPlayerMenu(punishedPlayer).openInv((Player)event.getWhoClicked(), 0);
} }
} }

View File

@ -21,10 +21,11 @@ public class ToggleMenu extends AbstractMenu implements PlexBase
public ToggleMenu() public ToggleMenu()
{ {
super("§a§lToggles"); super("§a§lToggles");
Inventory inventory = Bukkit.createInventory(null, 54, PlexUtils.mmDeserialize("Toggles")); Inventory inventory = Bukkit.createInventory(null, 9, PlexUtils.mmDeserialize("Toggles"));
resetExplosionItem(inventory); resetExplosionItem(inventory);
resetFluidspreadItem(inventory); resetFluidspreadItem(inventory);
resetDropsItem(inventory); resetDropsItem(inventory);
resetRedstoneItem(inventory);
inventories.add(inventory); inventories.add(inventory);
} }
@ -77,6 +78,12 @@ public class ToggleMenu extends AbstractMenu implements PlexBase
resetDropsItem(inv); resetDropsItem(inv);
event.getWhoClicked().sendMessage(PlexUtils.mmDeserialize("<gray>Toggled drops.")); event.getWhoClicked().sendMessage(PlexUtils.mmDeserialize("<gray>Toggled drops."));
} }
if (item.getType() == Material.REDSTONE)
{
plugin.toggles.set("redstone", !plugin.toggles.getBoolean("redstone"));
resetRedstoneItem(inv);
event.getWhoClicked().sendMessage(PlexUtils.mmDeserialize("<gray>Toggled redstone."));
}
} }
public int getCurrentInventoryIndex(Inventory inventory) public int getCurrentInventoryIndex(Inventory inventory)
@ -125,4 +132,14 @@ public class ToggleMenu extends AbstractMenu implements PlexBase
feather.setItemMeta(featherItemMeta); feather.setItemMeta(featherItemMeta);
inventory.setItem(2, feather); inventory.setItem(2, feather);
} }
private void resetRedstoneItem(Inventory inventory)
{
ItemStack redstone = new ItemStack(Material.REDSTONE);
ItemMeta redstoneItemMeta = redstone.getItemMeta();
redstoneItemMeta.displayName(PlexUtils.mmDeserialize("<light_purple>Redstone"));
redstoneItemMeta.lore(List.of(PlexUtils.mmDeserialize("<yellow>Redstone is " + (plugin.toggles.getBoolean("redstone") ? "<green>enabled" : "<red>disabled"))));
redstone.setItemMeta(redstoneItemMeta);
inventory.setItem(3, redstone);
}
} }

View File

@ -22,7 +22,6 @@ import org.bukkit.configuration.file.YamlConfiguration;
@Getter @Getter
public class ModuleManager public class ModuleManager
{ {
private final List<PlexModule> modules = Lists.newArrayList(); private final List<PlexModule> modules = Lists.newArrayList();
private final LibraryLoader libraryLoader; private final LibraryLoader libraryLoader;
@ -67,7 +66,7 @@ public class ModuleManager
PlexModuleFile plexModuleFile = new PlexModuleFile(name, main, description, version); PlexModuleFile plexModuleFile = new PlexModuleFile(name, main, description, version);
plexModuleFile.setLibraries(libraries); plexModuleFile.setLibraries(libraries);
Class<? extends PlexModule> module = (Class<? extends PlexModule>) Class.forName(main, true, loader); Class<? extends PlexModule> module = (Class<? extends PlexModule>)Class.forName(main, true, loader);
PlexModule plexModule = module.getConstructor().newInstance(); PlexModule plexModule = module.getConstructor().newInstance();
plexModule.setPlex(Plex.get()); plexModule.setPlex(Plex.get());
@ -142,7 +141,7 @@ public class ModuleManager
{ {
try try
{ {
((URLClassLoader) module.getClass().getClassLoader()).close(); ((URLClassLoader)module.getClass().getClassLoader()).close();
} }
catch (IOException e) catch (IOException e)
{ {

View File

@ -4,11 +4,13 @@ import com.google.common.collect.Lists;
import dev.plex.Plex; import dev.plex.Plex;
import dev.plex.command.PlexCommand; import dev.plex.command.PlexCommand;
import dev.plex.listener.PlexListener; import dev.plex.listener.PlexListener;
import dev.plex.util.PlexLog;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import lombok.AccessLevel; import lombok.AccessLevel;
@ -46,22 +48,42 @@ public abstract class PlexModule
{ {
} }
/**
* Registers a PlexListener within a module
*
* @param listener The PlexListener to be registered
*/
public void registerListener(PlexListener listener) public void registerListener(PlexListener listener)
{ {
listeners.add(listener); listeners.add(listener);
} }
/**
* Unregisters a PlexListener. Handled by Plex automatically
*
* @param listener The PlexListener to be registered
*/
public void unregisterListener(PlexListener listener) public void unregisterListener(PlexListener listener)
{ {
listeners.remove(listener); listeners.remove(listener);
HandlerList.unregisterAll(listener); HandlerList.unregisterAll(listener);
} }
/**
* Registers a PlexCommand within a module
*
* @param command The PlexCommand to be registered
*/
public void registerCommand(PlexCommand command) public void registerCommand(PlexCommand command)
{ {
commands.add(command); commands.add(command);
} }
/**
* Unregisters a PlexCommand. Handled by Plex automatically
*
* @param command The PlexCommand to be registered
*/
public void unregisterCommand(PlexCommand command) public void unregisterCommand(PlexCommand command)
{ {
commands.remove(command); commands.remove(command);
@ -72,6 +94,41 @@ public abstract class PlexModule
return commands.stream().filter(plexCommand -> plexCommand.getName().equalsIgnoreCase(name) || plexCommand.getAliases().stream().map(String::toLowerCase).toList().contains(name.toLowerCase(Locale.ROOT))).findFirst().orElse(null); return commands.stream().filter(plexCommand -> plexCommand.getName().equalsIgnoreCase(name) || plexCommand.getAliases().stream().map(String::toLowerCase).toList().contains(name.toLowerCase(Locale.ROOT))).findFirst().orElse(null);
} }
/**
* Adds a message to the messages.yml file
*
* @param message The key value for the message
* @param initValue The message itself
*/
public void addDefaultMessage(String message, Object initValue)
{
if (plex.messages.getString(message) == null)
{
plex.messages.set(message, initValue);
plex.messages.save();
PlexLog.debug("'{0}' message added from " + plexModuleFile.getName(), message);
}
}
/**
* Adds a message to the messages.yml with a comment
*
* @param message The key value for the message
* @param initValue The message itself
* @param comments The comments to be placed above the message
*/
public void addDefaultMessage(String message, Object initValue, String... comments)
{
if (plex.messages.getString(message) == null)
{
plex.messages.set(message, initValue);
plex.messages.save();
plex.messages.setComments(message, Arrays.asList(comments));
plex.messages.save();
PlexLog.debug("'{0}' message added from " + plexModuleFile.getName(), message);
}
}
@Nullable @Nullable
public InputStream getResource(@NotNull String filename) public InputStream getResource(@NotNull String filename)
{ {

View File

@ -105,7 +105,7 @@ public class LibraryLoader
DependencyResult result; DependencyResult result;
try try
{ {
result = repository.resolveDependencies(session, new DependencyRequest(new CollectRequest((Dependency) null, dependencies, repositories), null)); result = repository.resolveDependencies(session, new DependencyRequest(new CollectRequest((Dependency)null, dependencies, repositories), null));
} }
catch (DependencyResolutionException ex) catch (DependencyResolutionException ex)
{ {

View File

@ -1,7 +0,0 @@
package dev.plex.permission.handler;
import dev.plex.api.permission.IPermissionHandler;
public class NativePermissionHandler implements IPermissionHandler
{
}

View File

@ -1,28 +0,0 @@
package dev.plex.permission.handler;
import dev.plex.api.permission.IPermissionHandler;
import dev.plex.hook.VaultHook;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@Getter
public class VaultPermissionHandler implements IPermissionHandler
{
@Override
public boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission)
{
if (!Bukkit.getPluginManager().isPluginEnabled("Vault"))
{
return IPermissionHandler.super.hasPermission(player, permission);
}
if (VaultHook.getPermission() == null)
{
return IPermissionHandler.super.hasPermission(player, permission);
}
return VaultHook.getPermission().playerHas(null, player, permission);
}
}

View File

@ -7,7 +7,6 @@ import dev.morphia.annotations.Id;
import dev.morphia.annotations.IndexOptions; import dev.morphia.annotations.IndexOptions;
import dev.morphia.annotations.Indexed; import dev.morphia.annotations.Indexed;
import dev.plex.Plex; import dev.plex.Plex;
import dev.plex.api.player.IPlexPlayer;
import dev.plex.permission.Permission; import dev.plex.permission.Permission;
import dev.plex.punishment.Punishment; import dev.plex.punishment.Punishment;
import dev.plex.punishment.extra.Note; import dev.plex.punishment.extra.Note;
@ -30,7 +29,7 @@ import org.bukkit.permissions.PermissionAttachment;
@Getter @Getter
@Setter @Setter
@Entity(value = "players", useDiscriminator = false) @Entity(value = "players", useDiscriminator = false)
public class PlexPlayer implements IPlexPlayer public class PlexPlayer
{ {
@Setter(AccessLevel.NONE) @Setter(AccessLevel.NONE)
@Id @Id
@ -42,11 +41,11 @@ public class PlexPlayer implements IPlexPlayer
@Indexed @Indexed
private String name; private String name;
private transient Player player;
private String loginMessage; private String loginMessage;
private String prefix; private String prefix;
private boolean staffChat;
private boolean vanished; private boolean vanished;
private boolean commandSpy; private boolean commandSpy;
@ -79,7 +78,6 @@ public class PlexPlayer implements IPlexPlayer
this.id = uuid.toString().substring(0, 8); this.id = uuid.toString().substring(0, 8);
this.name = ""; this.name = "";
this.player = Bukkit.getPlayer(name);
this.loginMessage = ""; this.loginMessage = "";
this.prefix = ""; this.prefix = "";
@ -107,7 +105,7 @@ public class PlexPlayer implements IPlexPlayer
public String displayName() public String displayName()
{ {
return PlainTextComponentSerializer.plainText().serialize(player.displayName()); return PlainTextComponentSerializer.plainText().serialize(getPlayer().displayName());
} }
public Rank getRankFromString() public Rank getRankFromString()
@ -151,4 +149,8 @@ public class PlexPlayer implements IPlexPlayer
{ {
return new GsonBuilder().registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeSerializer()).create().toJson(this); return new GsonBuilder().registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeSerializer()).create().toJson(this);
} }
public Player getPlayer() {
return Bukkit.getPlayer(this.uuid);
}
} }

View File

@ -11,7 +11,6 @@ import dev.plex.storage.StorageType;
import dev.plex.util.PlexLog; import dev.plex.util.PlexLog;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import dev.plex.util.TimeUtils; import dev.plex.util.TimeUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -23,7 +22,6 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@ -107,7 +105,8 @@ public class PunishmentManager implements PlexBase
{ {
DataUtils.update(plexPlayer); DataUtils.update(plexPlayer);
}); });
} else }
else
{ {
Plex.get().getSqlPunishment().insertPunishment(punishment); Plex.get().getSqlPunishment().insertPunishment(punishment);
} }
@ -118,7 +117,8 @@ public class PunishmentManager implements PlexBase
try try
{ {
return !FileUtils.readFileToString(file, StandardCharsets.UTF_8).trim().isEmpty(); return !FileUtils.readFileToString(file, StandardCharsets.UTF_8).trim().isEmpty();
} catch (IOException e) }
catch (IOException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
@ -164,7 +164,8 @@ public class PunishmentManager implements PlexBase
List<PlexPlayer> players = Plex.get().getMongoPlayerData().getPlayers(); List<PlexPlayer> players = Plex.get().getMongoPlayerData().getPlayers();
return players.stream().map(PlexPlayer::getPunishments).flatMap(Collection::stream).filter(Punishment::isActive).filter(punishment -> punishment.getType() == PunishmentType.BAN || punishment.getType() == PunishmentType.TEMPBAN).toList(); return players.stream().map(PlexPlayer::getPunishments).flatMap(Collection::stream).filter(Punishment::isActive).filter(punishment -> punishment.getType() == PunishmentType.BAN || punishment.getType() == PunishmentType.TEMPBAN).toList();
}); });
} else }
else
{ {
//PlexLog.debug("Checking active bans mysql"); //PlexLog.debug("Checking active bans mysql");
CompletableFuture<List<Punishment>> future = new CompletableFuture<>(); CompletableFuture<List<Punishment>> future = new CompletableFuture<>();
@ -195,7 +196,8 @@ public class PunishmentManager implements PlexBase
.peek(punishment -> punishment.setActive(false)).collect(Collectors.toList())); .peek(punishment -> punishment.setActive(false)).collect(Collectors.toList()));
DataUtils.update(plexPlayer); DataUtils.update(plexPlayer);
}); });
} else }
else
{ {
return Plex.get().getSqlPunishment().removeBan(uuid); return Plex.get().getSqlPunishment().removeBan(uuid);
} }
@ -223,7 +225,8 @@ public class PunishmentManager implements PlexBase
Bukkit.broadcast(PlexUtils.messageComponent("unfrozePlayer", "Plex", Bukkit.getOfflinePlayer(player.getUuid()).getName())); Bukkit.broadcast(PlexUtils.messageComponent("unfrozePlayer", "Plex", Bukkit.getOfflinePlayer(player.getUuid()).getName()));
} }
}.runTaskLater(Plex.get(), 20 * seconds); }.runTaskLater(Plex.get(), 20 * seconds);
} else if (punishment.getType() == PunishmentType.MUTE) }
else if (punishment.getType() == PunishmentType.MUTE)
{ {
player.setMuted(true); player.setMuted(true);
ZonedDateTime now = ZonedDateTime.now(ZoneId.of(TimeUtils.TIMEZONE)); ZonedDateTime now = ZonedDateTime.now(ZoneId.of(TimeUtils.TIMEZONE));

View File

@ -1,6 +1,5 @@
package dev.plex.rank.enums; package dev.plex.rank.enums;
import dev.plex.api.rank.IRank;
import dev.plex.util.PlexUtils; import dev.plex.util.PlexUtils;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -9,7 +8,7 @@ import net.kyori.adventure.text.format.NamedTextColor;
import org.json.JSONObject; import org.json.JSONObject;
@Getter @Getter
public enum Rank implements IRank<Rank> public enum Rank
{ {
IMPOSTOR(-1, "<aqua>an <yellow>Impostor<reset>", "Impostor", "<dark_gray>[<yellow>Imp<dark_gray>]", NamedTextColor.YELLOW), IMPOSTOR(-1, "<aqua>an <yellow>Impostor<reset>", "Impostor", "<dark_gray>[<yellow>Imp<dark_gray>]", NamedTextColor.YELLOW),
NONOP(0, "a <white>Non-Op<reset>", "Non-Op", "", NamedTextColor.WHITE), NONOP(0, "a <white>Non-Op<reset>", "Non-Op", "", NamedTextColor.WHITE),
@ -19,18 +18,14 @@ public enum Rank implements IRank<Rank>
EXECUTIVE(4, "an <red>Executive<reset>", "Executive", "<dark_gray>[<red>Exec<dark_gray>]", NamedTextColor.RED); EXECUTIVE(4, "an <red>Executive<reset>", "Executive", "<dark_gray>[<red>Exec<dark_gray>]", NamedTextColor.RED);
private final int level; private final int level;
@Setter
private String loginMessage;
@Setter
private String readable;
@Setter
private String prefix;
@Getter @Getter
private final NamedTextColor color; private final NamedTextColor color;
@Setter
private String loginMessage;
@Setter
private String readable;
@Setter
private String prefix;
Rank(int level, String loginMessage, String readable, String prefix, NamedTextColor color) Rank(int level, String loginMessage, String readable, String prefix, NamedTextColor color)
{ {

View File

@ -15,18 +15,14 @@ public enum Title
OWNER(2, "<aqua>an <blue>Owner<reset>", "Owner", "<dark_gray>[<blue>Owner<dark_gray>]", NamedTextColor.BLUE); OWNER(2, "<aqua>an <blue>Owner<reset>", "Owner", "<dark_gray>[<blue>Owner<dark_gray>]", NamedTextColor.BLUE);
private final int level; private final int level;
@Setter
private String loginMessage;
@Setter
private String readable;
@Setter
private String prefix;
@Getter @Getter
private final NamedTextColor color; private final NamedTextColor color;
@Setter
private String loginMessage;
@Setter
private String readable;
@Setter
private String prefix;
Title(int level, String loginMessage, String readable, String prefix, NamedTextColor color) Title(int level, String loginMessage, String readable, String prefix, NamedTextColor color)
{ {

View File

@ -1,7 +1,6 @@
package dev.plex.storage; package dev.plex.storage;
import com.mongodb.ConnectionString; import com.mongodb.ConnectionString;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientSettings; import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClients;

View File

@ -67,7 +67,8 @@ public class SQLConnection implements PlexBase
"`login_msg` VARCHAR(2000), " + "`login_msg` VARCHAR(2000), " +
"`prefix` VARCHAR(2000), " + "`prefix` VARCHAR(2000), " +
"`rank` VARCHAR(20), " + "`rank` VARCHAR(20), " +
"`adminActive` BOOLEAN," + "`adminActive` BOOLEAN, " +
"`staffChat` BOOLEAN, " +
"`ips` VARCHAR(2000), " + "`ips` VARCHAR(2000), " +
"`coins` BIGINT, " + "`coins` BIGINT, " +
"`vanished` BOOLEAN, " + "`vanished` BOOLEAN, " +
@ -96,6 +97,11 @@ public class SQLConnection implements PlexBase
"`permission` VARCHAR(1000) NOT NULL," + "`permission` VARCHAR(1000) NOT NULL," +
"`allowed` BOOLEAN" + "`allowed` BOOLEAN" +
");").execute(); ");").execute();
// Plex 1.2
try {
con.prepareStatement("ALTER TABLE `players` ADD COLUMN `staffChat` BOOLEAN DEFAULT false;").execute();
} catch (SQLException ignored) {}
} }
catch (SQLException throwables) catch (SQLException throwables)
{ {

View File

@ -1,15 +1,13 @@
package dev.plex.storage.codec; package dev.plex.storage.codec;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import org.bson.BsonReader; import org.bson.BsonReader;
import org.bson.BsonWriter; import org.bson.BsonWriter;
import org.bson.codecs.Codec; import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext; import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext; import org.bson.codecs.EncoderContext;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import static dev.plex.util.TimeUtils.TIMEZONE; import static dev.plex.util.TimeUtils.TIMEZONE;
public class ZonedDateTimeCodec implements Codec<ZonedDateTime> public class ZonedDateTimeCodec implements Codec<ZonedDateTime>

View File

@ -2,7 +2,7 @@ package dev.plex.util;
import dev.plex.Plex; import dev.plex.Plex;
import java.util.Locale; import java.util.Locale;
import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.math.NumberUtils;
import org.bukkit.GameRule; import org.bukkit.GameRule;
import org.bukkit.World; import org.bukkit.World;
@ -27,8 +27,8 @@ public class GameRuleUtil
private static <T> void readGameRules(World world, String s) private static <T> void readGameRules(World world, String s)
{ {
String gameRule = s.split(";")[0]; String gameRule = s.split(";")[0];
T value = (T) s.split(";")[1]; T value = (T)s.split(";")[1];
GameRule<T> rule = (GameRule<T>) GameRule.getByName(gameRule); GameRule<T> rule = (GameRule<T>)GameRule.getByName(gameRule);
if (rule != null && check(value).getClass().equals(rule.getType())) if (rule != null && check(value).getClass().equals(rule.getType()))
{ {
world.setGameRule(rule, value); world.setGameRule(rule, value);

View File

@ -38,7 +38,7 @@ public class MojangUtils
return null; return null;
} }
client.close(); client.close();
AshconInfo ashconInfo = new GsonBuilder().registerTypeAdapter(ZonedDateTime.class, (JsonDeserializer<ZonedDateTime>) (json1, typeOfT, context) -> AshconInfo ashconInfo = new GsonBuilder().registerTypeAdapter(ZonedDateTime.class, (JsonDeserializer<ZonedDateTime>)(json1, typeOfT, context) ->
ZonedDateTime.ofInstant(Instant.from(DateTimeFormatter.ISO_INSTANT.parse(json1.getAsJsonPrimitive().getAsString())), ZoneId.of(Plex.get().config.getString("server.timezone")))).create().fromJson(json, AshconInfo.class); ZonedDateTime.ofInstant(Instant.from(DateTimeFormatter.ISO_INSTANT.parse(json1.getAsJsonPrimitive().getAsString())), ZoneId.of(Plex.get().config.getString("server.timezone")))).create().fromJson(json, AshconInfo.class);
Arrays.sort(ashconInfo.getUsernameHistories(), (o1, o2) -> Arrays.sort(ashconInfo.getUsernameHistories(), (o1, o2) ->

View File

@ -3,11 +3,12 @@ package dev.plex.util;
import dev.plex.Plex; import dev.plex.Plex;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
import org.bukkit.ChatColor;
public class PlexLog public class PlexLog
{ {
private static final ComponentLogger logger = ComponentLogger.logger("");
public static void log(String message, Object... strings) public static void log(String message, Object... strings)
{ {
for (int i = 0; i < strings.length; i++) for (int i = 0; i < strings.length; i++)
@ -17,12 +18,12 @@ public class PlexLog
message = message.replace("{" + i + "}", strings[i].toString()); message = message.replace("{" + i + "}", strings[i].toString());
} }
} }
Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.YELLOW + "[Plex] " + ChatColor.GRAY + "%s", message)); logger.info(PlexUtils.mmDeserialize("<yellow>[Plex] <gray>" + message));
} }
public static void log(Component component) public static void log(Component component)
{ {
Bukkit.getConsoleSender().sendMessage(Component.text("[Plex] ").color(NamedTextColor.YELLOW).append(component).colorIfAbsent(NamedTextColor.GRAY)); logger.info(Component.text("[Plex] ").color(NamedTextColor.YELLOW).append(component).colorIfAbsent(NamedTextColor.GRAY));
} }
public static void error(String message, Object... strings) public static void error(String message, Object... strings)
@ -34,8 +35,7 @@ public class PlexLog
message = message.replace("{" + i + "}", strings[i].toString()); message = message.replace("{" + i + "}", strings[i].toString());
} }
} }
Bukkit.getConsoleSender().sendMessage(PlexUtils.mmDeserialize("<red>[Plex Error] <gold>" + message)); logger.error(PlexUtils.mmDeserialize("<red>[Plex Error] <gold>" + message));
// Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.RED + "[Plex Error] " + ChatColor.GOLD + "%s", message));
} }
public static void warn(String message, Object... strings) public static void warn(String message, Object... strings)
@ -47,23 +47,21 @@ public class PlexLog
message = message.replace("{" + i + "}", strings[i].toString()); message = message.replace("{" + i + "}", strings[i].toString());
} }
} }
// Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.YELLOW + "[Plex Warning] " + ChatColor.GOLD + "%s", message)); logger.warn(PlexUtils.mmDeserialize("<#eb7c0e>[Plex Warning] <gold>" + message));
Bukkit.getConsoleSender().sendMessage(PlexUtils.mmDeserialize("<#eb7c0e>[Plex Warning] <gold>" + message));
} }
public static void debug(String message, Object... strings) public static void debug(String message, Object... strings)
{ {
for (int i = 0; i < strings.length; i++)
{
if (message.contains("{" + i + "}"))
{
message = message.replace("{" + i + "}", strings[i].toString());
}
}
if (Plex.get().config.getBoolean("debug")) if (Plex.get().config.getBoolean("debug"))
{ {
Bukkit.getConsoleSender().sendMessage(PlexUtils.mmDeserialize("<dark_purple>[Plex Debug] <gold>" + message)); for (int i = 0; i < strings.length; i++)
// Bukkit.getConsoleSender().sendMessage(String.format(ChatColor.DARK_PURPLE + "[Plex Debug] " + ChatColor.GOLD + "%s", message)); {
if (message.contains("{" + i + "}"))
{
message = message.replace("{" + i + "}", strings[i].toString());
}
}
logger.info(PlexUtils.mmDeserialize("<dark_purple>[Plex Debug] <gold>" + message));
} }
} }
} }

View File

@ -1,7 +1,12 @@
package dev.plex.util; package dev.plex.util;
import com.google.common.base.CharMatcher;
import com.google.common.collect.Lists;
import dev.plex.Plex; import dev.plex.Plex;
import dev.plex.PlexBase; import dev.plex.PlexBase;
import dev.plex.listener.impl.ChatListener;
import dev.plex.player.PlexPlayer;
import dev.plex.rank.enums.Rank;
import dev.plex.storage.StorageType; import dev.plex.storage.StorageType;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
@ -10,6 +15,7 @@ import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
@ -53,9 +59,15 @@ public class PlexUtils implements PlexBase
public static void disabledEffectMultiple(Player[] players, Location location) public static void disabledEffectMultiple(Player[] players, Location location)
{ {
if (players.length < 1)
{
return;
}
Particle.CLOUD.builder().location(location).receivers(players).extra(0).offset(0.5, 0.5, 0.5).count(5).spawn(); Particle.CLOUD.builder().location(location).receivers(players).extra(0).offset(0.5, 0.5, 0.5).count(5).spawn();
Particle.FLAME.builder().location(location).receivers(players).extra(0).offset(0.5, 0.5, 0.5).count(3).spawn(); Particle.FLAME.builder().location(location).receivers(players).extra(0).offset(0.5, 0.5, 0.5).count(3).spawn();
Particle.SOUL_FIRE_FLAME.builder().location(location).receivers(players).offset(0.5, 0.5, 0.5).extra(0).count(2).spawn(); Particle.SOUL_FIRE_FLAME.builder().location(location).receivers(players).offset(0.5, 0.5, 0.5).extra(0).count(2)
.spawn();
// note that the sound is played to everyone who is close enough to hear it // note that the sound is played to everyone who is close enough to hear it
players[0].getWorld().playSound(location, org.bukkit.Sound.BLOCK_FIRE_EXTINGUISH, 0.5f, 0.5f); players[0].getWorld().playSound(location, org.bukkit.Sound.BLOCK_FIRE_EXTINGUISH, 0.5f, 0.5f);
} }
@ -124,7 +136,7 @@ public class PlexUtils implements PlexBase
{ {
aprilFools = plugin.config.getBoolean("april_fools"); aprilFools = plugin.config.getBoolean("april_fools");
} }
ZonedDateTime date = ZonedDateTime.now(ZoneId.of(TimeUtils.TIMEZONE)); ZonedDateTime date = ZonedDateTime.now(ZoneId.systemDefault());
if (aprilFools && date.getMonth() == Month.APRIL && date.getDayOfMonth() == 1) if (aprilFools && date.getMonth() == Month.APRIL && date.getDayOfMonth() == 1)
{ {
Component component = MINI_MESSAGE.deserialize(input); // removes existing tags Component component = MINI_MESSAGE.deserialize(input); // removes existing tags
@ -224,4 +236,39 @@ public class PlexUtils implements PlexBase
pl.sendMessage(component); pl.sendMessage(component);
}); });
} }
public static List<UUID> adminChat(String senderName, String message, UUID... ignore)
{
List<UUID> sent = Lists.newArrayList();
for (Player player : Bukkit.getOnlinePlayers())
{
if (Arrays.stream(ignore).anyMatch(uuid -> player.getUniqueId().equals(uuid)))
{
continue;
}
if (plugin.getSystem().equalsIgnoreCase("ranks"))
{
PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId());
if (plexPlayer.getRankFromString().isAtLeast(Rank.ADMIN) && plexPlayer.isAdminActive())
{
player.sendMessage(messageComponent("adminChatFormat", senderName, message).replaceText(ChatListener.URL_REPLACEMENT_CONFIG));
sent.add(player.getUniqueId());
}
}
else if (plugin.getSystem().equalsIgnoreCase("permissions"))
{
if (player.hasPermission("plex.adminchat"))
{
player.sendMessage(PlexUtils.messageComponent("adminChatFormat", senderName, message).replaceText(ChatListener.URL_REPLACEMENT_CONFIG));
sent.add(player.getUniqueId());
}
}
}
return sent;
}
public static String cleanString(String input)
{
return CharMatcher.ascii().retainFrom(input);
}
} }

View File

@ -49,7 +49,7 @@ public class ReflectionsUtil
{ {
if (clazz.getSuperclass() == subType || Arrays.asList(clazz.getInterfaces()).contains(subType)) if (clazz.getSuperclass() == subType || Arrays.asList(clazz.getInterfaces()).contains(subType))
{ {
classes.add((Class<? extends T>) clazz); classes.add((Class<? extends T>)clazz);
} }
}); });
return Collections.unmodifiableSet(classes); return Collections.unmodifiableSet(classes);

View File

@ -9,11 +9,10 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.math.NumberUtils;
public class TimeUtils public class TimeUtils
{ {
public static String TIMEZONE = Plex.get().config.getString("server.timezone");
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mm:ss a z"); private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mm:ss a z");
private static final Set<String> TIMEZONES = Set.of(TimeZone.getAvailableIDs()); private static final Set<String> TIMEZONES = Set.of(TimeZone.getAvailableIDs());
private static final List<String> timeUnits = new ArrayList<>() private static final List<String> timeUnits = new ArrayList<>()
@ -26,6 +25,7 @@ public class TimeUtils
add("mo"); add("mo");
add("y"); add("y");
}}; }};
public static String TIMEZONE = Plex.get().config.getString("server.timezone");
private static int parseInteger(String s) throws NumberFormatException private static int parseInteger(String s) throws NumberFormatException
{ {

View File

@ -38,7 +38,8 @@ public class UpdateChecker implements PlexBase
* > 0 = Number of commits behind * > 0 = Number of commits behind
*/ */
private final String DOWNLOAD_PAGE = "https://ci.plex.us.org/job/"; private final String DOWNLOAD_PAGE = "https://ci.plex.us.org/job/";
private String branch = plugin.config.getString("update_branch"); private final String REPO = plugin.config.getString("update_repo");
private String BRANCH = plugin.config.getString("update_branch");
private int distance = -4; private int distance = -4;
// Adapted from Paper // Adapted from Paper
@ -46,7 +47,7 @@ public class UpdateChecker implements PlexBase
{ {
try try
{ {
HttpURLConnection connection = (HttpURLConnection) new URL("https://api.github.com/repos/" + repo + "/compare/" + branch + "..." + hash).openConnection(); HttpURLConnection connection = (HttpURLConnection)new URL("https://api.github.com/repos/" + repo + "/compare/" + branch + "..." + hash).openConnection();
connection.connect(); connection.connect();
if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND)
{ {
@ -85,15 +86,15 @@ public class UpdateChecker implements PlexBase
// If verbose is 2, it will display all messages // If verbose is 2, it will display all messages
public boolean getUpdateStatusMessage(CommandSender sender, boolean cached, int verbosity) public boolean getUpdateStatusMessage(CommandSender sender, boolean cached, int verbosity)
{ {
if (branch == null) if (BRANCH == null)
{ {
PlexLog.error("You did not specify a branch to use for update checking. Defaulting to master."); PlexLog.error("You did not specify a branch to use for update checking. Defaulting to master.");
branch = "master"; BRANCH = "master";
} }
// If it's -4, it hasn't checked for updates yet // If it's -4, it hasn't checked for updates yet
if (distance == -4) if (distance == -4)
{ {
distance = fetchDistanceFromGitHub("plexusorg/Plex", branch, BuildInfo.getHead()); distance = fetchDistanceFromGitHub(REPO, BRANCH, BuildInfo.getHead());
PlexLog.debug("Never checked for updates, checking now..."); PlexLog.debug("Never checked for updates, checking now...");
} }
else else
@ -101,7 +102,7 @@ public class UpdateChecker implements PlexBase
// If the request isn't asked to be cached, fetch it // If the request isn't asked to be cached, fetch it
if (!cached) if (!cached)
{ {
distance = fetchDistanceFromGitHub("plexusorg/Plex", branch, BuildInfo.getHead()); distance = fetchDistanceFromGitHub(REPO, BRANCH, BuildInfo.getHead());
PlexLog.debug("We have checked for updates before, but this request was not asked to be cached."); PlexLog.debug("We have checked for updates before, but this request was not asked to be cached.");
} }
else else
@ -141,7 +142,7 @@ public class UpdateChecker implements PlexBase
if (verbosity >= 1) if (verbosity >= 1)
{ {
sender.sendMessage(Component.text("Plex is not up to date!", NamedTextColor.RED)); sender.sendMessage(Component.text("Plex is not up to date!", NamedTextColor.RED));
sender.sendMessage(Component.text("Download a new version at: " + DOWNLOAD_PAGE).color(NamedTextColor.RED)); sender.sendMessage(Component.text("Download a new version at: " + DOWNLOAD_PAGE + "Plex").color(NamedTextColor.RED));
sender.sendMessage(Component.text("Or run: /plex update").color(NamedTextColor.RED)); sender.sendMessage(Component.text("Or run: /plex update").color(NamedTextColor.RED));
} }
return true; return true;
@ -155,7 +156,7 @@ public class UpdateChecker implements PlexBase
AtomicReference<String> url = new AtomicReference<>(DOWNLOAD_PAGE + name); AtomicReference<String> url = new AtomicReference<>(DOWNLOAD_PAGE + name);
if (!module) if (!module)
{ {
url.set(url.get() + "/job/" + branch); url.set(url.get() + "/job/" + BRANCH);
} }
PlexLog.debug(url.toString()); PlexLog.debug(url.toString());
HttpGet get = new HttpGet(url + "/lastSuccessfulBuild/api/json"); HttpGet get = new HttpGet(url + "/lastSuccessfulBuild/api/json");

View File

@ -17,7 +17,7 @@ public class WebUtils
try try
{ {
URL u = new URL(url); URL u = new URL(url);
HttpURLConnection connection = (HttpURLConnection) u.openConnection(); HttpURLConnection connection = (HttpURLConnection)u.openConnection();
connection.setRequestMethod("GET"); connection.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line; String line;
@ -39,13 +39,13 @@ public class WebUtils
public static UUID getFromName(String name) public static UUID getFromName(String name)
{ {
JSONObject profile; JSONObject profile;
profile = (JSONObject) simpleGET("https://api.ashcon.app/mojang/v2/user/" + name); profile = (JSONObject)simpleGET("https://api.ashcon.app/mojang/v2/user/" + name);
if (profile == null) if (profile == null)
{ {
PlexLog.error("Profile from Ashcon API returned null!"); PlexLog.error("Profile from Ashcon API returned null!");
return null; return null;
} }
String uuidString = (String) profile.get("uuid"); String uuidString = (String)profile.get("uuid");
return UUID.fromString(uuidString); return UUID.fromString(uuidString);
} }
} }

View File

@ -39,7 +39,7 @@ public class SafeMiniMessage
public static class SafeMiniMessageTagResolver implements TagResolver public static class SafeMiniMessageTagResolver implements TagResolver
{ {
private static final TagResolver STANDARD_RESOLVER = TagResolver.standard(); private static final TagResolver STANDARD_RESOLVER = TagResolver.standard();
private static final List<String> IGNORED_TAGS = ImmutableList.of("obfuscated", "obf", "br", "newline"); private static final List<String> IGNORED_TAGS = ImmutableList.of("obfuscated", "obf", "br", "newline", "lang", "key");
@Override @Override
public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException

View File

@ -0,0 +1,69 @@
package dev.plex.util.redis;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import dev.plex.Plex;
import dev.plex.util.PlexLog;
import dev.plex.util.PlexUtils;
import dev.plex.util.minimessage.SafeMiniMessage;
import java.util.UUID;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.json.JSONException;
import org.json.JSONObject;
import redis.clients.jedis.JedisPubSub;
import static dev.plex.util.PlexUtils.messageComponent;
public class MessageUtil {
private static final Gson GSON = new Gson();
private static JedisPubSub SUBSCRIBER;
public static void subscribe() {
PlexLog.debug("Subscribing");
SUBSCRIBER = new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
try {
JSONObject object = new JSONObject(message);
if (channel.equalsIgnoreCase("staffchat")) {
UUID[] ignore = GSON.fromJson(object.getString("ignore"), new TypeToken<UUID[]>(){}.getType());
String sender = object.getString("sender").isEmpty() ? "CONSOLE": object.getString("sender");
PlexUtils.adminChat(sender, object.getString("message"), ignore);
String[] server = object.getString("server").split(":");
if (!Bukkit.getServer().getIp().equalsIgnoreCase(server[0]) || Bukkit.getServer().getPort() != Integer.parseInt(server[1])) {
Plex.get().getServer().getConsoleSender().sendMessage(messageComponent("adminChatFormat", sender, object.getString("message")));
}
}
} catch (JSONException ignored) {
}
}
@Override
public void onSubscribe(String channel, int subscribedChannels)
{
PlexLog.debug("Subscribed to {0}", channel);
}
};
// SUBSCRIBER.subscribe("staffchat", "chat");
Plex.get().getRedisConnection().runAsync(jedis -> {
jedis.subscribe(SUBSCRIBER, "staffchat", "chat");
});
}
public static void sendStaffChat(CommandSender sender, Component message, UUID... ignore) {
if (!Plex.get().getRedisConnection().isEnabled() || Plex.get().getRedisConnection().getJedis() == null) {
return;
}
String miniMessage = SafeMiniMessage.mmSerialize(message);
JSONObject object = new JSONObject();
object.put("sender", sender instanceof Player player ? player.getName() : "");
object.put("message", miniMessage);
object.put("ignore", GSON.toJson(ignore));
object.put("server", String.format("%s:%s", Bukkit.getServer().getIp(), Bukkit.getServer().getPort()));
Plex.get().getRedisConnection().getJedis().publish("staffchat", object.toString());
}
}

View File

@ -23,7 +23,7 @@ public abstract class NoiseChunkGenerator extends CustomChunkGenerator
{ {
for (int zz = 0; zz < 16; zz++) for (int zz = 0; zz < 16; zz++)
{ {
height = (int) generator.noise(options.getX(), options.getY(), options.getFrequency(), options.getAmplitude(), options.isNormalized()); height = (int)generator.noise(options.getX(), options.getY(), options.getFrequency(), options.getAmplitude(), options.isNormalized());
createLoopChunkData(xx, height, zz, chunk); createLoopChunkData(xx, height, zz, chunk);
} }
} }

View File

@ -24,7 +24,7 @@ public abstract class OctaveChunkGenerator extends CustomChunkGenerator
{ {
for (int zz = 0; zz < 16; zz++) for (int zz = 0; zz < 16; zz++)
{ {
height = (int) generator.noise(options.getX(), options.getY(), options.getFrequency(), options.getAmplitude(), options.isNormalized()); height = (int)generator.noise(options.getX(), options.getY(), options.getFrequency(), options.getAmplitude(), options.isNormalized());
createLoopChunkData(xx, height, zz, chunk); createLoopChunkData(xx, height, zz, chunk);
} }
} }

View File

@ -31,6 +31,7 @@ chat:
# Should Plex use a "true op" system with ranks or only permission nodes # Should Plex use a "true op" system with ranks or only permission nodes
# Options are "permissions" or "ranks" # Options are "permissions" or "ranks"
# NOTE: If you are using a proxy such as BungeeCord or Velocity, it is highly recommended to use permissions
system: ranks system: ranks
data: data:
@ -169,8 +170,9 @@ global_gamerules:
worlds: worlds:
flatlands: flatlands:
name: "Flatlands" name: "Flatlands"
permission: "plex.world.flatlands" modification:
noEdit: "&cYou can't edit this world!" permission: "plex.world.flatlands.modify"
message: "<red>You do not have permission to modify this world."
gameRules: gameRules:
# The gamerules here override the global gamerules # The gamerules here override the global gamerules
- "doWeatherCycle;false" - "doWeatherCycle;false"
@ -182,10 +184,18 @@ worlds:
bedrock: 1 bedrock: 1
adminworld: adminworld:
name: "Admin World" name: "Admin World"
permission: "plex.world.adminworld" entry:
requiredLevels: permission: "plex.world.adminworld.enter"
- "Rank.ADMIN" # Minimum rank requirement # Minimum rank requirement
noEdit: "&cYou can't edit this world!" requiredLevels:
- "Rank.ADMIN"
message: "<red>You do not have permission to enter this world."
modification:
permission: "plex.world.adminworld.modify"
# Minimum rank requirement
requiredLevels:
- "Rank.ADMIN"
message: "<red>You do not have permission to modify this world."
gameRules: gameRules:
- "doWeatherCycle;false" - "doWeatherCycle;false"
- "doDaylightCycle;false" - "doDaylightCycle;false"
@ -196,10 +206,17 @@ worlds:
bedrock: 1 bedrock: 1
masterbuilderworld: masterbuilderworld:
name: "MasterBuilder World" name: "MasterBuilder World"
permission: "plex.world.masterbuilderworld" entry:
requiredLevels: permission: "plex.world.masterbuilderworld.enter"
- "Title.MASTER_BUILDER" # Title has no "minimum", so this will have to be their title requiredLevels:
noEdit: "&cYou can't edit this world!" - "Rank.OP"
message: "<red>You do not have permission to enter this world."
modification:
permission: "plex.world.masterbuilderworld.modify"
requiredLevels:
# Title has no "minimum", so this will have to be their title
- "Title.MASTER_BUILDER"
message: "<red><red>You do not have permission to modify this world."
gameRules: gameRules:
- "doWeatherCycle;false" - "doWeatherCycle;false"
- "doDaylightCycle;false" - "doDaylightCycle;false"
@ -209,8 +226,11 @@ worlds:
stone: 16 stone: 16
bedrock: 1 bedrock: 1
# If you are running a custom fork of Plex, you may wish to check for updates from a different repository.
update_repo: "plexusorg/Plex"
# What branch should Plex fetch updates from? # What branch should Plex fetch updates from?
update_branch: master update_branch: "master"
# Additional logging for debugging # Additional logging for debugging
debug: false debug: false

View File

@ -124,6 +124,8 @@ disabled: "<gray>disabled."
# 0 - The admin / staff member # 0 - The admin / staff member
# 1 - The message # 1 - The message
adminChatFormat: '<dark_gray>[<blue>AdminChat<dark_gray>] <dark_red>{0} <gray>» <gold>{1}' adminChatFormat: '<dark_gray>[<blue>AdminChat<dark_gray>] <dark_red>{0} <gray>» <gold>{1}'
# 0 - Whether it was toggled on or off
adminChatToggled: '<gray>AdminChat was toggled {0}'
# 0 - Maximum length, configured in config.yml # 0 - Maximum length, configured in config.yml
maximumPrefixLength: "<red>The maximum length for a tag may only be {0}." maximumPrefixLength: "<red>The maximum length for a tag may only be {0}."
prefixCleared: "<aqua>Your prefix has been cleared." prefixCleared: "<aqua>Your prefix has been cleared."

View File

@ -7,4 +7,7 @@ explosions: false
fluidspread: true fluidspread: true
# Should drops be enabled? # Should drops be enabled?
drops: true drops: true
# Should redstone be enabled?
redstone: true

View File

@ -1,11 +1,4 @@
pluginManagement {
repositories {
maven { url = uri("https://nexus.telesphoreo.me/repository/gradle-plugins/") }
gradlePluginPortal()
}
}
rootProject.name = "Plex" rootProject.name = "Plex"
include 'api'
include 'server' include 'server'
include 'proxy' include 'proxy'