Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
342060b86e | ||
|
|
b5b30bd9d8 | ||
|
|
55eaac0bd4 | ||
|
|
7583aeade7 | ||
|
|
4be3712082 | ||
|
|
c1e28709ac | ||
|
|
f0965efe73 | ||
|
|
529cdd1e04 | ||
|
|
ce867d4065 | ||
|
|
1eefb78157 | ||
|
|
ff0c8d2a8d | ||
|
|
5a250d854d | ||
|
|
caacf0d8ae | ||
|
|
0f7d4a0548 | ||
|
|
4529f74f0a | ||
|
|
1eaf32983a | ||
|
|
24b0682e8b | ||
|
|
cbf3326de6 | ||
|
|
c4ae9198a4 | ||
|
|
c01798f2e2 | ||
|
|
5de8dbe98a | ||
|
|
00eecd1841 | ||
|
|
54783d657e | ||
|
|
e17b618b18 | ||
|
|
3c8371fe28 | ||
|
|
aafb677d01 | ||
|
|
3a945560a8 | ||
|
|
516156624e | ||
|
|
b6e37edfa3 | ||
|
|
6772d26747 | ||
|
|
145ff70e3d | ||
|
|
cd57c3d37f | ||
|
|
80413bab3a | ||
|
|
319e70696e | ||
|
|
dfda46bcb7 | ||
|
|
848a44c5da | ||
|
|
48a0666c79 | ||
|
|
d828a747db | ||
|
|
7ff7eb20b9 | ||
|
|
bae9d14ae5 | ||
|
|
9b2fc7da65 | ||
|
|
163686cf77 | ||
|
|
895fbcf07e | ||
|
|
004131ddc3 | ||
|
|
e59d116918 | ||
|
|
4ee9d4525a | ||
|
|
3d1672d4ef | ||
|
|
91fc9ee913 | ||
|
|
15604b0ec4 | ||
|
|
8108b949f7 | ||
|
|
aabaa2a332 | ||
|
|
0896a7c63e | ||
|
|
b4b6b19ec3 | ||
|
|
93289f5b24 | ||
|
|
5810652007 | ||
|
|
1e92763497 | ||
|
|
a699c807fd | ||
|
|
7ef48f4202 | ||
|
|
7dc8042de7 | ||
|
|
9d13bd482c | ||
|
|
306ab41f08 | ||
|
|
aea4950398 | ||
|
|
042c27c088 | ||
|
|
b699d2ffad | ||
|
|
0400b0beaf | ||
|
|
88030f82b6 | ||
|
|
e8f8bd5af4 | ||
|
|
bfbcaf1598 | ||
|
|
ffc57dd69a | ||
|
|
07fa5c256b | ||
|
|
c07357b89b | ||
|
|
629d492fad | ||
|
|
693ca51315 | ||
|
|
f65444cfe9 | ||
|
|
464b887ed5 | ||
|
|
1bdf20feb0 | ||
|
|
db89bfb5b5 | ||
|
|
efe2dd22e9 |
No files matched your search
@@ -0,0 +1,30 @@
|
||||
name: Build v2 for PR
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ v2 ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
name: Checkout repo
|
||||
|
||||
- name: Set up JDK 17 (LTS)
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
cache: maven
|
||||
|
||||
- name: Build with Maven
|
||||
run: mvn install --file pom.xml
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
name: Upload Artifact
|
||||
with:
|
||||
name: ChatItem.jar
|
||||
path: target/ChatItem-*.jar
|
||||
@@ -3,8 +3,6 @@ name: Build v2
|
||||
on:
|
||||
push:
|
||||
branches: [ v2 ]
|
||||
pull_request:
|
||||
branches: [ v2 ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
jdk:
|
||||
- openjdk11
|
||||
install:
|
||||
- mvn install
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>me.dadus33</groupId>
|
||||
<artifactId>chatitem</artifactId>
|
||||
<version>2.2.1</version>
|
||||
<version>2.4.2</version>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
@@ -47,7 +47,6 @@
|
||||
</repository>
|
||||
<repository>
|
||||
<id>dv8tion</id>
|
||||
<name>m2-dv8tion</name>
|
||||
<url>https://m2.dv8tion.net/releases</url>
|
||||
</repository>
|
||||
<repository>
|
||||
@@ -74,13 +73,13 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-api</artifactId>
|
||||
<version>2.17.1</version>
|
||||
<version>2.17.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>2.17.1</version>
|
||||
<version>2.17.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -98,7 +97,7 @@
|
||||
<dependency>
|
||||
<groupId>com.comphenix.protocol</groupId>
|
||||
<artifactId>ProtocolLib</artifactId>
|
||||
<version>4.7.0</version>
|
||||
<version>5.0.0-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -108,9 +107,9 @@
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.ProtocolSupport</groupId>
|
||||
<groupId>io.shevchik</groupId>
|
||||
<artifactId>ProtocolSupport</artifactId>
|
||||
<version>f34959c331</version>
|
||||
<version>1.18.2-1-dev</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -134,13 +133,25 @@
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-api</artifactId>
|
||||
<version>4.9.1</version>
|
||||
<version>4.11.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-platform-bungeecord</artifactId>
|
||||
<version>4.1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.discordsrv</groupId>
|
||||
<artifactId>discordsrv</artifactId>
|
||||
<version>1.24.1-SNAPSHOT</version>
|
||||
<version>1.25.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.willfp</groupId>
|
||||
<artifactId>EcoEnchants</artifactId>
|
||||
<version>8.57.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
@@ -163,7 +174,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.5.1</version>
|
||||
<version>3.10.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
@@ -172,7 +183,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.2.4</version>
|
||||
<version>3.3.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
@@ -186,7 +197,25 @@
|
||||
<pattern>com.google.gson</pattern>
|
||||
<shadedPattern>me.dadus33.libs.gson</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>net.kyori.adventure.text.serializer.bungeecord</pattern>
|
||||
<shadedPattern>me.dadus33.libs.kyori.serializer.bungeecord</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
<filters>
|
||||
<filter>
|
||||
<artifact>*</artifact>
|
||||
<excludes>
|
||||
<exclude>net.kyori:examination-api:**</exclude>
|
||||
<exclude>net.kyori:examination-string:**</exclude>
|
||||
<exclude>net.kyori:adventure-platform-api:**</exclude>
|
||||
<exclude>net.kyori:adventure-text-serializer-legacy:**</exclude>
|
||||
<exclude>net.kyori:adventure-text-serializer-gson:**</exclude>
|
||||
<exclude>net.kyori:adventure-platform-facet:**</exclude>
|
||||
<exclude>net.kyori:adventure-nbt:**</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
</filters>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
@@ -194,7 +223,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<version>3.2.2</version>
|
||||
<configuration>
|
||||
<outputDirectory>${export_dir}</outputDirectory>
|
||||
</configuration>
|
||||
|
||||
@@ -1,21 +1,6 @@
|
||||
package me.dadus33.chatitem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v2.ChatListenerChatManager;
|
||||
@@ -30,61 +15,30 @@ import me.dadus33.chatitem.utils.SemVer;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class ChatItem extends JavaPlugin {
|
||||
|
||||
public final static int CFG_VER = 13;
|
||||
public static boolean discordSrvSupport = false, ecoEnchantsSupport = false, hasNewVersion = false;
|
||||
private static ChatItem instance;
|
||||
private final String brandChannelName = Version.getVersion().isNewerOrEquals(Version.V1_13) ? "minecraft:brand" : "MC|Brand";
|
||||
private final List<ChatManager> chatManager = new ArrayList<>();
|
||||
private Log4jFilter filter;
|
||||
private Storage storage;
|
||||
public static boolean discordSrvSupport = false, hasNewVersion = false;
|
||||
private List<ChatManager> chatManager = new ArrayList<>();
|
||||
|
||||
private void chooseManagers() {
|
||||
this.chatManager.forEach((cm) -> cm.unload(this));
|
||||
this.chatManager.clear();
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
String managerName = getStorage().MANAGER;
|
||||
if(managerName.equalsIgnoreCase("both")) {
|
||||
this.chatManager.add(new PacketEditingChatManager(this));
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
getLogger().info("Manager automatically choosed: " + getVisualChatManagers());
|
||||
} else if(managerName.equalsIgnoreCase("auto")) {
|
||||
if(getPluginThatRequirePacket().stream().map(pm::getPlugin).filter(Objects::nonNull).count() > 0 && Version.getVersion().isNewerThan(Version.V1_7))
|
||||
this.chatManager.add(new PacketEditingChatManager(this));
|
||||
else
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
getLogger().info("Manager automatically choosed: " + getVisualChatManagers());
|
||||
} else {
|
||||
if(managerName.equalsIgnoreCase("packet")) {
|
||||
this.chatManager.add(new PacketEditingChatManager(this));
|
||||
getLogger().info("Manager choosed: " + getVisualChatManagers());
|
||||
} else if(managerName.equalsIgnoreCase("chat")) {
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
getLogger().info("Manager choosed: " + getVisualChatManagers());
|
||||
} else {
|
||||
getLogger().severe("----- WARN -----");
|
||||
getLogger().severe("Failed to find manager: " + managerName + ".");
|
||||
getLogger().severe("Please reset your config and/or check wiki for more informations");
|
||||
getLogger().severe("Using default manager: chat.");
|
||||
getLogger().severe("----- WARN -----");
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
}
|
||||
}
|
||||
this.chatManager.forEach((cm) -> cm.load(this, getStorage()));
|
||||
|
||||
NamerManager.load(this);
|
||||
PlayerNamerManager.load(this);
|
||||
}
|
||||
|
||||
private List<String> getPluginThatRequirePacket(){
|
||||
return Arrays.asList("DeluxeChat", "HexNicks", "VentureChat");
|
||||
}
|
||||
|
||||
public static void reload(CommandSender sender) {
|
||||
ChatItem pl = getInstance();
|
||||
if(pl.getConfig() == null || pl.getConfig().getKeys(false).isEmpty())
|
||||
pl.saveDefaultConfig();
|
||||
if (pl.getConfig().getKeys(false).isEmpty())
|
||||
pl.saveDefaultConfig();
|
||||
pl.reloadConfig();
|
||||
String oldChatManager = pl.storage.MANAGER;
|
||||
pl.storage = new Storage(pl.getConfig());
|
||||
@@ -92,91 +46,154 @@ public class ChatItem extends JavaPlugin {
|
||||
pl.filter.setStorage(pl.storage);
|
||||
if (!pl.storage.RELOAD_MESSAGE.isEmpty())
|
||||
sender.sendMessage(pl.storage.RELOAD_MESSAGE);
|
||||
if(!oldChatManager.equalsIgnoreCase(pl.storage.MANAGER))
|
||||
sender.sendMessage(ChatColor.GOLD + "Changing the manager with command reloading CAN produce issue. It's mostly suggested to restart after finding the better manager for you.");
|
||||
if (!oldChatManager.equalsIgnoreCase(pl.storage.MANAGER))
|
||||
sender.sendMessage(ChatColor.GOLD + "Changing the manager with command reloading CAN produce issue. It's mostly suggested to restart after finding the better manager for you.");
|
||||
}
|
||||
|
||||
public static ChatItem getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static void debug(String msg) {
|
||||
if (getInstance().getStorage().DEBUG)
|
||||
getInstance().getLogger().info("[Debug] " + msg.replace(ChatManager.SEPARATOR, 'S'));
|
||||
}
|
||||
|
||||
private void chooseManagers() {
|
||||
this.chatManager.forEach((cm) -> cm.unload(this));
|
||||
this.chatManager.clear();
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
String managerName = getStorage().MANAGER;
|
||||
|
||||
switch (managerName.toLowerCase(Locale.ROOT)) {
|
||||
case "both":
|
||||
this.chatManager.add(new PacketEditingChatManager(this));
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
getLogger().info("Manager automatically chosen: " + getVisualChatManagers());
|
||||
break;
|
||||
case "auto":
|
||||
if (getPluginThatRequirePacket().stream().map(pm::getPlugin).anyMatch(Objects::nonNull) && Version.getVersion().isNewerThan(Version.V1_7))
|
||||
this.chatManager.add(new PacketEditingChatManager(this));
|
||||
else
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
getLogger().info("Manager automatically chosen: " + getVisualChatManagers());
|
||||
break;
|
||||
case "packet":
|
||||
this.chatManager.add(new PacketEditingChatManager(this));
|
||||
getLogger().info("Manager chosen: " + getVisualChatManagers());
|
||||
break;
|
||||
case "chat":
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
getLogger().info("Manager chosen: " + getVisualChatManagers());
|
||||
break;
|
||||
default:
|
||||
getLogger().severe("----- WARN -----");
|
||||
getLogger().severe("Failed to find manager: " + managerName + ".");
|
||||
getLogger().severe("Please reset your config and/or check wiki for more information");
|
||||
getLogger().severe("Using default manager: chat.");
|
||||
getLogger().severe("----- WARN -----");
|
||||
this.chatManager.add(new ChatListenerChatManager(this));
|
||||
break;
|
||||
}
|
||||
|
||||
this.chatManager.forEach((cm) -> cm.load(this, getStorage()));
|
||||
|
||||
NamerManager.load(this);
|
||||
PlayerNamerManager.load(this);
|
||||
}
|
||||
|
||||
private List<String> getPluginThatRequirePacket() {
|
||||
return Arrays.asList("DeluxeChat", "HexNicks", "VentureChat");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
//Save the instance (we're basically a singleton)
|
||||
instance = this;
|
||||
getLogger().info("Detected server version: " + Version.getVersion().name().toLowerCase());
|
||||
|
||||
//Load config
|
||||
saveDefaultConfig();
|
||||
storage = new Storage(getConfig());
|
||||
|
||||
|
||||
//Commands
|
||||
loadCommand(getCommand("cireload"), new CIReloadCommand());
|
||||
loadCommand(getCommand("chatitem"), new ChatItemCommand());
|
||||
|
||||
|
||||
// events
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
pm.registerEvents(new JoinListener(), this);
|
||||
pm.registerEvents(new InventoryListener(), this);
|
||||
|
||||
|
||||
chooseManagers();
|
||||
|
||||
//Initialize Log4J filter (remove ugly console messages)
|
||||
filter = new Log4jFilter(storage);
|
||||
|
||||
if(pm.getPlugin("DiscordSRV") != null) {
|
||||
discordSrvSupport = true;
|
||||
getLogger().info("Load DiscordSRV support.");
|
||||
|
||||
StringJoiner plugins = new StringJoiner(", ");
|
||||
if (pm.getPlugin("DiscordSRV") != null) {
|
||||
discordSrvSupport = true;
|
||||
plugins.add("DiscordSRV");
|
||||
}
|
||||
|
||||
if (pm.getPlugin("EcoEnchants") != null) {
|
||||
ecoEnchantsSupport = true;
|
||||
plugins.add("EcoEnchants");
|
||||
}
|
||||
if(plugins.length() > 0)
|
||||
getLogger().info("Load " + plugins.toString() + " support.");
|
||||
|
||||
if(storage.CHECK_UPDATE) {
|
||||
getServer().getScheduler().runTaskAsynchronously(this, () -> {
|
||||
String urlName = "https://api.spigotmc.org/legacy/update.php?resource=19064";
|
||||
String content = Utils.getFromURL(urlName);
|
||||
if(Strings.isNullOrEmpty(content))
|
||||
return;
|
||||
SemVer currentVersion = SemVer.parse(getDescription().getVersion());
|
||||
if (currentVersion == null)
|
||||
return;
|
||||
SemVer latestVersion = SemVer.parse(content);
|
||||
if (latestVersion != null && latestVersion.isNewerThan(currentVersion)) {
|
||||
hasNewVersion = !content.equalsIgnoreCase(getDescription().getVersion());
|
||||
if(hasNewVersion) {
|
||||
getLogger().info(storage.JOIN_UPDATE_MESSAGE);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
getServer().getMessenger().registerIncomingPluginChannel(this, brandChannelName, (chan, p, msg) -> {
|
||||
String client = new String(msg).substring(1);
|
||||
ChatItem.debug("Detected client " + client + " for " + p.getName());
|
||||
ItemPlayer.getPlayer(p).setClientName(client);
|
||||
});
|
||||
|
||||
if (storage.CHECK_UPDATE) {
|
||||
getServer().getScheduler().runTaskAsynchronously(this, () -> {
|
||||
String urlName = "https://api.spigotmc.org/legacy/update.php?resource=19064";
|
||||
String content = Utils.getFromURL(urlName);
|
||||
if (Strings.isNullOrEmpty(content))
|
||||
return;
|
||||
SemVer currentVersion = SemVer.parse(getDescription().getVersion());
|
||||
if (currentVersion == null)
|
||||
return;
|
||||
SemVer latestVersion = SemVer.parse(content);
|
||||
if (latestVersion != null && latestVersion.isNewerThan(currentVersion)) {
|
||||
hasNewVersion = !content.equalsIgnoreCase(getDescription().getVersion());
|
||||
if (hasNewVersion) {
|
||||
getLogger().info(storage.JOIN_UPDATE_MESSAGE);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void loadCommand(PluginCommand cmd, Object obj) {
|
||||
if(obj instanceof CommandExecutor)
|
||||
cmd.setExecutor((CommandExecutor) obj);
|
||||
if(obj instanceof TabCompleter)
|
||||
cmd.setTabCompleter((TabCompleter) obj);
|
||||
}
|
||||
|
||||
|
||||
public void loadCommand(PluginCommand cmd, Object obj) {
|
||||
if (obj instanceof CommandExecutor)
|
||||
cmd.setExecutor((CommandExecutor) obj);
|
||||
if (obj instanceof TabCompleter)
|
||||
cmd.setTabCompleter((TabCompleter) obj);
|
||||
}
|
||||
|
||||
public Storage getStorage() {
|
||||
return storage;
|
||||
}
|
||||
|
||||
public List<ChatManager> getChatManager() {
|
||||
return chatManager;
|
||||
}
|
||||
|
||||
public String getVisualChatManagers() {
|
||||
StringJoiner sj = new StringJoiner(", ");
|
||||
for(ChatManager cm : chatManager) {
|
||||
sj.add(cm.getName() + " (" + cm.getId() + ")");
|
||||
}
|
||||
return sj.toString();
|
||||
return storage;
|
||||
}
|
||||
|
||||
|
||||
public List<ChatManager> getChatManager() {
|
||||
return chatManager;
|
||||
}
|
||||
|
||||
public String getVisualChatManagers() {
|
||||
StringJoiner sj = new StringJoiner(", ");
|
||||
for (ChatManager cm : chatManager) {
|
||||
sj.add(cm.getName() + " (" + cm.getId() + ")");
|
||||
}
|
||||
return sj.toString();
|
||||
}
|
||||
|
||||
public boolean isHasNewVersion() {
|
||||
return hasNewVersion;
|
||||
}
|
||||
|
||||
public static void debug(String msg) {
|
||||
if(getInstance().getStorage().DEBUG)
|
||||
getInstance().getLogger().info("[Debug] " + msg);
|
||||
return hasNewVersion;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
package me.dadus33.chatitem;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.playerversion.PlayerVersionManager;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
|
||||
public class ItemPlayer {
|
||||
|
||||
private static final ConcurrentHashMap<UUID, ItemPlayer> PLAYERS = new ConcurrentHashMap<>();
|
||||
public static ItemPlayer getPlayer(Player p) {
|
||||
return PLAYERS.computeIfAbsent(p.getUniqueId(), ItemPlayer::new);
|
||||
}
|
||||
public static ItemPlayer getPlayer(UUID uuid) {
|
||||
return PLAYERS.computeIfAbsent(uuid, ItemPlayer::new);
|
||||
}
|
||||
private final UUID uuid;
|
||||
private int protocolVersion = 0;
|
||||
private Version version = null;
|
||||
private String clientName = "unknow";
|
||||
|
||||
public ItemPlayer(UUID uuid) {
|
||||
this.uuid = uuid;
|
||||
Player p = Bukkit.getPlayer(uuid);
|
||||
if(p != null)
|
||||
setVersion(PlayerVersionManager.getPlayerVersionAdapter().getPlayerVersion(p));
|
||||
}
|
||||
|
||||
public UUID getUUID() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return Bukkit.getPlayer(uuid);
|
||||
}
|
||||
|
||||
public String getClientName() {
|
||||
return clientName;
|
||||
}
|
||||
|
||||
public void setClientName(String clientName) {
|
||||
this.clientName = clientName;
|
||||
}
|
||||
|
||||
public int getProtocolVersion() {
|
||||
if(protocolVersion == 0)
|
||||
setProtocolVersion(PlayerVersionManager.getPlayerVersionAdapter().getProtocolVersion(getPlayer()));
|
||||
return protocolVersion;
|
||||
}
|
||||
|
||||
public void setProtocolVersion(int protocolVersion) {
|
||||
this.protocolVersion = protocolVersion;
|
||||
if(version == Version.getVersion()) {// if is default
|
||||
version = Version.getVersion(protocolVersion);
|
||||
ChatItem.debug("Detected version " + version.name() + " (protocol: " + protocolVersion + ")");
|
||||
}
|
||||
}
|
||||
|
||||
public Version getVersion() {
|
||||
if(version == null)
|
||||
setVersion(PlayerVersionManager.getPlayerVersionAdapter().getPlayerVersion(getPlayer()));
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(Version version) {
|
||||
this.version = version;
|
||||
if(protocolVersion == 0)
|
||||
this.protocolVersion = version.MAX_VER;
|
||||
}
|
||||
|
||||
public boolean isBuggedClient() {
|
||||
return getVersion().equals(Version.V1_7) && getClientName().toLowerCase().contains("lunarclient");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ItemPlayer[uuid=" + uuid + ",name=" + (getPlayer() != null ? getPlayer().getName() : "-") + ",version=" + version.name() + ",protocol=" + protocolVersion + ",client=" + clientName + "]";
|
||||
}
|
||||
}
|
||||
@@ -1,30 +1,245 @@
|
||||
package me.dadus33.chatitem.chatmanager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.hook.EcoEnchantsSupport;
|
||||
import me.dadus33.chatitem.itemnamer.NamerManager;
|
||||
import me.dadus33.chatitem.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public abstract class ChatManager {
|
||||
|
||||
public final static HashMap<UUID, Long> COOLDOWNS = new HashMap<>();
|
||||
public final static HashMap<UUID, Long> LAST_INFO_MESSAGE = new HashMap<>();
|
||||
public final static String NAME = "{name}";
|
||||
public final static String AMOUNT = "{amount}";
|
||||
public final static String TIMES = "{times}";
|
||||
public final static String LEFT = "{remaining}";
|
||||
public final static char SEPARATOR = ((char) 0x0007);
|
||||
public final static String SEPARATOR_STR = "\\u0007";
|
||||
|
||||
|
||||
protected Storage s;
|
||||
|
||||
|
||||
public ChatManager() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public abstract String getName();
|
||||
|
||||
|
||||
public abstract String getId();
|
||||
|
||||
|
||||
public Storage getStorage() {
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
public void load(ChatItem pl, Storage s) {
|
||||
this.s = s;
|
||||
}
|
||||
|
||||
|
||||
public abstract void unload(ChatItem pl);
|
||||
|
||||
/**
|
||||
* Get the item in hand as usable one.<br>
|
||||
* Will include, in lore, all informations from other plugins.
|
||||
*
|
||||
* @param p the player
|
||||
* @return the usable item
|
||||
*/
|
||||
public static ItemStack getUsableItem(Player p) {
|
||||
ItemStack item = HandItem.getBetterItem(p).clone();
|
||||
if(ChatItem.ecoEnchantsSupport) {
|
||||
List<String> addLore = EcoEnchantsSupport.getLores(item);
|
||||
if(!addLore.isEmpty()) {
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
List<String> lores = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
||||
for(int i = 0; i < addLore.size(); i++)
|
||||
lores.add(i, addLore.get(i));
|
||||
|
||||
meta.setLore(lores);
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of item according to player & config<br>
|
||||
* Prefer use {@link #getNameOfItem(Player, ItemStack, Storage)} if you want take in count the empty item
|
||||
*
|
||||
* @param p the player
|
||||
* @param item the item
|
||||
* @param c the config
|
||||
* @return the name of item
|
||||
*/
|
||||
public static String styleItem(Player p, ItemStack item, Storage c) {
|
||||
String replacer = c.NAME_FORMAT;
|
||||
String amount = c.AMOUNT_FORMAT;
|
||||
boolean dname = item.hasItemMeta() && item.getItemMeta().hasDisplayName();
|
||||
if (item.getAmount() == 1) {
|
||||
if (c.FORCE_ADD_AMOUNT) {
|
||||
amount = amount.replace(TIMES, "1");
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
} else {
|
||||
replacer = replacer.replace(AMOUNT, "");
|
||||
}
|
||||
} else {
|
||||
amount = amount.replace(TIMES, String.valueOf(item.getAmount()));
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
}
|
||||
if (dname) {
|
||||
String trp = item.getItemMeta().getDisplayName();
|
||||
if (c.COLOR_IF_ALREADY_COLORED) {
|
||||
replacer = replacer.replace(NAME, ChatColor.stripColor(trp));
|
||||
} else {
|
||||
replacer = replacer.replace(NAME, trp);
|
||||
}
|
||||
} else {
|
||||
replacer = replacer.replace(NAME, NamerManager.getName(p, item, c));
|
||||
}
|
||||
return replacer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of item according to player & config
|
||||
*
|
||||
* @param p the player
|
||||
* @param item the item
|
||||
* @param c the config
|
||||
* @return the name of item or hand
|
||||
*/
|
||||
public static String getNameOfItem(Player p, ItemStack item, Storage c) {
|
||||
if(ItemUtils.isEmpty(item)) {
|
||||
if(c.HAND_DISABLED)
|
||||
return c.PLACEHOLDERS.get(0);
|
||||
else
|
||||
return c.HAND_NAME;
|
||||
}
|
||||
String replacer = c.NAME_FORMAT;
|
||||
String amount = c.AMOUNT_FORMAT;
|
||||
boolean dname = item.hasItemMeta() && item.getItemMeta().hasDisplayName();
|
||||
if (item.getAmount() == 1) {
|
||||
if (c.FORCE_ADD_AMOUNT) {
|
||||
amount = amount.replace(TIMES, "1");
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
} else {
|
||||
replacer = replacer.replace(AMOUNT, "");
|
||||
}
|
||||
} else {
|
||||
amount = amount.replace(TIMES, String.valueOf(item.getAmount()));
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
}
|
||||
if (dname) {
|
||||
String trp = item.getItemMeta().getDisplayName();
|
||||
if (c.COLOR_IF_ALREADY_COLORED) {
|
||||
replacer = replacer.replace(NAME, ChatColor.stripColor(trp));
|
||||
} else {
|
||||
replacer = replacer.replace(NAME, trp);
|
||||
}
|
||||
} else {
|
||||
replacer = replacer.replace(NAME, NamerManager.getName(p, item, c));
|
||||
}
|
||||
return replacer;
|
||||
}
|
||||
|
||||
public static String calculateTime(long seconds) {
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
if (seconds < 60) {
|
||||
return seconds + c.SECONDS;
|
||||
}
|
||||
if (seconds < 3600) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int minutes = (int) seconds / 60;
|
||||
builder.append(minutes).append(c.MINUTES);
|
||||
int secs = (int) seconds - minutes * 60;
|
||||
if (secs != 0) {
|
||||
builder.append(" ").append(secs).append(c.SECONDS);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int hours = (int) seconds / 3600;
|
||||
builder.append(hours).append(c.HOURS);
|
||||
int minutes = (int) (seconds / 60) - (hours * 60);
|
||||
if (minutes != 0) {
|
||||
builder.append(" ").append(minutes).append(c.MINUTES);
|
||||
}
|
||||
int secs = (int) (seconds - ((seconds / 60) * 60));
|
||||
if (secs != 0) {
|
||||
builder.append(" ").append(secs).append(c.SECONDS);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
public static boolean canShowItem(Player p, ItemStack item, Cancellable e) {
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
if (c.PERMISSION_ENABLED && !p.hasPermission(c.PERMISSION_NAME)) {
|
||||
if (!c.LET_MESSAGE_THROUGH) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!c.NO_PERMISSION_MESSAGE.isEmpty() && c.SHOW_NO_PERM_NORMAL) {
|
||||
sendIfNeed(p, c.NO_PERMISSION_MESSAGE);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (item.getType().equals(Material.AIR)) {
|
||||
if (c.DENY_IF_NO_ITEM) {
|
||||
e.setCancelled(true);
|
||||
if (!c.DENY_MESSAGE.isEmpty())
|
||||
sendIfNeed(p, c.DENY_MESSAGE);
|
||||
return false;
|
||||
}
|
||||
if (c.HAND_DISABLED) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (c.COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
if (COOLDOWNS.containsKey(p.getUniqueId())) {
|
||||
long start = COOLDOWNS.get(p.getUniqueId());
|
||||
long current = System.currentTimeMillis() / 1000;
|
||||
long elapsed = current - start;
|
||||
if (elapsed >= c.COOLDOWN) {
|
||||
COOLDOWNS.remove(p.getUniqueId());
|
||||
} else {
|
||||
if (!c.LET_MESSAGE_THROUGH) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!c.COOLDOWN_MESSAGE.isEmpty()) {
|
||||
long left = (start + c.COOLDOWN) - current;
|
||||
sendIfNeed(p, c.COOLDOWN_MESSAGE.replace(LEFT, ChatManager.calculateTime(left)));
|
||||
}
|
||||
ChatItem.debug("Cooldown");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
LAST_INFO_MESSAGE.put(p.getUniqueId(), System.currentTimeMillis()); // prevent showing item then send cooldown error message
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void sendIfNeed(Player p, String msg) {
|
||||
Long time = LAST_INFO_MESSAGE.remove(p.getUniqueId());
|
||||
if(time != null) {
|
||||
long diff = System.currentTimeMillis() - time;
|
||||
if(diff < 100)
|
||||
return; // don't show message
|
||||
}
|
||||
p.sendMessage(msg);
|
||||
LAST_INFO_MESSAGE.put(p.getUniqueId(), System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public static void clear(Player p) {
|
||||
COOLDOWNS.remove(p.getUniqueId());
|
||||
LAST_INFO_MESSAGE.remove(p.getUniqueId());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package me.dadus33.chatitem.chatmanager;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
|
||||
public class HandItem {
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static ItemStack getBetterItem(Player p) {
|
||||
if(Version.getVersion().isNewerOrEquals(Version.V1_9)) {
|
||||
ItemStack main = p.getInventory().getItemInMainHand();
|
||||
if(!ItemUtils.isEmpty(main))
|
||||
return main;
|
||||
ItemStack off = p.getInventory().getItemInOffHand();
|
||||
return ItemUtils.isEmpty(off) ? main : off;
|
||||
}
|
||||
return p.getItemInHand();
|
||||
}
|
||||
}
|
||||
@@ -5,15 +5,10 @@ import org.bukkit.event.HandlerList;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulatorCurrent;
|
||||
import me.dadus33.chatitem.chatmanager.v1.listeners.ChatEventListener;
|
||||
import me.dadus33.chatitem.chatmanager.v1.listeners.ChatPacketManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacketManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.IPlayerVersion;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.hooks.DefaultVersionHook;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.hooks.ProtocolSupportHook;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.hooks.ViaVersionHook;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class PacketEditingChatManager extends ChatManager {
|
||||
@@ -23,7 +18,6 @@ public class PacketEditingChatManager extends ChatManager {
|
||||
private final ChatItemPacketManager packetManager;
|
||||
private final ChatEventListener chatEventListener;
|
||||
private final ChatPacketManager chatPacketManager;
|
||||
private IPlayerVersion playerVersionAdapter;
|
||||
|
||||
public PacketEditingChatManager(ChatItem pl) {
|
||||
jsonManipulator = new JSONManipulatorCurrent();
|
||||
@@ -31,6 +25,7 @@ public class PacketEditingChatManager extends ChatManager {
|
||||
chatEventListener = new ChatEventListener(this);
|
||||
chatPacketManager = new ChatPacketManager(this);
|
||||
|
||||
|
||||
//Check for existence of BaseComponent class (only on spigot)
|
||||
try {
|
||||
Class.forName("net.md_5.bungee.api.chat.BaseComponent");
|
||||
@@ -55,16 +50,6 @@ public class PacketEditingChatManager extends ChatManager {
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(chatEventListener, pl);
|
||||
packetManager.getPacketManager().addHandler(chatPacketManager);
|
||||
|
||||
if(Bukkit.getPluginManager().getPlugin("ViaVersion") != null){
|
||||
playerVersionAdapter = new ViaVersionHook();
|
||||
pl.getLogger().info("Loading ViaVersion support ...");
|
||||
} else if(Bukkit.getPluginManager().getPlugin("ProtocolSupport") != null){
|
||||
playerVersionAdapter = new ProtocolSupportHook();
|
||||
pl.getLogger().info("Loading ProtocolSupport support ...");
|
||||
} else {
|
||||
playerVersionAdapter = new DefaultVersionHook();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -74,18 +59,9 @@ public class PacketEditingChatManager extends ChatManager {
|
||||
packetManager.getPacketManager().stop();
|
||||
}
|
||||
|
||||
public JSONManipulator getManipulator(){
|
||||
/*
|
||||
We used to have 2 kinds of JSONManipulators because of my bad understanding of the 1.7 way of parsing JSON chat
|
||||
The interface should however stay as there might be great changes in future versions in JSON parsing (most likely 1.13)
|
||||
*/
|
||||
public JSONManipulatorCurrent getManipulator(){
|
||||
return jsonManipulator;
|
||||
//We just return a new one whenever requested for the moment, should implement a cache of some sort some time though
|
||||
}
|
||||
|
||||
public IPlayerVersion getPlayerVersionAdapter() {
|
||||
return playerVersionAdapter;
|
||||
}
|
||||
|
||||
public boolean supportsChatComponentApi(){
|
||||
return baseComponentAvailable;
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
|
||||
public interface IBaseComponentGetter {
|
||||
|
||||
default boolean hasConditions() {
|
||||
return true;
|
||||
}
|
||||
|
||||
String getBaseComponentAsJSON(ChatItemPacket packet);
|
||||
|
||||
void writeJson(ChatItemPacket packet, String json);
|
||||
}
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
|
||||
public class AdventureComponentGetter implements IBaseComponentGetter {
|
||||
|
||||
private boolean useExtra = false;
|
||||
|
||||
@Override
|
||||
public boolean hasConditions() {
|
||||
try {
|
||||
for (String cl : Arrays.asList("net.kyori.adventure.text.Component",
|
||||
"net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer"))
|
||||
Class.forName(cl);
|
||||
} catch (ClassNotFoundException e) { // can't support this, adventure comp not found
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBaseComponentAsJSON(ChatItemPacket packet) {
|
||||
Component comp = packet.getContent().getSpecificModifier(Component.class).readSafely(0);
|
||||
if(comp == null) {
|
||||
ChatItem.debug("The component is null.");
|
||||
return null;
|
||||
}
|
||||
String json = ComponentSerializer.toString(BungeeComponentSerializer.legacy().serialize(comp).clone());
|
||||
ChatItem.debug("AdventureJSON : " + json.replace(ChatManager.SEPARATOR, 'S'));
|
||||
JsonObject jsonObj = JsonParser.parseString(json).getAsJsonObject();
|
||||
if(jsonObj.has("with")) {
|
||||
JsonObject next = new JsonObject();
|
||||
next.add("extra", jsonObj.get("with"));
|
||||
return next.toString();
|
||||
}
|
||||
useExtra = true;
|
||||
return json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
/*JsonObject next = new JsonObject();
|
||||
next.addProperty("translate", "chat.type.text");
|
||||
if(useExtra)
|
||||
next.add("with", fixParsedArray(JsonParser.parseString(json).getAsJsonObject().getAsJsonArray("extra")));
|
||||
else
|
||||
next.add("extra", fixParsedArray(JsonParser.parseString(json).getAsJsonObject().getAsJsonArray("extra")));*/
|
||||
JsonElement globalElement = JsonParser.parseString(json);
|
||||
JsonArray extraArray = fixParsedArray(globalElement.getAsJsonObject().getAsJsonArray("extra"));
|
||||
String localJson;
|
||||
if(useExtra) {
|
||||
globalElement.getAsJsonObject().add("extra", extraArray);
|
||||
localJson = globalElement.toString();
|
||||
} else {
|
||||
JsonObject next = new JsonObject();
|
||||
next.addProperty("translate", "chat.type.text");
|
||||
next.add("with", extraArray);
|
||||
localJson = next.toString();
|
||||
}
|
||||
ChatItem.debug("Adventure Json: " + json);
|
||||
try {
|
||||
Class<?> packetClass = packet.getPacket().getClass();
|
||||
if(packetClass.getSimpleName().equalsIgnoreCase("PacketPlayOutChat")) {
|
||||
Field componentField = ReflectionUtils.getFirstFieldWith(packetClass, Component.class);
|
||||
if(componentField != null) {
|
||||
componentField.setAccessible(true);
|
||||
componentField.set(packet.getPacket(), BungeeComponentSerializer.legacy().deserialize(ComponentSerializer.parse(localJson)));
|
||||
} else {
|
||||
throw new UnsupportedOperationException("The packet PacketPlayOutChat doesn't have Kyori's field. It has: " + Arrays.asList(packetClass.getDeclaredFields()).stream().map(f -> f.getName() + ": " + f.getType().getName()).collect(Collectors.toList()));
|
||||
}
|
||||
} else if(packetClass.getSimpleName().equalsIgnoreCase("CliendboundSystemChatPacket")) {
|
||||
packet.setPacket(packetClass.getConstructor(Component.class, String.class, int.class).newInstance(BungeeComponentSerializer.legacy().deserialize(ComponentSerializer.parse(localJson)), null, 1));
|
||||
} else {
|
||||
throw new UnsupportedOperationException("The packet " + packetClass.getSimpleName() + " insupported by the AdventureGetter. Please report this.");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public JsonArray fixParsedArray(JsonArray arr) {
|
||||
JsonArray next = new JsonArray();
|
||||
for(JsonElement e : arr) {
|
||||
if(e.isJsonArray()) {
|
||||
JsonObject obj = null;
|
||||
JsonArray extra = new JsonArray();
|
||||
for(JsonElement element : e.getAsJsonArray()) {
|
||||
JsonElement fixed = checkElement(element);
|
||||
if(obj == null && fixed.isJsonObject()) {
|
||||
obj = fixed.getAsJsonObject();
|
||||
} else {
|
||||
extra.add(fixed);
|
||||
}
|
||||
}
|
||||
if(obj != null && extra.size() > 0) {
|
||||
obj.add("extra", extra);
|
||||
}
|
||||
next.add(obj);
|
||||
} else
|
||||
next.add(checkElement(e));
|
||||
}
|
||||
return next;
|
||||
}
|
||||
|
||||
private JsonElement checkElement(JsonElement e) {
|
||||
if(e.isJsonObject()) {
|
||||
JsonObject o = e.getAsJsonObject();
|
||||
if(o.has("hoverEvent")) {// only hover event
|
||||
JsonObject hoverObject = o.getAsJsonObject("hoverEvent");
|
||||
if(hoverObject.get("action").getAsString().equalsIgnoreCase("show_item") && hoverObject.has("value")) {// if it's item to fix
|
||||
String val = hoverObject.get("value").getAsString();
|
||||
// now, we should fix the value
|
||||
val = val.replaceAll("\\\"", "\"");
|
||||
ChatItem.debug("Fixed json: " + ("{" + val.substring(1, val.length() - 1) + "}"));
|
||||
hoverObject.remove("value");
|
||||
JsonElement tagElement = JsonParser.parseString("{" + val.substring(1, val.length() - 1) + "}");
|
||||
tagElement.getAsJsonObject().remove("tag");
|
||||
/*if(tagElement.getAsJsonObject().has("tag")) {
|
||||
JsonElement tag = tagElement.getAsJsonObject().get("tag");
|
||||
if(tag.isJsonObject()) {
|
||||
JsonObject tagObj = tag.getAsJsonObject();
|
||||
tagObj.entrySet().forEach(entry -> {
|
||||
ChatItem.debug("Tag json: " + entry.getKey() + " > " + entry.getValue());
|
||||
JsonElement value = entry.getValue();
|
||||
String sval = value.getAsString();
|
||||
if(Utils.isInteger(sval)) {
|
||||
if(Utils.isByte(sval))
|
||||
tagObj.addProperty(entry.getKey(), sval + "b");
|
||||
else if(Utils.isShort(sval))
|
||||
tagObj.addProperty(entry.getKey(), sval + "s");
|
||||
else if(Utils.isLong(sval))
|
||||
tagObj.addProperty(entry.getKey(), sval + "l");
|
||||
else
|
||||
tagObj.addProperty(entry.getKey(), value + "i");
|
||||
}
|
||||
});
|
||||
}
|
||||
}*/
|
||||
hoverObject.add("contents", tagElement);
|
||||
o.add("hoverEvent", hoverObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
return e;
|
||||
}
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
|
||||
public class BaseComponentGetter implements IBaseComponentGetter {
|
||||
|
||||
@Override
|
||||
public boolean hasConditions() {
|
||||
return Version.getVersion().isNewerOrEquals(Version.V1_8);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBaseComponentAsJSON(ChatItemPacket packet) {
|
||||
BaseComponent[] comps = packet.getContent().getSpecificModifier(BaseComponent[].class).readSafely(0);
|
||||
return comps == null ? null : ComponentSerializer.toString(comps);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
packet.getContent().getSpecificModifier(BaseComponent[].class).write(0, ComponentSerializer.parse(json));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
|
||||
public class ComponentGetter implements IBaseComponentGetter {
|
||||
|
||||
@Override
|
||||
public boolean hasConditions() {
|
||||
return PacketUtils.COMPONENT_CLASS != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBaseComponentAsJSON(ChatItemPacket packet) {
|
||||
Object chatBaseComp = packet.getContent().getSpecificModifier(PacketUtils.COMPONENT_CLASS).readSafely(0);
|
||||
if (chatBaseComp != null) {
|
||||
try {
|
||||
return PacketUtils.CHAT_SERIALIZER.getMethod("a", PacketUtils.COMPONENT_CLASS)
|
||||
.invoke(null, packet.getPacket()).toString();
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
try {
|
||||
packet.getContent().getChatComponents().write(0, PacketUtils.CHAT_SERIALIZER.getMethod("a", String.class).invoke(null, json));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
|
||||
public class IChatBaseComponentGetter implements IBaseComponentGetter {
|
||||
|
||||
private Method serializerGetJson;
|
||||
|
||||
public IChatBaseComponentGetter() {
|
||||
try {
|
||||
for (Method m : PacketUtils.CHAT_SERIALIZER.getDeclaredMethods()) {
|
||||
if (m.getParameterCount() == 1 && m.getParameterTypes()[0].equals(PacketUtils.COMPONENT_CLASS)
|
||||
&& m.getReturnType().equals(String.class)) {
|
||||
serializerGetJson = m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (serializerGetJson == null)
|
||||
ChatItem.getInstance().getLogger().warning(
|
||||
"Failed to find JSON serializer in class: " + PacketUtils.CHAT_SERIALIZER.getCanonicalName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasConditions() {
|
||||
return serializerGetJson != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBaseComponentAsJSON(ChatItemPacket packet) {
|
||||
try {
|
||||
Object obj = packet.getContent().getChatComponents().readSafely(0);
|
||||
return obj == null ? null : (String) serializerGetJson.invoke(null, obj);
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
try {
|
||||
packet.getContent().getChatComponents().write(0, PacketUtils.CHAT_SERIALIZER.getMethod("a", String.class).invoke(null, json));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import net.kyori.adventure.text.Component;
|
||||
|
||||
public class StringComponentGetter implements IBaseComponentGetter{
|
||||
|
||||
@Override
|
||||
public String getBaseComponentAsJSON(ChatItemPacket packet) {
|
||||
String json = packet.getContent().getStrings().readSafely(0);
|
||||
if(json != null && json.startsWith("[") && json.endsWith("]")) { // if used as array instead of json obj
|
||||
JsonArray extra = new JsonArray();
|
||||
for(JsonElement element : JsonParser.parseString(json).getAsJsonArray()) {
|
||||
if(element.isJsonObject()) { // ignore this
|
||||
extra.add(element);
|
||||
} else {
|
||||
ChatItem.debug("Ignoring element " + element);
|
||||
}
|
||||
}
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("text", "");
|
||||
jsonObject.add("extra", extra);
|
||||
json = jsonObject.toString();
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
try {
|
||||
packet.setPacket(packet.getPacket().getClass().getConstructor(Component.class, String.class, int.class).newInstance(null, json, 1));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.json;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
|
||||
public interface JSONManipulator {
|
||||
|
||||
String parse(String json, List<String> replacements, ItemStack item, String repl, int protocol) throws Exception;
|
||||
String parseEmpty(String json, List<String> replacements, String repl, List<String> tooltip, Player sender);
|
||||
|
||||
}
|
||||
+112
-809
File diff suppressed because it is too large.
Load diff
@@ -1,6 +1,5 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.json;
|
||||
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
+33
-153
@@ -2,11 +2,9 @@ package me.dadus33.chatitem.chatmanager.v1.listeners;
|
||||
|
||||
import static me.dadus33.chatitem.chatmanager.ChatManager.SEPARATOR;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@@ -14,15 +12,16 @@ import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
|
||||
public class ChatEventListener implements Listener {
|
||||
|
||||
private final static String LEFT = "{remaining}";
|
||||
private final HashMap<String, Long> COOLDOWNS = new HashMap<>();
|
||||
private final PacketEditingChatManager manage;
|
||||
|
||||
public ChatEventListener(PacketEditingChatManager manage) {
|
||||
@@ -33,55 +32,10 @@ public class ChatEventListener implements Listener {
|
||||
return this.manage.getStorage();
|
||||
}
|
||||
|
||||
private String calculateTime(long seconds) {
|
||||
if (seconds < 60) {
|
||||
return seconds + getStorage().SECONDS;
|
||||
}
|
||||
if (seconds < 3600) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int minutes = (int) seconds / 60;
|
||||
builder.append(minutes).append(getStorage().MINUTES);
|
||||
int secs = (int) seconds - minutes * 60;
|
||||
if (secs != 0) {
|
||||
builder.append(" ").append(secs).append(getStorage().SECONDS);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int hours = (int) seconds / 3600;
|
||||
builder.append(hours).append(getStorage().HOURS);
|
||||
int minutes = (int) (seconds / 60) - (hours * 60);
|
||||
if (minutes != 0) {
|
||||
builder.append(" ").append(minutes).append(getStorage().MINUTES);
|
||||
}
|
||||
int secs = (int) (seconds - ((seconds / 60) * 60));
|
||||
if (secs != 0) {
|
||||
builder.append(" ").append(secs).append(getStorage().SECONDS);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private int countOccurrences(String findStr, String str) {
|
||||
int lastIndex = 0;
|
||||
int count = 0;
|
||||
while (lastIndex != -1) {
|
||||
|
||||
lastIndex = str.indexOf(findStr, lastIndex);
|
||||
|
||||
if (lastIndex != -1) {
|
||||
count++;
|
||||
lastIndex += findStr.length();
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) // We need to have lowest priority in order
|
||||
// to get to the event before DeluxeChat or
|
||||
// other plugins do
|
||||
public void onChat(AsyncPlayerChatEvent e) {
|
||||
ChatItem.debug("(v1) Check for v1 system. Cancelled: " + e.isCancelled());
|
||||
if (e.getMessage().indexOf(SEPARATOR) != -1) { // If the BELL character is found, we have to remove it
|
||||
String msg = e.getMessage().replace(Character.toString(SEPARATOR), "");
|
||||
ChatItem.debug("Already bell in message: " + e.getMessage());
|
||||
@@ -101,71 +55,26 @@ public class ChatEventListener implements Listener {
|
||||
}
|
||||
|
||||
Player p = e.getPlayer();
|
||||
|
||||
if (getStorage().PERMISSION_ENABLED && !p.hasPermission(getStorage().PERMISSION_NAME)) {
|
||||
if (!getStorage().LET_MESSAGE_THROUGH) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!getStorage().NO_PERMISSION_MESSAGE.isEmpty() && getStorage().SHOW_NO_PERM_NORMAL) {
|
||||
p.sendMessage(getStorage().NO_PERMISSION_MESSAGE);
|
||||
}
|
||||
ChatItem.debug("(v1) Don't have permission");
|
||||
ItemStack item = ChatManager.getUsableItem(p);
|
||||
if(!ChatManager.canShowItem(p, item, e))
|
||||
return;
|
||||
}
|
||||
if (p.getItemInHand().getType().equals(Material.AIR)) {
|
||||
if (getStorage().DENY_IF_NO_ITEM) {
|
||||
e.setCancelled(true);
|
||||
if (!getStorage().DENY_MESSAGE.isEmpty())
|
||||
e.getPlayer().sendMessage(getStorage().DENY_MESSAGE);
|
||||
ChatItem.debug("(v1) No item and must deny");
|
||||
return;
|
||||
}
|
||||
if (getStorage().HAND_DISABLED) {
|
||||
ChatItem.debug("(v1) Hand disabled");
|
||||
return;
|
||||
}
|
||||
}
|
||||
ChatItem.debug("(v1) Checking cooldown " + e.getMessage());
|
||||
if (getStorage().COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
if (COOLDOWNS.containsKey(p.getName())) {
|
||||
long start = COOLDOWNS.get(p.getName());
|
||||
long current = System.currentTimeMillis() / 1000;
|
||||
long elapsed = current - start;
|
||||
if (elapsed >= getStorage().COOLDOWN) {
|
||||
COOLDOWNS.remove(p.getName());
|
||||
} else {
|
||||
if (!getStorage().LET_MESSAGE_THROUGH) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!getStorage().COOLDOWN_MESSAGE.isEmpty()) {
|
||||
long left = (start + getStorage().COOLDOWN) - current;
|
||||
p.sendMessage(getStorage().COOLDOWN_MESSAGE.replace(LEFT, calculateTime(left)));
|
||||
}
|
||||
ChatItem.debug("(v1) Cooldown");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
String s = e.getMessage(), firstPlaceholder = getStorage().PLACEHOLDERS.get(0);
|
||||
for (String placeholder : getStorage().PLACEHOLDERS) {
|
||||
s = s.replace(placeholder, firstPlaceholder);
|
||||
}
|
||||
int occurrences = countOccurrences(firstPlaceholder, s);
|
||||
|
||||
if (occurrences > getStorage().LIMIT) {
|
||||
if (Utils.countMatches(s, firstPlaceholder) > getStorage().LIMIT) {
|
||||
e.setCancelled(true);
|
||||
ChatItem.debug("(v1) Reach message limit");
|
||||
if (getStorage().LIMIT_MESSAGE.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
e.getPlayer().sendMessage(getStorage().LIMIT_MESSAGE);
|
||||
p.sendMessage(getStorage().LIMIT_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
ChatItem.debug("(v1) Set placeholder: " + e.getMessage());
|
||||
try {
|
||||
StringJoiner msg = new StringJoiner(" ");
|
||||
for(String part : e.getMessage().split(" ")) {
|
||||
for(String part : s.split(" ")) {
|
||||
if(part.equalsIgnoreCase(firstPlaceholder)) {
|
||||
msg.add(firstPlaceholder + SEPARATOR + p.getName());
|
||||
} else {
|
||||
@@ -174,15 +83,15 @@ public class ChatEventListener implements Listener {
|
||||
}
|
||||
e.setMessage(msg.toString());
|
||||
e.setFormat(e.getFormat().replace(oldMsg, e.getMessage())); // set own message for plugin that already put the message into the format
|
||||
ChatItem.debug("Message: " + e.getMessage().replace(SEPARATOR, 'S') + ", format: " + e.getFormat());
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
if (!p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
COOLDOWNS.put(p.getName(), System.currentTimeMillis() / 1000);
|
||||
if (getStorage().COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
ChatManager.COOLDOWNS.put(p.getUniqueId(), System.currentTimeMillis() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onCommand(final PlayerCommandPreprocessEvent e) {
|
||||
if (e.getMessage().indexOf(SEPARATOR) != -1) { // If the BELL character is found, we have to remove it
|
||||
@@ -216,67 +125,38 @@ public class ChatEventListener implements Listener {
|
||||
if (!found) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!p.hasPermission("chatitem.use")) {
|
||||
if (!getStorage().NO_PERMISSION_MESSAGE.isEmpty() && getStorage().SHOW_NO_PERM_COMMAND) {
|
||||
p.sendMessage(getStorage().NO_PERMISSION_MESSAGE);
|
||||
}
|
||||
e.setCancelled(true);
|
||||
ItemStack item = ChatManager.getUsableItem(p);
|
||||
if(!ChatManager.canShowItem(p, item, e))
|
||||
return;
|
||||
}
|
||||
|
||||
if (e.getPlayer().getItemInHand().getType().equals(Material.AIR)) {
|
||||
if (getStorage().DENY_IF_NO_ITEM) {
|
||||
e.setCancelled(true);
|
||||
if (!getStorage().DENY_MESSAGE.isEmpty()) {
|
||||
e.getPlayer().sendMessage(getStorage().DENY_MESSAGE);
|
||||
}
|
||||
}
|
||||
if (getStorage().HAND_DISABLED) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (getStorage().COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
if (COOLDOWNS.containsKey(p.getName())) {
|
||||
long start = COOLDOWNS.get(p.getName());
|
||||
long current = System.currentTimeMillis() / 1000;
|
||||
long elapsed = current - start;
|
||||
if (elapsed >= getStorage().COOLDOWN) {
|
||||
COOLDOWNS.remove(p.getName());
|
||||
} else {
|
||||
if (!getStorage().LET_MESSAGE_THROUGH) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!getStorage().COOLDOWN_MESSAGE.isEmpty()) {
|
||||
long left = (start + getStorage().COOLDOWN) - current;
|
||||
p.sendMessage(getStorage().COOLDOWN_MESSAGE.replace(LEFT, calculateTime(left)));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String s = e.getMessage();
|
||||
String s = e.getMessage(), firstPlaceholder = getStorage().PLACEHOLDERS.get(0);
|
||||
for (String placeholder : getStorage().PLACEHOLDERS) {
|
||||
s = s.replace(placeholder, getStorage().PLACEHOLDERS.get(0));
|
||||
s = s.replace(placeholder, firstPlaceholder);
|
||||
}
|
||||
int occurrences = countOccurrences(getStorage().PLACEHOLDERS.get(0), s);
|
||||
|
||||
if (occurrences > getStorage().LIMIT) {
|
||||
if (Utils.countMatches(s, firstPlaceholder) > getStorage().LIMIT) {
|
||||
e.setCancelled(true);
|
||||
if (getStorage().LIMIT_MESSAGE.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
e.getPlayer().sendMessage(getStorage().LIMIT_MESSAGE);
|
||||
p.sendMessage(getStorage().LIMIT_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder(e.getMessage());
|
||||
sb.append(SEPARATOR).append(e.getPlayer().getName());
|
||||
e.setMessage(sb.toString());
|
||||
if (!p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
COOLDOWNS.put(p.getName(), System.currentTimeMillis() / 1000);
|
||||
ChatItem.debug("(v1) Set placeholder: " + e.getMessage());
|
||||
try {
|
||||
StringJoiner msg = new StringJoiner(" ");
|
||||
for(String part : s.split(" ")) {
|
||||
if(part.equalsIgnoreCase(firstPlaceholder)) {
|
||||
msg.add(firstPlaceholder + SEPARATOR + p.getName());
|
||||
} else {
|
||||
msg.add(part);
|
||||
}
|
||||
}
|
||||
e.setMessage(msg.toString());
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
if (getStorage().COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
ChatManager.COOLDOWNS.put(p.getUniqueId(), System.currentTimeMillis() / 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
+132
-142
@@ -4,8 +4,11 @@ import static me.dadus33.chatitem.chatmanager.ChatManager.SEPARATOR;
|
||||
import static me.dadus33.chatitem.chatmanager.ChatManager.SEPARATOR_STR;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
@@ -18,26 +21,34 @@ import org.bukkit.inventory.meta.BookMeta;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.ItemPlayer;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.AdventureComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.BaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.ComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.IChatBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.StringComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketContent;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketHandler;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketType;
|
||||
import me.dadus33.chatitem.itemnamer.NamerManager;
|
||||
import me.dadus33.chatitem.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
|
||||
public class ChatPacketManager extends PacketHandler {
|
||||
|
||||
private final static String NAME = "{name}";
|
||||
private final static String AMOUNT = "{amount}";
|
||||
private final static String TIMES = "{times}";
|
||||
|
||||
private Object lastSentPacket = null;
|
||||
private Method serializerGetJson;
|
||||
private PacketEditingChatManager manager;
|
||||
private final List<IBaseComponentGetter> baseComponentGetter = new ArrayList<>();
|
||||
|
||||
public ChatPacketManager(PacketEditingChatManager manager) {
|
||||
this.manager = manager;
|
||||
@@ -55,62 +66,52 @@ public class ChatPacketManager extends PacketHandler {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
for(IBaseComponentGetter getter : Arrays.asList(new IChatBaseComponentGetter(), new BaseComponentGetter(), new ComponentGetter(), new AdventureComponentGetter(), new StringComponentGetter())) {
|
||||
if(getter.hasConditions())
|
||||
baseComponentGetter.add(getter);
|
||||
}
|
||||
ChatItem.getInstance().getLogger().info("Loaded " + baseComponentGetter.size() + " getter for base components.");
|
||||
ChatItem.debug("BaseComponentGetters: " + String.join(", ", baseComponentGetter.stream().map(IBaseComponentGetter::getClass).map(Class::getSimpleName).collect(Collectors.toList())));
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void onSend(ChatItemPacket e) {
|
||||
if (!e.hasPlayer() || !e.getPacketType().equals(PacketType.Server.CHAT)) {
|
||||
if (!e.hasPlayer() || !e.getPacketType().equals(PacketType.Server.CHAT))
|
||||
return;
|
||||
}
|
||||
Version version = Version.getVersion();
|
||||
if (version.isNewerOrEquals(Version.V1_8)) { // only if action bar messages are supported in this
|
||||
// version of minecraft
|
||||
if (version.isNewerOrEquals(Version.V1_12)) {
|
||||
try {
|
||||
if (((Enum<?>) e.getContent()
|
||||
.getSpecificModifier(PacketUtils.getNmsClass("ChatMessageType", "network.chat.")).read(0))
|
||||
.name().equals("GAME_INFO")) {
|
||||
return; // It means it's an actionbar message, and we ain't intercepting those
|
||||
}
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
} else if (e.getContent().getBytes().readSafely(0) == (byte) 2) {
|
||||
return; // It means it's an actionbar message, and we ain't intercepting those
|
||||
}
|
||||
}
|
||||
boolean usesBaseComponents = false;
|
||||
if (lastSentPacket != null && lastSentPacket == e.getPacket())
|
||||
return; // prevent infinite loop
|
||||
PacketContent packet = e.getContent();
|
||||
Version version = Version.getVersion();
|
||||
String json = "{}";
|
||||
if (packet.getChatComponents().readSafely(0) == null) { // null check for some cases of messages sent using
|
||||
// spigot's Chat Component API or other means
|
||||
if (!manager.supportsChatComponentApi()) // only if the API is supported in this server distribution
|
||||
return;// We don't know how to deal with anything else. Most probably some mod message
|
||||
// we shouldn't mess with anyways
|
||||
BaseComponent[] components = packet.getSpecificModifier(BaseComponent[].class).readSafely(0);
|
||||
if (components == null) {
|
||||
Object chatBaseComp = packet.getSpecificModifier(PacketUtils.COMPONENT_CLASS).readSafely(0);
|
||||
if(chatBaseComp == null) {
|
||||
ChatItem.debug("No base components, without chat base comp");
|
||||
return;
|
||||
} else {
|
||||
ChatItem.debug("No base components, with chatbasecomp: " + chatBaseComp);
|
||||
try {
|
||||
json = PacketUtils.CHAT_SERIALIZER.getMethod("a", PacketUtils.COMPONENT_CLASS).invoke(null, e.getPacket()).toString();
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
}
|
||||
} else
|
||||
json = ComponentSerializer.toString(components);
|
||||
usesBaseComponents = true;
|
||||
} else {
|
||||
IBaseComponentGetter choosedGetter = null;
|
||||
if (version.isNewerOrEquals(Version.V1_19)) {
|
||||
if(packet.getIntegers().readSafely(0, 0) != 1)
|
||||
return;
|
||||
choosedGetter = new StringComponentGetter();
|
||||
json = choosedGetter.getBaseComponentAsJSON(e); // if null, will be re-checked so anyway
|
||||
} else if (version.isNewerOrEquals(Version.V1_12)) {
|
||||
// only if action bar messages are supported in this version of minecraft
|
||||
try {
|
||||
json = (String) serializerGetJson.invoke(null, packet.getChatComponents().readSafely(0));
|
||||
if (((Enum<?>) packet
|
||||
.getSpecificModifier(PacketUtils.getNmsClass("ChatMessageType", "network.chat.")).read(0))
|
||||
.name().equals("GAME_INFO")) {
|
||||
return; // It means it's an actionbar message, and we ain't intercepting those
|
||||
}
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
} else if (version.isNewerOrEquals(Version.V1_8) && packet.getBytes().readSafely(0) == (byte) 2) {
|
||||
return; // It means it's an actionbar message, and we ain't intercepting those
|
||||
}
|
||||
if(json == null || choosedGetter == null) {
|
||||
for(IBaseComponentGetter getters : baseComponentGetter) {
|
||||
String tmpJson = getters.getBaseComponentAsJSON(e);
|
||||
if(tmpJson != null) {
|
||||
json = tmpJson;
|
||||
choosedGetter = getters;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
boolean found = false;
|
||||
for (String rep : getStorage().PLACEHOLDERS) {
|
||||
@@ -120,29 +121,38 @@ public class ChatPacketManager extends PacketHandler {
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
ChatItem.debug("No placeholders founded");
|
||||
ChatItem.debug("No placeholders founded in " + json);
|
||||
ChatItem.debug("String: " + packet.getStrings().getContent());
|
||||
try {
|
||||
Class<?> c = Class.forName("net.kyori.adventure.text.Component");
|
||||
ChatItem.debug("Component: " + packet.getSpecificModifier(c).getContent());
|
||||
} catch (ClassNotFoundException exc) {
|
||||
ChatItem.debug("Can't find Kyori's component");
|
||||
} catch(Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
return; // then it's just a normal message without placeholders, so we leave it alone
|
||||
}
|
||||
ChatItem.debug("Found " + json + " with " + choosedGetter.getClass().getName());
|
||||
Object toReplace = null;
|
||||
if(json.lastIndexOf(SEPARATOR) != -1)
|
||||
if (json.lastIndexOf(SEPARATOR) != -1)
|
||||
toReplace = SEPARATOR;
|
||||
if(json.lastIndexOf(SEPARATOR_STR) != -1)
|
||||
if (json.lastIndexOf(SEPARATOR_STR) != -1)
|
||||
toReplace = SEPARATOR_STR;
|
||||
if (toReplace == null) { // if the message doesn't contain the BELL separator, then it's certainly NOT a message we want to parse
|
||||
ChatItem.debug("Not contains bell " + json);
|
||||
if (toReplace == null) { // if the message doesn't contain the BELL separator
|
||||
ChatItem.debug("Not containing bell " + json);
|
||||
return;
|
||||
}
|
||||
ChatItem.debug("Add packet meta");
|
||||
IBaseComponentGetter fchoosedGetter = choosedGetter;
|
||||
String fjson = json, toReplaceStr = toReplace.toString();
|
||||
boolean bUsesBaseComponents = usesBaseComponents;
|
||||
e.setCancelled(true); // We cancel the packet as we're going to resend it anyways (ignoring listeners
|
||||
// this time)
|
||||
Bukkit.getScheduler().runTaskAsynchronously(ChatItem.getInstance(), () -> {
|
||||
|
||||
Player p = e.getPlayer();
|
||||
int topIndex = -1;
|
||||
String name = null;
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
String pname = toReplaceStr + p.getName();
|
||||
for (Player pl : Bukkit.getOnlinePlayers()) {
|
||||
String pname = toReplaceStr + pl.getName();
|
||||
if (!fjson.contains(pname)) {
|
||||
continue;
|
||||
}
|
||||
@@ -158,16 +168,44 @@ public class ChatPacketManager extends PacketHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
Player p = Bukkit.getPlayer(name);
|
||||
Player itemPlayer = Bukkit.getPlayer(name);
|
||||
StringBuilder builder = new StringBuilder(fjson);
|
||||
builder.replace(topIndex - (name.length() + 6), topIndex, ""); // we remove both the name and the separator
|
||||
// from the json string
|
||||
String localJson = builder.toString();
|
||||
String localJson = fjson.replace(toReplaceStr + itemPlayer.getName(), "");// builder.toString();
|
||||
|
||||
String message = null;
|
||||
try {
|
||||
if (!ItemUtils.isEmpty(p.getItemInHand())) {
|
||||
ItemStack copy = p.getItemInHand().clone();
|
||||
ItemStack item = ChatManager.getUsableItem(itemPlayer);
|
||||
if (!ItemUtils.isEmpty(item)) {
|
||||
ItemStack copy = item.clone();
|
||||
|
||||
if (ItemPlayer.getPlayer(p).isBuggedClient()) {
|
||||
String act = getStorage().BUGGED_CLIENT_ACTION;
|
||||
List<String> tooltip;// = act.equalsIgnoreCase("nothing") ? new ArrayList<>() : null;
|
||||
if (act.equalsIgnoreCase("tooltip"))
|
||||
tooltip = getStorage().BUGGED_CLIENTS_TOOLTIP;
|
||||
else if (act.equalsIgnoreCase("item"))
|
||||
tooltip = getMaxLinesFromItem(p, copy);
|
||||
else if (act.equalsIgnoreCase("show_both")) {
|
||||
tooltip = getMaxLinesFromItem(p, copy);
|
||||
tooltip.addAll(getStorage().BUGGED_CLIENTS_TOOLTIP);
|
||||
} else
|
||||
tooltip = new ArrayList<>();
|
||||
message = manager.getManipulator().parseEmpty(localJson, getStorage().PLACEHOLDERS.get(0),
|
||||
ChatManager.styleItem(p, copy, getStorage()), tooltip, itemPlayer);
|
||||
if (!manager.supportsChatComponentApi()) {
|
||||
ChatItem.debug("Use basic for 1.7 lunar");
|
||||
packet.getChatComponents().write(0, jsonToChatComponent(message));
|
||||
} else {
|
||||
ChatItem.debug("Use baseComponent for 1.7 lunar");
|
||||
packet.getSpecificModifier(BaseComponent[].class).write(0,
|
||||
ComponentSerializer.parse(message));
|
||||
}
|
||||
lastSentPacket = e.getPacket();
|
||||
PacketUtils.sendPacket(p, lastSentPacket);
|
||||
return;
|
||||
}
|
||||
if (copy.getType().name().contains("_BOOK")) { // filtering written books
|
||||
BookMeta bm = (BookMeta) copy.getItemMeta();
|
||||
bm.setPages(Collections.emptyList());
|
||||
@@ -178,8 +216,8 @@ public class ChatPacketManager extends PacketHandler {
|
||||
BlockStateMeta bsm = (BlockStateMeta) copy.getItemMeta();
|
||||
if (bsm.hasBlockState()) {
|
||||
ShulkerBox sb = (ShulkerBox) bsm.getBlockState();
|
||||
for (ItemStack item : sb.getInventory()) {
|
||||
stripData(item);
|
||||
for (ItemStack itemInv : sb.getInventory()) {
|
||||
stripData(itemInv);
|
||||
}
|
||||
bsm.setBlockState(sb);
|
||||
}
|
||||
@@ -187,28 +225,26 @@ public class ChatPacketManager extends PacketHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
message = manager.getManipulator().parse(localJson, getStorage().PLACEHOLDERS, copy,
|
||||
styleItem(copy, getStorage()), manager.getPlayerVersionAdapter().getProtocolVersion(p));
|
||||
message = manager.getManipulator().parse(localJson, getStorage().PLACEHOLDERS.get(0), copy,
|
||||
ChatManager.styleItem(p, copy, getStorage()), ItemPlayer.getPlayer(itemPlayer).getProtocolVersion());
|
||||
} else {
|
||||
if (!getStorage().HAND_DISABLED) {
|
||||
message = manager.getManipulator().parseEmpty(localJson, getStorage().PLACEHOLDERS,
|
||||
getStorage().HAND_NAME, getStorage().HAND_TOOLTIP, p);
|
||||
message = manager.getManipulator().parseEmpty(localJson, getStorage().PLACEHOLDERS.get(0),
|
||||
getStorage().HAND_NAME, getStorage().HAND_TOOLTIP, itemPlayer);
|
||||
}
|
||||
}
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
if (message != null) {
|
||||
if (!bUsesBaseComponents) {
|
||||
packet.getChatComponents().write(0, jsonToChatComponent(message));
|
||||
} else {
|
||||
packet.getSpecificModifier(BaseComponent[].class).write(0, ComponentSerializer.parse(message));
|
||||
}
|
||||
ChatItem.debug("(v1) Writing message: " + message);
|
||||
fchoosedGetter.writeJson(e, message);
|
||||
}
|
||||
PacketUtils.sendPacket(e.getPlayer(), e.getPacket());
|
||||
lastSentPacket = e.getPacket();
|
||||
PacketUtils.sendPacket(p, lastSentPacket);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private Object jsonToChatComponent(String json) {
|
||||
try {
|
||||
return PacketUtils.CHAT_SERIALIZER.getMethod("a", String.class).invoke(null, json);
|
||||
@@ -218,70 +254,6 @@ public class ChatPacketManager extends PacketHandler {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String styleItem(ItemStack item, Storage c) {
|
||||
String replacer = c.NAME_FORMAT;
|
||||
String amount = c.AMOUNT_FORMAT;
|
||||
boolean dname = item.hasItemMeta() ? item.getItemMeta().hasDisplayName() : false;
|
||||
|
||||
if (item.getAmount() == 1) {
|
||||
if (c.FORCE_ADD_AMOUNT) {
|
||||
amount = amount.replace(TIMES, "1");
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
} else {
|
||||
replacer = replacer.replace(AMOUNT, "");
|
||||
}
|
||||
} else {
|
||||
amount = amount.replace(TIMES, String.valueOf(item.getAmount()));
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
}
|
||||
if (dname) {
|
||||
String trp = item.getItemMeta().getDisplayName();
|
||||
if (c.COLOR_IF_ALREADY_COLORED) {
|
||||
replacer = replacer.replace(NAME, ChatColor.stripColor(trp));
|
||||
} else {
|
||||
replacer = replacer.replace(NAME, trp);
|
||||
}
|
||||
} else {
|
||||
HashMap<Short, String> translationSection = c.TRANSLATIONS.get(item.getType().name());
|
||||
if (translationSection == null) {
|
||||
String trp = materialToName(item.getType());
|
||||
replacer = replacer.replace(NAME, trp);
|
||||
} else {
|
||||
@SuppressWarnings("deprecation")
|
||||
String translated = translationSection.get(item.getDurability());
|
||||
if (translated != null) {
|
||||
replacer = replacer.replace(NAME, translated);
|
||||
} else {
|
||||
replacer = replacer.replace(NAME, materialToName(item.getType()));
|
||||
}
|
||||
}
|
||||
}
|
||||
return replacer;
|
||||
}
|
||||
|
||||
private static String materialToName(Material m) {
|
||||
if (m.equals(Material.TNT)) {
|
||||
return "TNT";
|
||||
}
|
||||
String orig = m.toString().toLowerCase();
|
||||
String[] splits = orig.split("_");
|
||||
StringBuilder sb = new StringBuilder(orig.length());
|
||||
int pos = 0;
|
||||
for (String split : splits) {
|
||||
sb.append(split);
|
||||
int loc = sb.lastIndexOf(split);
|
||||
char charLoc = sb.charAt(loc);
|
||||
if (!(split.equalsIgnoreCase("of") || split.equalsIgnoreCase("and") || split.equalsIgnoreCase("with")
|
||||
|| split.equalsIgnoreCase("on")))
|
||||
sb.setCharAt(loc, Character.toUpperCase(charLoc));
|
||||
if (pos != splits.length - 1)
|
||||
sb.append(' ');
|
||||
++pos;
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private void stripData(ItemStack i) {
|
||||
if (i == null) {
|
||||
return;
|
||||
@@ -300,8 +272,26 @@ public class ChatPacketManager extends PacketHandler {
|
||||
i.setItemMeta(im);
|
||||
}
|
||||
|
||||
|
||||
public Storage getStorage() {
|
||||
return manager.getStorage();
|
||||
}
|
||||
|
||||
private List<String> getMaxLinesFromItem(Player p, ItemStack item) {
|
||||
List<String> lines = new ArrayList<>();
|
||||
if (item.hasItemMeta()) {
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
lines.add(meta.hasDisplayName() ? meta.getDisplayName()
|
||||
: NamerManager.getName(p, item, getStorage()));
|
||||
if (meta.hasEnchants()) {
|
||||
meta.getEnchants().forEach((enchant, lvl) -> {
|
||||
lines.add(ChatColor.RESET + Utils.getEnchantName(enchant) + " " + Utils.toRoman(lvl));
|
||||
});
|
||||
}
|
||||
if (meta.hasLore())
|
||||
lines.addAll(meta.getLore());
|
||||
} else {
|
||||
lines.add(NamerManager.getName(p, item, getStorage()));
|
||||
}
|
||||
return lines;
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.hooks.DefaultVersionHook;
|
||||
import me.dadus33.chatitem.playerversion.hooks.DefaultVersionHook;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
|
||||
public class HandshakeListener extends PacketAdapter {
|
||||
|
||||
@@ -4,11 +4,10 @@ import org.bukkit.entity.Player;
|
||||
|
||||
public class ChatItemPacket {
|
||||
|
||||
protected Player player;
|
||||
protected final Player player;
|
||||
protected Object packet;
|
||||
protected PacketType type;
|
||||
protected boolean cancel = false;
|
||||
protected PacketMetadata metaData = new PacketMetadata();
|
||||
|
||||
public ChatItemPacket(PacketType type, Object packet, Player player) {
|
||||
this.player = player;
|
||||
@@ -31,6 +30,10 @@ public class ChatItemPacket {
|
||||
public Object getPacket() {
|
||||
return packet;
|
||||
}
|
||||
|
||||
public void setPacket(Object packet) {
|
||||
this.packet = packet;
|
||||
}
|
||||
|
||||
public String getPacketName() {
|
||||
return packet.getClass().getSimpleName();
|
||||
@@ -51,8 +54,4 @@ public class ChatItemPacket {
|
||||
public PacketContent getContent() {
|
||||
return new PacketContent(this);
|
||||
}
|
||||
|
||||
public PacketMetadata getMetaData() {
|
||||
return metaData;
|
||||
}
|
||||
}
|
||||
+14
-7
@@ -1,5 +1,7 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.packets;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
@@ -14,11 +16,15 @@ public class ChatItemPacketManager {
|
||||
public ChatItemPacketManager(ChatItem pl) {
|
||||
Plugin protocolLibPlugin = Bukkit.getPluginManager().getPlugin("ProtocolLib");
|
||||
if (protocolLibPlugin != null) {
|
||||
if(checkProtocollibConditions()) {
|
||||
String version = protocolLibPlugin.getDescription().getVersion();
|
||||
if(version.contains("5.0.0-SNAPSHOT")) {
|
||||
pl.getLogger().warning("ProtocolLib have been detected, but actually, snapshot have issues with chat packet. More informations here: https://github.com/dmulloy2/ProtocolLib/issues/1670.");
|
||||
packetManager = new CustomPacketManager(pl);
|
||||
} else if(checkProtocollibConditions()) {
|
||||
pl.getLogger().info("The plugin ProtocolLib has been detected. Loading Protocollib support ...");
|
||||
packetManager = new ProtocollibPacketManager(pl);
|
||||
} else {
|
||||
pl.getLogger().warning("The plugin ProtocolLib has been detected but you have an OLD version, so we cannot use it.");
|
||||
pl.getLogger().warning("The plugin ProtocolLib has been detected but you have an old or too new version, so we cannot use it.");
|
||||
pl.getLogger().warning("Fallback to default Packet system ...");
|
||||
packetManager = new CustomPacketManager(pl);
|
||||
}
|
||||
@@ -33,11 +39,12 @@ public class ChatItemPacketManager {
|
||||
}
|
||||
|
||||
private boolean checkProtocollibConditions() {
|
||||
try {
|
||||
Class.forName("com.comphenix.protocol.injector.server.TemporaryPlayer");
|
||||
return true;
|
||||
} catch (ClassNotFoundException e) {
|
||||
return false;
|
||||
for(String searchedClass : Arrays.asList("com.comphenix.protocol.injector.server.TemporaryPlayer", "com.comphenix.protocol.injector.temporary.TemporaryPlayer")) { // class since 4.4.0 until 4.8.0, then the new one
|
||||
try {
|
||||
Class.forName(searchedClass);
|
||||
return true; // class found
|
||||
} catch (ClassNotFoundException e) {}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -2,8 +2,10 @@ package me.dadus33.chatitem.chatmanager.v1.packets;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
|
||||
@@ -148,7 +150,7 @@ public class PacketContent {
|
||||
* @throws NoSuchElementException if the value doesn't exist
|
||||
*/
|
||||
public T read(int i) {
|
||||
return content.values().stream().filter(Objects::nonNull).findFirst().get();
|
||||
return content.values().stream().filter(Objects::nonNull).collect(Collectors.toList()).get(i);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -169,7 +171,8 @@ public class PacketContent {
|
||||
* @return the requested value.
|
||||
*/
|
||||
public T readSafely(int i, T defaultValue) {
|
||||
return content.values().stream().filter(Objects::nonNull).findFirst().orElse(defaultValue);
|
||||
List<T> vals = content.values().stream().filter(Objects::nonNull).collect(Collectors.toList());
|
||||
return vals.size() <= i ? defaultValue : vals.get(i);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -185,6 +188,12 @@ public class PacketContent {
|
||||
} else {
|
||||
content.put(key, value);
|
||||
try {
|
||||
key.setAccessible(true);
|
||||
/*if(Modifier.isFinal(key.getModifiers())) {
|
||||
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
||||
modifiersField.setAccessible(true);
|
||||
modifiersField.setInt(key, key.getModifiers() & ~Modifier.FINAL);
|
||||
}*/
|
||||
key.set(obj, value);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.packets;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class PacketMetadata {
|
||||
|
||||
private final HashMap<String, Object> metas = new HashMap<>();
|
||||
|
||||
public void setMeta(String key, Object obj) {
|
||||
this.metas.put(key, obj);
|
||||
}
|
||||
|
||||
public boolean hasMeta(String key) {
|
||||
return metas.containsKey(key);
|
||||
}
|
||||
|
||||
public void removeMeta(String key) {
|
||||
metas.remove(key);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> T getMeta(String key, T def) {
|
||||
return (T) metas.getOrDefault(key, def);
|
||||
}
|
||||
|
||||
public HashMap<String, Object> getMetas() {
|
||||
return metas;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.packets;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public interface PacketType {
|
||||
@@ -10,6 +11,13 @@ public interface PacketType {
|
||||
String getFullName();
|
||||
List<String> getAlias();
|
||||
|
||||
public static List<PacketType> values() {
|
||||
List<PacketType> list = new ArrayList<>();
|
||||
list.addAll(Arrays.asList(Server.values()));
|
||||
list.addAll(Arrays.asList(Handshake.values()));
|
||||
return list;
|
||||
}
|
||||
|
||||
static final String SERVER_PREFIX = "PacketPlayOut", HANDSHAKE_PREFIX = "PacketHandshaking";
|
||||
|
||||
public static PacketType getType(String packetName) {
|
||||
@@ -18,6 +26,10 @@ public interface PacketType {
|
||||
} else if(packetName.startsWith(HANDSHAKE_PREFIX)) {
|
||||
return getPacketTypeFor(packetName, Handshake.values(), Handshake.UNSET);
|
||||
} else {
|
||||
for(PacketType types : values()) {
|
||||
if(types.getFullName().equalsIgnoreCase(packetName) || types.getAlias().contains(packetName))
|
||||
return types;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -31,7 +43,7 @@ public interface PacketType {
|
||||
|
||||
public static enum Server implements PacketType {
|
||||
|
||||
CHAT("Chat"),
|
||||
CHAT("Chat", "ClientboundPlayerChatPacket", "ClientboundSystemChatPacket"),
|
||||
UNSET("Unset");
|
||||
|
||||
private final String packetName, fullName;
|
||||
@@ -41,7 +53,7 @@ public interface PacketType {
|
||||
this.packetName = packetName;
|
||||
this.fullName = SERVER_PREFIX + packetName;
|
||||
for(String al : alias)
|
||||
this.alias.add(SERVER_PREFIX + al);
|
||||
this.alias.add(al);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
-1
@@ -83,7 +83,6 @@ public class CustomPacketManager extends PacketManager implements Listener {
|
||||
|
||||
public ChatItemPacket onPacketSent(PacketType type, Player sender, Object packet) {
|
||||
if(type == null) {
|
||||
//ChatItem.debug("Failed to find packet type for " + packet.getClass().getSimpleName());
|
||||
return null;
|
||||
}
|
||||
ChatItemPacket customPacket = new ChatItemPacket(type, packet, sender);
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@ import java.util.concurrent.Executors;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.ItemPlayer;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.custom.CustomPacketManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.hooks.DefaultVersionHook;
|
||||
|
||||
public abstract class ChannelAbstract {
|
||||
|
||||
@@ -54,7 +54,7 @@ public abstract class ChannelAbstract {
|
||||
try {
|
||||
Integer protocol = customPacketManager.protocolVersionPerChannel.remove(getChannel(p));
|
||||
if(protocol != null)
|
||||
DefaultVersionHook.PROTOCOL_PER_UUID.put(p.getUniqueId(), protocol);
|
||||
ItemPlayer.getPlayer(p).setProtocolVersion(protocol);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
-3
@@ -1,7 +1,6 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.packets.custom.channel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
@@ -11,14 +10,12 @@ import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketContent;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketType;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.custom.CustomPacketManager;
|
||||
|
||||
public class ChannelInboundHandler extends ChannelInboundHandlerAdapter {
|
||||
|
||||
public static final HashMap<Channel, ChatItemPacket> TMP = new HashMap<>();
|
||||
private CustomPacketManager packetManager;
|
||||
private List<ChannelPipeline> pipelines = new ArrayList<>();
|
||||
|
||||
|
||||
+3
-9
@@ -17,7 +17,6 @@ import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketType;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.custom.CustomPacketManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.hooks.DefaultVersionHook;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
@@ -58,10 +57,6 @@ public class INC2Channel extends ChannelAbstract {
|
||||
Channel channel = getChannel(player);
|
||||
// Managing outgoing packet (to the player)
|
||||
channel.pipeline().addAfter(KEY_HANDLER_SERVER, KEY_SERVER + endChannelName, new ChannelHandlerSent(player));
|
||||
|
||||
ChatItemPacket pa = ChannelInboundHandler.TMP.remove(channel);
|
||||
if(pa != null)
|
||||
DefaultVersionHook.PROTOCOL_PER_UUID.put(player.getUniqueId(), pa.getContent().getIntegers().readSafely(0, Version.getVersion().MAX_VER));
|
||||
} catch (NoSuchElementException e) {
|
||||
// appear when the player's channel isn't accessible because of reload.
|
||||
getPacketManager().getPlugin().getLogger().warning("Please, don't use reload, this can produce some problem. Currently, " + player.getName() + " isn't fully checked because of that. More details: " + e.getMessage() + " (NoSuchElementException)");
|
||||
@@ -92,9 +87,8 @@ public class INC2Channel extends ChannelAbstract {
|
||||
|
||||
@Override
|
||||
public Channel getChannel(Player p) throws Exception {
|
||||
Object playerConnection = getPlayerConnection(p);
|
||||
Object networkManager = playerConnection.getClass().getField("a").get(playerConnection);
|
||||
return (Channel) networkManager.getClass().getDeclaredField("k").get(networkManager);//(Channel) networkManager.getClass().getDeclaredField("channel").get(networkManager);
|
||||
Object playerConnection = ReflectionUtils.getObject(getPlayerConnection(p), Version.getVersion().isNewerOrEquals(Version.V1_19) ? "b" : "a");
|
||||
return ReflectionUtils.getFirstWith(playerConnection, playerConnection.getClass(), Channel.class);//(Channel) networkManager.getClass().getDeclaredField("channel").get(networkManager);
|
||||
}
|
||||
|
||||
private class ChannelHandlerSent extends ChannelOutboundHandlerAdapter {
|
||||
@@ -110,7 +104,7 @@ public class INC2Channel extends ChannelAbstract {
|
||||
ChatItemPacket nextPacket = getPacketManager().onPacketSent(PacketType.getType(packet.getClass().getSimpleName()), owner, packet);
|
||||
if(nextPacket != null && nextPacket.isCancelled())
|
||||
return;
|
||||
super.write(ctx, packet, promise);
|
||||
super.write(ctx, nextPacket == null ? packet : nextPacket.getPacket(), promise);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-7
@@ -19,10 +19,8 @@ import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketContent;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketType;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.custom.CustomPacketManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.hooks.DefaultVersionHook;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class INCChannel extends ChannelAbstract {
|
||||
@@ -70,10 +68,6 @@ public class INCChannel extends ChannelAbstract {
|
||||
Channel channel = getChannel(player);
|
||||
// Managing outgoing packet (to the player)
|
||||
channel.pipeline().addAfter(KEY_HANDLER_SERVER, KEY_SERVER + endChannelName, new ChannelHandlerSent(player));
|
||||
|
||||
ChatItemPacket pa = ChannelInboundHandler.TMP.remove(channel);
|
||||
if(pa != null)
|
||||
DefaultVersionHook.PROTOCOL_PER_UUID.put(player.getUniqueId(), pa.getContent().getIntegers().readSafely(0, Version.getVersion().MAX_VER));
|
||||
} catch (NoSuchElementException e) {
|
||||
// appear when the player's channel isn't accessible because of reload.
|
||||
getPacketManager().getPlugin().getLogger().warning("Please, don't use reload, this can produce some problem. Currently, " + player.getName() + " isn't fully checked because of that. More details: " + e.getMessage() + " (NoSuchElementException)");
|
||||
@@ -123,7 +117,7 @@ public class INCChannel extends ChannelAbstract {
|
||||
ChatItemPacket nextPacket = getPacketManager().onPacketSent(PacketType.getType(packet.getClass().getSimpleName()), owner, packet);
|
||||
if(nextPacket != null && nextPacket.isCancelled())
|
||||
return;
|
||||
super.write(ctx, packet, promise);
|
||||
super.write(ctx, nextPacket == null ? packet : nextPacket.getPacket(), promise);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -37,7 +37,7 @@ public class NMUChannel extends ChannelAbstract {
|
||||
Object mcServer = dedicatedSrv.getClass().getMethod("getServer").invoke(dedicatedSrv);
|
||||
Object co = ReflectionUtils.getFirstWith(mcServer, PacketUtils.getNmsClass("MinecraftServer", "server."), PacketUtils.getNmsClass("ServerConnection", "network."));
|
||||
@SuppressWarnings("unchecked")
|
||||
List<ChannelFuture> g = (List<ChannelFuture>) ReflectionUtils.getObject(co, "g");
|
||||
List<ChannelFuture> g = (List<ChannelFuture>) ReflectionUtils.getObject(co, "g", "e");
|
||||
g.forEach((channelFuture) -> {
|
||||
pipeline = channelFuture.channel().pipeline();
|
||||
pipeline.addFirst(boundHandler = new ChannelInboundHandlerAdapter() {
|
||||
@@ -139,7 +139,7 @@ public class NMUChannel extends ChannelAbstract {
|
||||
ChatItemPacket nextPacket = getPacketManager().onPacketSent(PacketType.getType(packet.getClass().getSimpleName()), owner, packet);
|
||||
if(nextPacket != null && nextPacket.isCancelled())
|
||||
return;
|
||||
super.write(ctx, packet, promise);
|
||||
super.write(ctx, nextPacket == null ? packet : nextPacket.getPacket(), promise);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@ public class NMUChannel extends ChannelAbstract {
|
||||
try {
|
||||
PacketType packetType = PacketType.getType(packet.getClass().getSimpleName());
|
||||
if(packetType != null && packetType == PacketType.Handshake.IS_SET_PROTOCOL) {
|
||||
getPacketManager().protocolVersionPerChannel.put(channel, new PacketContent(packet).getIntegers().readSafely(0, 0));
|
||||
getPacketManager().protocolVersionPerChannel.put(channel, new PacketContent(packet).getIntegers().readSafely(1, 0));
|
||||
}
|
||||
super.channelRead(ctx, packet);
|
||||
} catch (Exception e) {
|
||||
|
||||
+14
-5
@@ -1,6 +1,7 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.packets.protocollib;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@@ -23,16 +24,24 @@ public class ProtocollibPacketManager extends PacketManager {
|
||||
|
||||
public ProtocollibPacketManager(ChatItem pl) {
|
||||
protocolManager = ProtocolLibrary.getProtocolManager();
|
||||
protocolManager.addPacketListener(new PacketAdapter(pl, ListenerPriority.LOWEST, Arrays.asList(Play.Server.CHAT)) {
|
||||
List<com.comphenix.protocol.PacketType> list = new ArrayList<>();
|
||||
list.add(Play.Server.CHAT);
|
||||
try {
|
||||
list.add((com.comphenix.protocol.PacketType) Play.Server.class.getDeclaredField("SYSTEM_CHAT").get(null));
|
||||
} catch (Exception e) {
|
||||
// ignore because using old version
|
||||
}
|
||||
protocolManager.addPacketListener(new PacketAdapter(pl, ListenerPriority.LOWEST, list) {
|
||||
@Override
|
||||
public void onPacketSending(PacketEvent e) {
|
||||
Player p = e.getPlayer();
|
||||
if (p == null || e.isPlayerTemporary())
|
||||
return;
|
||||
ChatItemPacket packet = onPacketSent(PacketType.getType(e.getPacket().getHandle().getClass().getSimpleName()),
|
||||
p, e.getPacket().getHandle());
|
||||
if(packet == null)
|
||||
ChatItemPacket packet = onPacketSent(PacketType.getType(e.getPacket().getHandle().getClass().getSimpleName()), p, e.getPacket().getHandle());
|
||||
if(packet == null) {
|
||||
ChatItem.debug("Can't find packet: " + e.getPacket().getHandle().getClass().getName());
|
||||
return;
|
||||
}
|
||||
if(!e.isCancelled())
|
||||
e.setCancelled(packet.isCancelled());
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package me.dadus33.chatitem.chatmanager.v1.utils;
|
||||
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
|
||||
@Deprecated
|
||||
public class Item {
|
||||
private String id;
|
||||
private byte amount;
|
||||
|
||||
@@ -5,19 +5,25 @@ import static me.dadus33.chatitem.utils.Version.V1_11;
|
||||
import static me.dadus33.chatitem.utils.Version.V1_8;
|
||||
import static me.dadus33.chatitem.utils.Version.V1_9;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
@Deprecated
|
||||
public class ItemRewriter {
|
||||
|
||||
public static void remapIds(int server, int player, Item item) {
|
||||
public static String remapIds(int server, int player, ItemStack is) {
|
||||
Item item = new Item();
|
||||
item.setAmount((byte)is.getAmount());
|
||||
//item.setData(is.getDurability());
|
||||
//item.setId(id);
|
||||
//item.setTag(tag);
|
||||
if (areIdsCompatible(server, player)) {
|
||||
return;
|
||||
return item.getId();
|
||||
}
|
||||
if ((server >= V1_9.MIN_VER && player <= V1_8.MAX_VER) || (player >= V1_9.MIN_VER && server <= V1_8.MAX_VER)) {
|
||||
if ((server >= V1_9.MIN_VER && player <= V1_8.MAX_VER)) {
|
||||
ItemRewriter_1_9_TO_1_8.reversedToClient(item);
|
||||
return;
|
||||
}
|
||||
ItemRewriter_1_9_TO_1_8.toClient(item);
|
||||
return;
|
||||
} else
|
||||
ItemRewriter_1_9_TO_1_8.toClient(item);
|
||||
}
|
||||
if ((server <= V1_10.MAX_VER && player >= V1_11.MIN_VER)
|
||||
|| (player <= V1_10.MAX_VER && server >= V1_11.MIN_VER)) {
|
||||
@@ -27,6 +33,7 @@ public class ItemRewriter {
|
||||
ItemRewriter_1_11_TO_1_10.reverseToClient(item);
|
||||
}
|
||||
}
|
||||
return item.getId();
|
||||
}
|
||||
|
||||
public static boolean areIdsCompatible(int version1, int version2) {
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.google.common.collect.HashBiMap;
|
||||
/**
|
||||
* Thanks to the developers of ViaVersion for this!
|
||||
*/
|
||||
@Deprecated
|
||||
public class ItemRewriter_1_11_TO_1_10 {
|
||||
private static BiMap<String, String> oldToNewNames = HashBiMap.create();
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import java.util.Map;
|
||||
/**
|
||||
* Thanks to the developers of ViaVersion for this!
|
||||
*/
|
||||
@Deprecated
|
||||
public class ItemRewriter_1_9_TO_1_8 {
|
||||
|
||||
private static final Map<String, Integer> ENTTIY_NAME_TO_ID = new HashMap<>();
|
||||
|
||||
@@ -3,11 +3,10 @@ package me.dadus33.chatitem.chatmanager.v2;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@@ -18,28 +17,24 @@ import org.bukkit.inventory.ItemStack;
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.hook.DiscordSrvSupport;
|
||||
import me.dadus33.chatitem.itemnamer.NamerManager;
|
||||
import me.dadus33.chatitem.playernamer.PlayerNamerManager;
|
||||
import me.dadus33.chatitem.utils.ColorManager;
|
||||
import me.dadus33.chatitem.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.HoverEvent.Action;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class ChatListener implements Listener {
|
||||
|
||||
private final static String NAME = "{name}";
|
||||
private final static String AMOUNT = "{amount}";
|
||||
private final static String TIMES = "{times}";
|
||||
private final static String LEFT = "{remaining}";
|
||||
private final HashMap<String, Long> COOLDOWNS = new HashMap<>();
|
||||
private ChatListenerChatManager manage;
|
||||
private Method saveMethod;
|
||||
private boolean shouldUseAppendMethod = false;
|
||||
@@ -66,48 +61,19 @@ public class ChatListener implements Listener {
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
Logger log = ChatItem.getInstance().getLogger();
|
||||
String appendMethodMsg = shouldUseAppendMethod ? "Use ComponentBuilder's method."
|
||||
: "Use own ComponentBuilder append method.";
|
||||
if (saveMethod == null)
|
||||
ChatItem.getInstance().getLogger()
|
||||
.info("Failed to find save method. Using default system. " + appendMethodMsg);
|
||||
log.info("Failed to find save method. Using default system. " + appendMethodMsg);
|
||||
else
|
||||
ChatItem.getInstance().getLogger()
|
||||
.info("Save method founded: " + saveMethod.getName() + ". " + appendMethodMsg);
|
||||
log.info("Save method founded: " + saveMethod.getName() + ". " + appendMethodMsg);
|
||||
}
|
||||
|
||||
public Storage getStorage() {
|
||||
return manage.getStorage();
|
||||
}
|
||||
|
||||
private String calculateTime(long seconds) {
|
||||
if (seconds < 60) {
|
||||
return seconds + getStorage().SECONDS;
|
||||
}
|
||||
if (seconds < 3600) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int minutes = (int) seconds / 60;
|
||||
builder.append(minutes).append(getStorage().MINUTES);
|
||||
int secs = (int) seconds - minutes * 60;
|
||||
if (secs != 0) {
|
||||
builder.append(" ").append(secs).append(getStorage().SECONDS);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int hours = (int) seconds / 3600;
|
||||
builder.append(hours).append(getStorage().HOURS);
|
||||
int minutes = (int) (seconds / 60) - (hours * 60);
|
||||
if (minutes != 0) {
|
||||
builder.append(" ").append(minutes).append(getStorage().MINUTES);
|
||||
}
|
||||
int secs = (int) (seconds - ((seconds / 60) * 60));
|
||||
if (secs != 0) {
|
||||
builder.append(" ").append(secs).append(getStorage().SECONDS);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onChat(AsyncPlayerChatEvent e) {
|
||||
Storage c = getStorage();
|
||||
@@ -126,101 +92,71 @@ public class ChatListener implements Listener {
|
||||
return;
|
||||
}
|
||||
Player p = e.getPlayer();
|
||||
boolean found = false, hasv1 = false;
|
||||
|
||||
boolean hasv1 = false;
|
||||
String placeholder = null;
|
||||
for (String rep : c.PLACEHOLDERS) {
|
||||
// v1 try to manage it, but the message have not been changed by another plugin
|
||||
if (e.getMessage().contains(rep + ChatManager.SEPARATOR + p.getName())) {
|
||||
hasv1 = true;
|
||||
found = true;
|
||||
ChatItem.debug("Found v1 placeholders in v2");
|
||||
placeholder = rep;
|
||||
break;
|
||||
}
|
||||
if (e.getMessage().contains(rep)) {
|
||||
found = true;
|
||||
placeholder = rep;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
if (placeholder == null) { // if not found
|
||||
ChatItem.debug("(v2) Can't found placeholder in: " + e.getMessage() + " > " + PlayerNamerManager.getPlayerNamer().getName(p));
|
||||
return;
|
||||
}
|
||||
if (c.PERMISSION_ENABLED && !p.hasPermission(c.PERMISSION_NAME)) {
|
||||
if (!getStorage().LET_MESSAGE_THROUGH) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!c.NO_PERMISSION_MESSAGE.isEmpty() && c.SHOW_NO_PERM_NORMAL) {
|
||||
p.sendMessage(c.NO_PERMISSION_MESSAGE);
|
||||
}
|
||||
ItemStack item = ChatManager.getUsableItem(p);
|
||||
if(!ChatManager.canShowItem(p, item, e))
|
||||
return;
|
||||
}
|
||||
if (p.getItemInHand().getType().equals(Material.AIR)) {
|
||||
if (c.DENY_IF_NO_ITEM) {
|
||||
e.setCancelled(true);
|
||||
if (!c.DENY_MESSAGE.isEmpty())
|
||||
e.getPlayer().sendMessage(c.DENY_MESSAGE);
|
||||
return;
|
||||
}
|
||||
if (c.HAND_DISABLED) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (c.COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) { // use cooldown
|
||||
if (COOLDOWNS.containsKey(p.getName())) {
|
||||
long start = COOLDOWNS.get(p.getName());
|
||||
long current = System.currentTimeMillis() / 1000;
|
||||
long elapsed = current - start;
|
||||
if (elapsed >= getStorage().COOLDOWN) {
|
||||
COOLDOWNS.remove(p.getName());
|
||||
} else {
|
||||
if (!c.LET_MESSAGE_THROUGH) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!c.COOLDOWN_MESSAGE.isEmpty()) {
|
||||
long left = (start + c.COOLDOWN) - current;
|
||||
p.sendMessage(c.COOLDOWN_MESSAGE.replace(LEFT, calculateTime(left)));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
COOLDOWNS.put(p.getName(), System.currentTimeMillis() / 1000);
|
||||
}
|
||||
e.setCancelled(true);
|
||||
String format = e.getFormat();
|
||||
String msg, defMsg = e.getMessage();
|
||||
for (String rep : c.PLACEHOLDERS) {
|
||||
if (hasv1)
|
||||
defMsg = defMsg.replace(rep + ChatManager.SEPARATOR + p.getName(), ChatManager.SEPARATOR + ""); // remove
|
||||
// v1
|
||||
// char
|
||||
if (hasv1) // remove v1 char
|
||||
defMsg = defMsg.replace(rep + ChatManager.SEPARATOR + p.getName(), String.valueOf(ChatManager.SEPARATOR));
|
||||
else
|
||||
defMsg = defMsg.replace(rep, ChatManager.SEPARATOR + "");
|
||||
defMsg = defMsg.replace(rep, String.valueOf(ChatManager.SEPARATOR));
|
||||
}
|
||||
if (Utils.countMatches(defMsg, String.valueOf(ChatManager.SEPARATOR)) > getStorage().LIMIT) {
|
||||
e.setCancelled(true);
|
||||
if (getStorage().LIMIT_MESSAGE.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
p.sendMessage(getStorage().LIMIT_MESSAGE);
|
||||
return;
|
||||
}
|
||||
if (format.contains("%1$s") || format.contains("%2$s")) {
|
||||
ChatItem.debug("Begin def msg: " + defMsg + "");
|
||||
msg = (format.contains("%2$s") ? String.format(format, p.getDisplayName(), defMsg)
|
||||
: String.format(format, p.getDisplayName()));
|
||||
} else {
|
||||
msg = format.replace(e.getMessage(), defMsg);
|
||||
}
|
||||
ItemStack item = p.getItemInHand();
|
||||
String itemName = ItemUtils.isEmpty(item) ? (c.HAND_DISABLED ? c.PLACEHOLDERS.get(0) : c.HAND_NAME)
|
||||
: styleItem(p, item, c);
|
||||
String itemName = ChatManager.getNameOfItem(p, item, c);
|
||||
String loggedMessage = msg.replace(ChatManager.SEPARATOR + "", itemName).replace("{name}", p.getName())
|
||||
.replace("{display-name}", p.getDisplayName());
|
||||
Bukkit.getConsoleSender().sendMessage(loggedMessage); // show in log
|
||||
if (ChatItem.discordSrvSupport)
|
||||
DiscordSrvSupport.sendchatMessage(p, loggedMessage);
|
||||
DiscordSrvSupport.sendChatMessage(p, defMsg.replace(ChatManager.SEPARATOR + "", itemName).replace("{name}", p.getName())
|
||||
.replace("{display-name}", p.getDisplayName()));
|
||||
ChatItem.debug("Msg: " + msg.replace(ChatColor.COLOR_CHAR, '&') + ", format: " + format);
|
||||
e.getRecipients().forEach((pl) -> showItem(pl, p, item, msg));
|
||||
if (c.COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
ChatManager.COOLDOWNS.put(p.getUniqueId(), System.currentTimeMillis() / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
private void showItem(Player to, Player origin, ItemStack item, String msg) {
|
||||
ComponentBuilder builder = new ComponentBuilder("");
|
||||
ChatColor color = ChatColor.RESET;
|
||||
ChatColor color = ChatColor.WHITE;
|
||||
String colorCode = "", text = "";
|
||||
boolean waiting = false, isHex = false;
|
||||
boolean waiting = false;
|
||||
for (char args : msg.toCharArray()) {
|
||||
if (args == '§') { // begin of color
|
||||
if (colorCode.isEmpty() && !text.isEmpty()) { // text before this char
|
||||
@@ -236,22 +172,29 @@ public class ChatListener implements Listener {
|
||||
color = ChatColor.RESET;
|
||||
continue;
|
||||
}
|
||||
if(args == 'x' && colorCode.isEmpty())
|
||||
isHex = true;
|
||||
colorCode += args; // a color by itself
|
||||
if(args == 'x' && !colorCode.isEmpty()) {
|
||||
text += ColorManager.getColorString(colorCode);
|
||||
colorCode = "x";
|
||||
} else
|
||||
colorCode += args; // a color by itself
|
||||
} else {
|
||||
waiting = false;
|
||||
if(!colorCode.isEmpty()) {
|
||||
if(isHex && colorCode.length() >= 7)
|
||||
color = ColorManager.getColor(colorCode);
|
||||
else if(colorCode.length() == 1) // if only one color code
|
||||
if(colorCode.startsWith("x") && colorCode.length() >= 7) {
|
||||
if(colorCode.length() == 7)
|
||||
color = ColorManager.getColor(colorCode);
|
||||
else {
|
||||
color = ColorManager.getColor(colorCode.substring(0, 7)); // only the hex code
|
||||
ChatItem.debug("Adding color for " + colorCode.substring(7, colorCode.length()) + " (in " + colorCode + ")");
|
||||
text += ColorManager.getColorString(colorCode.substring(7, colorCode.length()));
|
||||
}
|
||||
} else if(colorCode.length() == 1) // if only one color code
|
||||
color = ColorManager.getColor(colorCode);
|
||||
else
|
||||
text += ColorManager.getColorString(colorCode);
|
||||
colorCode = "";
|
||||
}
|
||||
if (args == ChatManager.SEPARATOR
|
||||
&& (!getStorage().HAND_DISABLED || (item != null && item.hasItemMeta()))) {
|
||||
if (args == ChatManager.SEPARATOR) {
|
||||
// here put the item
|
||||
appendToComponentBuilder(builder, new ComponentBuilder(text).color(color).create());
|
||||
addItem(builder, to, origin, item);
|
||||
@@ -278,7 +221,7 @@ public class ChatListener implements Listener {
|
||||
try {
|
||||
Class<?> nbtTag = PacketUtils.getNmsClass("NBTTagCompound", "nbt.");
|
||||
Class<?> craftItemClass = PacketUtils.getObcClass("inventory.CraftItemStack");
|
||||
Object nmsNbtTagCompoundObj = nbtTag.newInstance();
|
||||
Object nmsNbtTagCompoundObj = nbtTag.getConstructor().newInstance();
|
||||
if (saveMethod == null) {
|
||||
Object nmsItemStackObj = craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, itemStack);
|
||||
return nmsItemStackObj.getClass().getMethod("save", nbtTag)
|
||||
@@ -295,7 +238,7 @@ public class ChatListener implements Listener {
|
||||
|
||||
public void addItem(ComponentBuilder builder, Player to, Player origin, ItemStack item) {
|
||||
if (!ItemUtils.isEmpty(item)) {
|
||||
ComponentBuilder itemComponent = new ComponentBuilder(ChatListener.styleItem(to, item, getStorage()));
|
||||
ComponentBuilder itemComponent = new ComponentBuilder(ChatManager.styleItem(to, item, getStorage()));
|
||||
String itemJson = convertItemStackToJson(item);
|
||||
itemComponent.event(new HoverEvent(Action.SHOW_ITEM, new ComponentBuilder(itemJson).create()));
|
||||
appendToComponentBuilder(builder, itemComponent.create());
|
||||
@@ -311,7 +254,7 @@ public class ChatListener implements Listener {
|
||||
if (stay > 0)
|
||||
handTooltip.append("\n");
|
||||
}
|
||||
handComp.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, handTooltip.create()));
|
||||
handComp.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(handTooltip.create())));
|
||||
if (handName.contains("{name}")) {
|
||||
String[] splitted = handName.split("\\{name\\}");
|
||||
for (int i = 0; i < (splitted.length - 1); i++) {
|
||||
@@ -325,26 +268,7 @@ public class ChatListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
public static String styleItem(Player p, ItemStack item, Storage c) {
|
||||
String replacer = c.NAME_FORMAT;
|
||||
String amount = c.AMOUNT_FORMAT;
|
||||
|
||||
if (item.getAmount() == 1) {
|
||||
if (c.FORCE_ADD_AMOUNT) {
|
||||
amount = amount.replace(TIMES, "1");
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
} else {
|
||||
replacer = replacer.replace(AMOUNT, "");
|
||||
}
|
||||
} else {
|
||||
amount = amount.replace(TIMES, String.valueOf(item.getAmount()));
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
}
|
||||
replacer = replacer.replace(NAME, NamerManager.getName(p, item, c));
|
||||
return replacer;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
@SuppressWarnings("unchecked")
|
||||
public void appendToComponentBuilder(ComponentBuilder builder, BaseComponent[] comps) {
|
||||
if (shouldUseAppendMethod) {
|
||||
try {
|
||||
|
||||
@@ -5,18 +5,14 @@ import org.bukkit.event.HandlerList;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulatorCurrent;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class ChatListenerChatManager extends ChatManager {
|
||||
|
||||
private final JSONManipulatorCurrent jsonManipulator;
|
||||
private final ChatListener chatListener;
|
||||
private boolean baseComponentAvailable = true;
|
||||
|
||||
public ChatListenerChatManager(ChatItem pl) {
|
||||
jsonManipulator = new JSONManipulatorCurrent();
|
||||
chatListener = new ChatListener(this);
|
||||
|
||||
//Check for existence of BaseComponent class (only on spigot)
|
||||
@@ -48,15 +44,6 @@ public class ChatListenerChatManager extends ChatManager {
|
||||
public void unload(ChatItem pl) {
|
||||
HandlerList.unregisterAll(chatListener);
|
||||
}
|
||||
|
||||
public JSONManipulator getManipulator(){
|
||||
/*
|
||||
We used to have 2 kinds of JSONManipulators because of my bad understanding of the 1.7 way of parsing JSON chat
|
||||
The interface should however stay as there might be great changes in future versions in JSON parsing (most likely 1.13)
|
||||
*/
|
||||
return jsonManipulator;
|
||||
//We just return a new one whenever requested for the moment, should implement a cache of some sort some time though
|
||||
}
|
||||
|
||||
public boolean supportsChatComponentApi(){
|
||||
return baseComponentAvailable;
|
||||
|
||||
@@ -20,50 +20,52 @@ import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
||||
|
||||
public class ChatItemCommand implements CommandExecutor, TabExecutor {
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||
if(!(sender instanceof Player)) {
|
||||
Messages.sendMessage(sender, "only-players");
|
||||
return false;
|
||||
}
|
||||
Player p = (Player) sender;
|
||||
if(args.length == 0) {
|
||||
Messages.sendMessage(p, "chatitem-cmd.help");
|
||||
} else if(args[0].equalsIgnoreCase("admin")) {
|
||||
InventoryListener.open(p);
|
||||
} else if(args[0].equalsIgnoreCase("reload")) {
|
||||
ChatItem.reload(sender);
|
||||
} else if(args[0].equalsIgnoreCase("link") || args[0].equalsIgnoreCase("links")) {
|
||||
ConfigurationSection config = ChatItem.getInstance().getConfig().getConfigurationSection("messages.chatitem-cmd.links");
|
||||
TextComponent text = new TextComponent(Storage.color(config.getString("begin")));
|
||||
for(String key : config.getConfigurationSection("list").getKeys(false)) {
|
||||
ConfigurationSection linkConfig = config.getConfigurationSection("list." + key);
|
||||
TextComponent linkComp = new TextComponent(Storage.color(linkConfig.getString("message")));
|
||||
String hover = Storage.color(linkConfig.getString("hover"));
|
||||
if(hover != null)
|
||||
linkComp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hover).create()));
|
||||
String link = linkConfig.getString("link");
|
||||
if(link != null)
|
||||
linkComp.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, link));
|
||||
text.addExtra(linkComp);
|
||||
}
|
||||
p.spigot().sendMessage(text);
|
||||
} else {
|
||||
Messages.sendMessage(p, "chatitem-cmd.help");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
Messages.sendMessage(sender, "only-players");
|
||||
return false;
|
||||
}
|
||||
Player p = (Player) sender;
|
||||
if (args.length == 0) {
|
||||
Messages.sendMessage(p, "chatitem-cmd.help");
|
||||
} else if (args[0].equalsIgnoreCase("admin")) {
|
||||
InventoryListener.open(p);
|
||||
} else if (args[0].equalsIgnoreCase("reload")) {
|
||||
ChatItem.reload(sender);
|
||||
} else if (args[0].equalsIgnoreCase("link") || args[0].equalsIgnoreCase("links")) {
|
||||
ConfigurationSection config = ChatItem.getInstance().getConfig()
|
||||
.getConfigurationSection("messages.chatitem-cmd.links");
|
||||
TextComponent text = new TextComponent(Storage.color(config.getString("begin")));
|
||||
for (String key : config.getConfigurationSection("list").getKeys(false)) {
|
||||
ConfigurationSection linkConfig = config.getConfigurationSection("list." + key);
|
||||
TextComponent linkComp = new TextComponent(Storage.color(linkConfig.getString("message")));
|
||||
String hover = Storage.color(linkConfig.getString("hover"));
|
||||
if (hover != null)
|
||||
linkComp.setHoverEvent(
|
||||
new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(new ComponentBuilder(hover).create())));
|
||||
String link = linkConfig.getString("link");
|
||||
if (link != null)
|
||||
linkComp.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, link));
|
||||
text.addExtra(linkComp);
|
||||
}
|
||||
p.spigot().sendMessage(text);
|
||||
} else {
|
||||
Messages.sendMessage(p, "chatitem-cmd.help");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] arg) {
|
||||
List<String> list = new ArrayList<>();
|
||||
String prefix = arg[arg.length - 1].toLowerCase(Locale.ROOT);
|
||||
for(String s : Arrays.asList("help", "admin", "reload"))
|
||||
if(prefix.isEmpty() || s.startsWith(prefix))
|
||||
for (String s : Arrays.asList("help", "admin", "reload", "link"))
|
||||
if (prefix.isEmpty() || s.startsWith(prefix))
|
||||
list.add(s);
|
||||
return list.isEmpty() ? null : list;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import github.scarsz.discordsrv.DiscordSRV;
|
||||
|
||||
public class DiscordSrvSupport {
|
||||
|
||||
public static void sendchatMessage(Player p, String message) {
|
||||
public static void sendChatMessage(Player p, String message) {
|
||||
DiscordSRV pl = DiscordSRV.getPlugin();
|
||||
if (DiscordSRV.config().getBooleanElse("UseModernPaperChatEvent", false) && pl.isModernChatEventAvailable()) {
|
||||
return;
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package me.dadus33.chatitem.hook;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import com.willfp.ecoenchants.display.EnchantmentCache;
|
||||
import com.willfp.ecoenchants.enchantments.util.EnchantChecks;
|
||||
|
||||
public class EcoEnchantsSupport {
|
||||
|
||||
public static List<String> getLores(ItemStack item) {
|
||||
List<String> lores = new ArrayList<>();
|
||||
EnchantChecks.getEnchantsOnItem(item).forEach((en, lvl) -> {
|
||||
lores.add(EnchantmentCache.getEntry(en).getNameWithLevel(lvl));
|
||||
});
|
||||
return lores;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -30,7 +30,7 @@ public interface INamer {
|
||||
*/
|
||||
String getName(Player p, ItemStack item, Storage storage);
|
||||
|
||||
public static enum Priority {
|
||||
enum Priority {
|
||||
MAJOR(4),
|
||||
IMPORTANT(3),
|
||||
MEDIUM(2),
|
||||
@@ -39,7 +39,7 @@ public interface INamer {
|
||||
|
||||
private final int priority;
|
||||
|
||||
private Priority(int priority) {
|
||||
Priority(int priority) {
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ public interface INamer {
|
||||
}
|
||||
|
||||
public static List<Priority> getOrderedPriorities() {
|
||||
return Arrays.asList(values()).stream().sorted((p1, p2) -> p2.getPriority() - p1.getPriority()).collect(Collectors.toList());
|
||||
return Arrays.stream(values()).sorted((p1, p2) -> p2.getPriority() - p1.getPriority()).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,9 +21,7 @@ public class ChatItemTranslationNamer implements INamer {
|
||||
if (translationSection != null) {
|
||||
@SuppressWarnings("deprecation")
|
||||
String translated = translationSection.get(item.getDurability());
|
||||
if (translated != null) {
|
||||
return translated;
|
||||
}
|
||||
return translated;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -4,16 +4,18 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
||||
|
||||
public class JoinListener implements Listener {
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent e) {
|
||||
Player p = e.getPlayer();
|
||||
@@ -22,9 +24,14 @@ public class JoinListener implements Listener {
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
if(pl.isHasNewVersion()) {
|
||||
TextComponent text = new TextComponent(pl.getStorage().JOIN_UPDATE_MESSAGE);
|
||||
text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(pl.getStorage().JOIN_UPDATE_HOVER).create()));
|
||||
text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(new ComponentBuilder(pl.getStorage().JOIN_UPDATE_HOVER).create())));
|
||||
text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.spigotmc.org/resources/19064/"));
|
||||
p.spigot().sendMessage(text);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onLeft(PlayerQuitEvent e) {
|
||||
ChatManager.clear(e.getPlayer());
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.playerversion;
|
||||
package me.dadus33.chatitem.playerversion;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@@ -9,6 +9,6 @@ public interface IPlayerVersion {
|
||||
public int getProtocolVersion(Player p);
|
||||
|
||||
default Version getPlayerVersion(Player p) {
|
||||
return Version.getVersion(getProtocolVersion(p));
|
||||
return Version.getVersion(getProtocolVersion(p), Version.getVersion());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package me.dadus33.chatitem.playerversion;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.playerversion.hooks.DefaultVersionHook;
|
||||
import me.dadus33.chatitem.playerversion.hooks.ProtocolSupportHook;
|
||||
import me.dadus33.chatitem.playerversion.hooks.ViaVersionHook;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
public class PlayerVersionManager {
|
||||
|
||||
private static final IPlayerVersion playerVersionAdapter;
|
||||
|
||||
static {
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
if (Bukkit.getPluginManager().getPlugin("ViaVersion") != null) {
|
||||
playerVersionAdapter = new ViaVersionHook();
|
||||
pl.getLogger().info("Loading ViaVersion support ...");
|
||||
} else if (Bukkit.getPluginManager().getPlugin("ProtocolSupport") != null) {
|
||||
playerVersionAdapter = new ProtocolSupportHook();
|
||||
pl.getLogger().info("Loading ProtocolSupport support ...");
|
||||
} else {
|
||||
playerVersionAdapter = new DefaultVersionHook();
|
||||
}
|
||||
}
|
||||
|
||||
public static IPlayerVersion getPlayerVersionAdapter() {
|
||||
return playerVersionAdapter;
|
||||
}
|
||||
}
|
||||
+2
-6
@@ -1,22 +1,18 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.playerversion.hooks;
|
||||
package me.dadus33.chatitem.playerversion.hooks;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.IPlayerVersion;
|
||||
import me.dadus33.chatitem.playerversion.IPlayerVersion;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
|
||||
public class DefaultVersionHook implements IPlayerVersion {
|
||||
|
||||
public static final HashMap<String, Integer> PROTOCOL_PER_ADDRESS = new HashMap<>();
|
||||
public static final HashMap<UUID, Integer> PROTOCOL_PER_UUID = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public int getProtocolVersion(Player p) {
|
||||
if(PROTOCOL_PER_UUID.containsKey(p.getUniqueId()))
|
||||
return PROTOCOL_PER_UUID.get(p.getUniqueId());
|
||||
return PROTOCOL_PER_ADDRESS.getOrDefault(Version.stringifyAdress(p.getAddress()), Version.getVersion().MAX_VER);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.playerversion.hooks;
|
||||
package me.dadus33.chatitem.playerversion.hooks;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.IPlayerVersion;
|
||||
import me.dadus33.chatitem.playerversion.IPlayerVersion;
|
||||
import protocolsupport.api.ProtocolSupportAPI;
|
||||
|
||||
public class ProtocolSupportHook implements IPlayerVersion {
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.playerversion.hooks;
|
||||
package me.dadus33.chatitem.playerversion.hooks;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.playerversion.IPlayerVersion;
|
||||
import me.dadus33.chatitem.playerversion.IPlayerVersion;
|
||||
import us.myles.ViaVersion.api.Via;
|
||||
|
||||
public class ViaVersionHook implements IPlayerVersion {
|
||||
@@ -8,24 +8,23 @@ public class ColorManager {
|
||||
public static String getColorString(String input) {
|
||||
if(input == null || input.isEmpty())
|
||||
return "";
|
||||
String str = "";
|
||||
StringBuilder str = new StringBuilder();
|
||||
if(Version.getVersion().isNewerOrEquals(Version.V1_16) && input.startsWith("x")) { // x mean it's an hex
|
||||
ChatItem.debug("Removing char x at begin: " + input.substring(1));
|
||||
input = input.substring(1);
|
||||
if(input.length() >= 6) { // at least hex
|
||||
str += ChatColor.of("#" + input.substring(0, 6)); // get first hex color code
|
||||
str.append(ChatColor.of("#" + input.substring(0, 6))); // get first hex color code
|
||||
ChatItem.debug("Str with hex: " + str);
|
||||
if(input.length() > 6) // if as another color code
|
||||
str += getColorString(input.substring(6)); // get color for after
|
||||
return str;
|
||||
str.append(getColorString(input.substring(6))); // get color for after
|
||||
return str.toString();
|
||||
} else
|
||||
ChatItem.debug("Low len: " + input.length());
|
||||
} else
|
||||
ChatItem.debug("1.15 - for : " + input);
|
||||
}
|
||||
// not hex
|
||||
for(char c : input.toCharArray())
|
||||
str += ChatColor.getByChar(c);
|
||||
return str;
|
||||
str.append(ChatColor.getByChar(c));
|
||||
return str.toString();
|
||||
}
|
||||
|
||||
public static ChatColor getColor(String input) {
|
||||
@@ -37,8 +36,7 @@ public class ColorManager {
|
||||
return ChatColor.of("#" + input.substring(1, 7)); // get first hex color code
|
||||
} else
|
||||
ChatItem.debug("Low len: " + input.length());
|
||||
} else
|
||||
ChatItem.debug("1.15 - for : " + input);
|
||||
}
|
||||
// not hex
|
||||
return ChatColor.getByChar(input.charAt(0));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
|
||||
public class ReflectionUtils {
|
||||
|
||||
@@ -28,15 +31,22 @@ public class ReflectionUtils {
|
||||
* @param field the name of the field
|
||||
* @return the requested object of the field
|
||||
*/
|
||||
public static Object getObject(Object source, String field) {
|
||||
public static Object getObject(Object source, String... field) {
|
||||
try {
|
||||
Field f = source.getClass().getDeclaredField(field);
|
||||
f.setAccessible(true);
|
||||
return f.get(source);
|
||||
for(String fieldName : field) {
|
||||
try {
|
||||
Field f = source.getClass().getDeclaredField(fieldName);
|
||||
f.setAccessible(true);
|
||||
return f.get(source);
|
||||
} catch (NoSuchFieldException e) {
|
||||
// ignore because going to next item
|
||||
}
|
||||
}
|
||||
ChatItem.getInstance().getLogger().severe("Failed to find fields: " + String.join(", ", field) + " in " + source.getClass().getSimpleName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -74,7 +84,7 @@ public class ReflectionUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the first field which have the searching for class type
|
||||
* Get the first object which have the searching for class type
|
||||
*
|
||||
* @param from the object where we will try to find the field
|
||||
* @param clazz the class that have to define the field
|
||||
@@ -85,11 +95,30 @@ public class ReflectionUtils {
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T getFirstWith(Object from, Class<?> clazz, Class<T> searchingFor) throws Exception {
|
||||
for (Field f : clazz.getDeclaredFields()) {
|
||||
if (f.getType().equals(searchingFor)) {
|
||||
if (f.getType().equals(searchingFor) && !Modifier.isStatic(f.getModifiers())) {
|
||||
f.setAccessible(true);
|
||||
return (T) f.get(from);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the first field which have the searching for class type
|
||||
*
|
||||
* @param from the object where we will try to find the field
|
||||
* @param clazz the class that have to define the field
|
||||
* @param searchingFor the class of the required field
|
||||
* @return the field (or null if not found)
|
||||
* @throws Exception if something gone wrong
|
||||
*/
|
||||
public static Field getFirstFieldWith(Class<?> clazz, Class<?> searchingFor) throws Exception {
|
||||
for (Field f : clazz.getDeclaredFields()) {
|
||||
if (f.getType().equals(searchingFor) && !Modifier.isStatic(f.getModifiers())) {
|
||||
f.setAccessible(true);
|
||||
return f;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,121 +1,122 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class Storage {
|
||||
|
||||
private FileConfiguration conf;
|
||||
public final HashMap<String, HashMap<Short, String>> TRANSLATIONS = new HashMap<>();
|
||||
public boolean COLOR_IF_ALREADY_COLORED, FORCE_ADD_AMOUNT, LET_MESSAGE_THROUGH, DENY_IF_NO_ITEM, DEBUG,
|
||||
HAND_DISABLED, SHOW_NO_PERM_NORMAL, CHECK_UPDATE, SHOW_NO_PERM_COMMAND, PERMISSION_ENABLED;
|
||||
public final String HAND_NAME, NAME_FORMAT, AMOUNT_FORMAT, MANAGER, PERMISSION_NAME;
|
||||
public final String NO_PERMISSION_MESSAGE, DENY_MESSAGE, RELOAD_MESSAGE, COOLDOWN_MESSAGE, LIMIT_MESSAGE;
|
||||
public final String SECONDS, MINUTES, HOURS;
|
||||
public final String JOIN_UPDATE_MESSAGE, JOIN_UPDATE_HOVER;
|
||||
public int CONFIG_VERSION, LIMIT, COOLDOWN;
|
||||
public final List<Command> ALLOWED_PLUGIN_COMMANDS = new ArrayList<>();
|
||||
public final List<String> ALLOWED_DEFAULT_COMMANDS = new ArrayList<>();
|
||||
public final List<String> PLACEHOLDERS, HAND_TOOLTIP;
|
||||
public final HashMap<String, HashMap<Short, String>> TRANSLATIONS = new HashMap<>();
|
||||
public final String HAND_NAME, NAME_FORMAT, AMOUNT_FORMAT, MANAGER, PERMISSION_NAME, BUGGED_CLIENT_ACTION;
|
||||
public final String NO_PERMISSION_MESSAGE, DENY_MESSAGE, RELOAD_MESSAGE, COOLDOWN_MESSAGE, LIMIT_MESSAGE;
|
||||
public final String SECONDS, MINUTES, HOURS;
|
||||
public final String JOIN_UPDATE_MESSAGE, JOIN_UPDATE_HOVER;
|
||||
public final List<Command> ALLOWED_PLUGIN_COMMANDS = new ArrayList<>();
|
||||
public final List<String> ALLOWED_DEFAULT_COMMANDS = new ArrayList<>();
|
||||
public final List<String> PLACEHOLDERS, HAND_TOOLTIP, BUGGED_CLIENTS_TOOLTIP;
|
||||
public boolean COLOR_IF_ALREADY_COLORED, FORCE_ADD_AMOUNT, LET_MESSAGE_THROUGH, DENY_IF_NO_ITEM, DEBUG,
|
||||
HAND_DISABLED, SHOW_NO_PERM_NORMAL, CHECK_UPDATE, SHOW_NO_PERM_COMMAND, PERMISSION_ENABLED;
|
||||
public int CONFIG_VERSION, LIMIT, COOLDOWN;
|
||||
private FileConfiguration conf;
|
||||
|
||||
public Storage(FileConfiguration cnf) {
|
||||
this.conf = cnf;
|
||||
CONFIG_VERSION = conf.getInt("config-version", 13);
|
||||
checkConfigVersion();
|
||||
this.MANAGER = conf.getString("manager", "auto");
|
||||
Set<String> keys = conf.getConfigurationSection("translations").getKeys(false);
|
||||
for (String key : keys) {
|
||||
HashMap<Short, String> entry = new HashMap<>();
|
||||
Set<String> subKeys = conf.getConfigurationSection("translations.".concat(key)).getKeys(false);
|
||||
for (String subKey : subKeys) {
|
||||
entry.put(Short.parseShort(subKey),
|
||||
color(conf.getString("translations.".concat(key).concat(".").concat(subKey))));
|
||||
}
|
||||
public Storage(FileConfiguration cnf) {
|
||||
this.conf = cnf;
|
||||
CONFIG_VERSION = conf.getInt("config-version", 13);
|
||||
checkConfigVersion();
|
||||
this.MANAGER = conf.getString("manager", "auto");
|
||||
Set<String> keys = conf.getConfigurationSection("translations").getKeys(false);
|
||||
for (String key : keys) {
|
||||
HashMap<Short, String> entry = new HashMap<>();
|
||||
Set<String> subKeys = conf.getConfigurationSection("translations.".concat(key)).getKeys(false);
|
||||
for (String subKey : subKeys) {
|
||||
entry.put(Short.parseShort(subKey),
|
||||
color(conf.getString("translations.".concat(key).concat(".").concat(subKey))));
|
||||
}
|
||||
|
||||
TRANSLATIONS.put(key, entry);
|
||||
}
|
||||
DEBUG = conf.getBoolean("debug", false);
|
||||
PLACEHOLDERS = ImmutableList.copyOf(conf.getStringList("general.placeholders"));
|
||||
NAME_FORMAT = color(conf.getString("general.name-format", "&b&l&o{name} {amount}&r"));
|
||||
AMOUNT_FORMAT = color(conf.getString("general.amount-format", "x{times}"));
|
||||
COLOR_IF_ALREADY_COLORED = conf.getBoolean("general.color-if-already-colored", true);
|
||||
LET_MESSAGE_THROUGH = conf.getBoolean("general.let-message-through", true);
|
||||
FORCE_ADD_AMOUNT = conf.getBoolean("general.force-add-amount", true);
|
||||
DENY_IF_NO_ITEM = conf.getBoolean("general.deny-if-no-item", false);
|
||||
TRANSLATIONS.put(key, entry);
|
||||
}
|
||||
DEBUG = conf.getBoolean("debug", false);
|
||||
PLACEHOLDERS = ImmutableList.copyOf(conf.getStringList("general.placeholders"));
|
||||
NAME_FORMAT = color(conf.getString("general.name-format", "&b&l&o{name} {amount}&r"));
|
||||
AMOUNT_FORMAT = color(conf.getString("general.amount-format", "x{times}"));
|
||||
COLOR_IF_ALREADY_COLORED = conf.getBoolean("general.color-if-already-colored", true);
|
||||
LET_MESSAGE_THROUGH = conf.getBoolean("general.let-message-through", true);
|
||||
FORCE_ADD_AMOUNT = conf.getBoolean("general.force-add-amount", true);
|
||||
DENY_IF_NO_ITEM = conf.getBoolean("general.deny-if-no-item", false);
|
||||
LIMIT = conf.getInt("general.limit", 8);
|
||||
COOLDOWN = conf.getInt("general.cooldown", 60);
|
||||
SHOW_NO_PERM_NORMAL = conf.getBoolean("general.show-no-permission-message.normal", true);
|
||||
COOLDOWN = conf.getInt("general.cooldown", 60);
|
||||
SHOW_NO_PERM_NORMAL = conf.getBoolean("general.show-no-permission-message.normal", true);
|
||||
SHOW_NO_PERM_COMMAND = conf.getBoolean("general.show-no-permission-message.command", false);
|
||||
PERMISSION_ENABLED = conf.getBoolean("general.permission.enabled", false);
|
||||
PERMISSION_NAME = conf.getString("general.permission.name", "chatitem.use");
|
||||
HAND_DISABLED = conf.getBoolean("general.hand.disabled", false);
|
||||
HAND_NAME = color(conf.getString("general.hand.name", "&b&l&o{display-name}&b&l&o's hand"));
|
||||
HAND_TOOLTIP = conf.getStringList("general.hand.tooltip");
|
||||
CHECK_UPDATE = conf.getBoolean("general.check-update", true);
|
||||
DENY_MESSAGE = color(conf.getString("messages.deny-message", "&c&lYou have no item in hand!"));
|
||||
RELOAD_MESSAGE = color(conf.getString("messages.reload-success", "&b&lSuccessful reload!"));
|
||||
NO_PERMISSION_MESSAGE = color(conf.getString("messages.no-permission",
|
||||
"&c&lI'm sorry, but you are not allowed to use the placeholder in chat!"));
|
||||
COOLDOWN_MESSAGE = color(conf.getString("messages.cooldown-message",
|
||||
"&c&lYou can only use items in chat once a minute! You have {remaining} left!"));
|
||||
JOIN_UPDATE_MESSAGE = color(conf.getString("messages.join-update.message",
|
||||
"&cA new version of ChatItem is available. &aClick here to download."));
|
||||
JOIN_UPDATE_HOVER = color(conf.getString("messages.join-update.hover", "&6Click to go to spigot page !"));
|
||||
HAND_DISABLED = conf.getBoolean("general.hand.disabled", false);
|
||||
HAND_NAME = color(conf.getString("general.hand.name", "&b&l&o{display-name}&b&l&o's hand"));
|
||||
HAND_TOOLTIP = conf.getStringList("general.hand.tooltip").stream().map(Storage::color).collect(Collectors.toList());
|
||||
BUGGED_CLIENT_ACTION = conf.getString("general.bugged_client.action", "show_both");
|
||||
BUGGED_CLIENTS_TOOLTIP = conf.getStringList("general.bugged_client.tooltip").stream().map(Storage::color).collect(Collectors.toList());
|
||||
CHECK_UPDATE = conf.getBoolean("general.check-update", true);
|
||||
DENY_MESSAGE = color(conf.getString("messages.deny-message", "&c&lYou have no item in hand!"));
|
||||
RELOAD_MESSAGE = color(conf.getString("messages.reload-success", "&b&lSuccessful reload!"));
|
||||
NO_PERMISSION_MESSAGE = color(conf.getString("messages.no-permission",
|
||||
"&c&lI'm sorry, but you are not allowed to use the placeholder in chat!"));
|
||||
COOLDOWN_MESSAGE = color(conf.getString("messages.cooldown-message",
|
||||
"&c&lYou can only use items in chat once a minute! You have {remaining} left!"));
|
||||
JOIN_UPDATE_MESSAGE = color(conf.getString("messages.join-update.message",
|
||||
"&cA new version of ChatItem is available. &aClick here to download."));
|
||||
JOIN_UPDATE_HOVER = color(conf.getString("messages.join-update.hover", "&6Click to go to spigot page !"));
|
||||
LIMIT_MESSAGE = color(conf.getString("messages.limit-message", "&c&lYou can only add 8 item placeholders per message!"));
|
||||
|
||||
SECONDS = color(conf.getString("messages.seconds", " seconds"));
|
||||
MINUTES = color(conf.getString("messages.minutes", " minutes"));
|
||||
HOURS = color(conf.getString("messages.hours", " hours"));
|
||||
colorStringList(HAND_TOOLTIP);
|
||||
final List<String> cmds = conf.getStringList("general.commands");
|
||||
Bukkit.getScheduler().runTaskLaterAsynchronously(ChatItem.getInstance(), () -> {
|
||||
for (String s : cmds) {
|
||||
Command c = Bukkit.getPluginCommand(s);
|
||||
if (c != null) {
|
||||
ALLOWED_PLUGIN_COMMANDS.add(c);
|
||||
} else {
|
||||
ALLOWED_DEFAULT_COMMANDS.add(s);
|
||||
}
|
||||
}
|
||||
}, 100L);
|
||||
|
||||
}
|
||||
SECONDS = color(conf.getString("messages.seconds", " seconds"));
|
||||
MINUTES = color(conf.getString("messages.minutes", " minutes"));
|
||||
HOURS = color(conf.getString("messages.hours", " hours"));
|
||||
colorStringList(HAND_TOOLTIP);
|
||||
final List<String> cmds = conf.getStringList("general.commands");
|
||||
Bukkit.getScheduler().runTaskLaterAsynchronously(ChatItem.getInstance(), () -> {
|
||||
for (String s : cmds) {
|
||||
Command c = Bukkit.getPluginCommand(s);
|
||||
if (c != null) {
|
||||
ALLOWED_PLUGIN_COMMANDS.add(c);
|
||||
} else {
|
||||
ALLOWED_DEFAULT_COMMANDS.add(s);
|
||||
}
|
||||
}
|
||||
}, 100L);
|
||||
|
||||
public static String color(String s) {
|
||||
return s == null || s.isEmpty() ? s : ChatColor.translateAlternateColorCodes('&', s);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkConfigVersion() {
|
||||
int latestVersion = ChatItem.CFG_VER;
|
||||
if (latestVersion != CONFIG_VERSION) {
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
pl.getLogger().warning(ChatColor.RED
|
||||
+ "ChatItem detected an older or invalid configuration file. Replacing it with the default config...");
|
||||
performOverwrite();
|
||||
conf = pl.getConfig();
|
||||
pl.getLogger().warning(ChatColor.RED + "Replacement complete!");
|
||||
}
|
||||
}
|
||||
public static String color(String s) {
|
||||
return s == null || s.isEmpty() ? s : ChatColor.translateAlternateColorCodes('&', s);
|
||||
}
|
||||
|
||||
private void performOverwrite() {
|
||||
ChatItem.getInstance().saveResource("config.yml", true);
|
||||
}
|
||||
private static void colorStringList(List<String> input) {
|
||||
for (int i = 0; i < input.size(); ++i) {
|
||||
input.set(i, color(input.get(i)));
|
||||
}
|
||||
}
|
||||
|
||||
private static void colorStringList(List<String> input) {
|
||||
for (int i = 0; i < input.size(); ++i) {
|
||||
input.set(i, color(input.get(i)));
|
||||
}
|
||||
}
|
||||
private void checkConfigVersion() {
|
||||
int latestVersion = ChatItem.CFG_VER;
|
||||
if (latestVersion != CONFIG_VERSION) {
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
pl.getLogger().warning(ChatColor.RED
|
||||
+ "ChatItem detected an older or invalid configuration file. Replacing it with the default config...");
|
||||
performOverwrite();
|
||||
conf = pl.getConfig();
|
||||
pl.getLogger().warning(ChatColor.RED + "Replacement complete!");
|
||||
}
|
||||
}
|
||||
|
||||
private void performOverwrite() {
|
||||
ChatItem.getInstance().saveResource("config.yml", true);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,34 +1,94 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.ConnectException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.URL;
|
||||
import java.net.UnknownHostException;
|
||||
import java.net.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import java.util.TreeMap;
|
||||
|
||||
public class Utils {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static List<Player> getOnlinePlayers() {
|
||||
Object players = Bukkit.getOnlinePlayers();
|
||||
if(players instanceof Player[])
|
||||
return Arrays.asList((Player[]) players);
|
||||
return new ArrayList<>((Collection<Player>) players);
|
||||
private final static TreeMap<Integer, String> ROMAN_KEYS = new TreeMap<>();
|
||||
private final static HashMap<String, String> ENCHANTS_NAMES = new HashMap<>();
|
||||
|
||||
static {
|
||||
ROMAN_KEYS.put(1000, "M");
|
||||
ROMAN_KEYS.put(900, "CM");
|
||||
ROMAN_KEYS.put(500, "D");
|
||||
ROMAN_KEYS.put(400, "CD");
|
||||
ROMAN_KEYS.put(100, "C");
|
||||
ROMAN_KEYS.put(90, "XC");
|
||||
ROMAN_KEYS.put(50, "L");
|
||||
ROMAN_KEYS.put(40, "XL");
|
||||
ROMAN_KEYS.put(10, "X");
|
||||
ROMAN_KEYS.put(9, "IX");
|
||||
ROMAN_KEYS.put(5, "V");
|
||||
ROMAN_KEYS.put(4, "IV");
|
||||
ROMAN_KEYS.put(1, "I");
|
||||
|
||||
ENCHANTS_NAMES.put("ARROW_DAMAGE", "Power");
|
||||
ENCHANTS_NAMES.put("ARROW_FIRE", "Flame");
|
||||
ENCHANTS_NAMES.put("ARROW_INFINITE", "Infinity");
|
||||
ENCHANTS_NAMES.put("ARROW_KNOCKBACK", "Punch");
|
||||
ENCHANTS_NAMES.put("BINDING_CURSE", "Curse of Binding");
|
||||
ENCHANTS_NAMES.put("DAMAGE_ALL", "Sharpness");
|
||||
ENCHANTS_NAMES.put("DAMAGE_ARTHROPODS", "Bane of Arthropods");
|
||||
ENCHANTS_NAMES.put("DAMAGE_UNDEAD", "Smite");
|
||||
ENCHANTS_NAMES.put("DEPTH_STRIDER", "Depth Strider");
|
||||
ENCHANTS_NAMES.put("DIG_SPEED", "Efficiency");
|
||||
ENCHANTS_NAMES.put("DURABILITY", "Unbreaking");
|
||||
ENCHANTS_NAMES.put("FIRE_ASPECT", "Fire Aspect");
|
||||
ENCHANTS_NAMES.put("FROST_WALKER", "Frost Walker");
|
||||
ENCHANTS_NAMES.put("KNOCKBACK", "Knockback");
|
||||
ENCHANTS_NAMES.put("LOOT_BONUS_BLOCKS", "Fortune");
|
||||
ENCHANTS_NAMES.put("LOOT_BONUS_MOBS", "Looting");
|
||||
ENCHANTS_NAMES.put("LUCK", "Luck of the Sea");
|
||||
ENCHANTS_NAMES.put("LURE", "Lure");
|
||||
ENCHANTS_NAMES.put("MENDING", "Mending");
|
||||
ENCHANTS_NAMES.put("OXYGEN", "Respiration");
|
||||
ENCHANTS_NAMES.put("PROTECTION_ENVIRONMENTAL ", "Protection");
|
||||
ENCHANTS_NAMES.put("PROTECTION_EXPLOSIONS", "Blast Protection");
|
||||
ENCHANTS_NAMES.put("PROTECTION_FALL", "Feather Falling");
|
||||
ENCHANTS_NAMES.put("PROTECTION_FIRE", "Fire Protection");
|
||||
ENCHANTS_NAMES.put("PROTECTION_PROJECTILE", "Projectile Protection");
|
||||
ENCHANTS_NAMES.put("SILK_TOUCH", "Silk Touch");
|
||||
ENCHANTS_NAMES.put("SWEEPING_EDGE", "Sweeping Edge");
|
||||
ENCHANTS_NAMES.put("THORNS", "Thorns");
|
||||
ENCHANTS_NAMES.put("VANISHING_CURSE", "Cure of Vanishing");
|
||||
ENCHANTS_NAMES.put("WATER_WORKER", "Aqua Affinity");
|
||||
}
|
||||
|
||||
|
||||
public static List<Player> getOnlinePlayers() {
|
||||
return new ArrayList<>(Bukkit.getOnlinePlayers());
|
||||
}
|
||||
|
||||
public static String toRoman(int number) {
|
||||
int l = ROMAN_KEYS.floorKey(number);
|
||||
if (number == l) {
|
||||
return ROMAN_KEYS.get(number);
|
||||
}
|
||||
return ROMAN_KEYS.get(l) + toRoman(number - l);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static String getEnchantName(Enchantment enchant) {
|
||||
String name = ENCHANTS_NAMES.get(enchant.getName());
|
||||
if (name == null) {
|
||||
|
||||
ChatItem.getInstance().getLogger()
|
||||
.warning("Unknown enchant " + enchant.getName() + ". Please report this to Elikill58.");
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
public static String getFromURL(String urlName) {
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
try {
|
||||
@@ -41,21 +101,77 @@ public class Utils {
|
||||
connection.setDoOutput(true);
|
||||
connection.setRequestMethod("GET");
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
String content = "";
|
||||
StringBuilder content = new StringBuilder();
|
||||
String input;
|
||||
while ((input = br.readLine()) != null)
|
||||
content = content + input;
|
||||
content.append(input);
|
||||
br.close();
|
||||
return content;
|
||||
} catch (SocketTimeoutException e) {
|
||||
pl.getLogger().info("Failed to access to " + urlName + " (Reason: timed out).");
|
||||
} catch (UnknownHostException | MalformedURLException e) {
|
||||
pl.getLogger().info("Could not use the internet connection to check for update or send stats");
|
||||
} catch (ConnectException e) {
|
||||
pl.getLogger().warning("Cannot connect to " + urlName + " (Reason: " + e.getMessage() + ").");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return content.toString();
|
||||
} catch (SocketTimeoutException e) {
|
||||
pl.getLogger().info("Failed to access to " + urlName + " (Reason: timed out).");
|
||||
} catch (UnknownHostException | MalformedURLException e) {
|
||||
pl.getLogger().info("Could not use the internet connection to check for update or send stats");
|
||||
} catch (ConnectException e) {
|
||||
pl.getLogger().warning("Cannot connect to " + urlName + " (Reason: " + e.getMessage() + ").");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int indexOf(CharSequence s, CharSequence searched, int i) {
|
||||
return s.toString().indexOf(searched.toString(), i);
|
||||
}
|
||||
|
||||
public static boolean isEmpty(CharSequence s) {
|
||||
return (s == null || s.length() == 0);
|
||||
}
|
||||
|
||||
public static int countMatches(CharSequence str, CharSequence searched) {
|
||||
if (isEmpty(str) || isEmpty(searched))
|
||||
return 0;
|
||||
byte b = 0;
|
||||
int i = 0;
|
||||
while ((i = indexOf(str, searched, i)) != -1) {
|
||||
b++;
|
||||
i += searched.length();
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
public static boolean isInteger(String s) {
|
||||
try {
|
||||
Integer.parseInt(s);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isByte(String s) {
|
||||
try {
|
||||
Byte.parseByte(s);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isShort(String s) {
|
||||
try {
|
||||
Short.parseShort(s);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isLong(String s) {
|
||||
try {
|
||||
Long.parseLong(s);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,8 @@ import java.net.InetSocketAddress;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
|
||||
public enum Version {
|
||||
|
||||
// http://wiki.vg/Protocol_version_numbers
|
||||
@@ -18,8 +20,8 @@ public enum Version {
|
||||
V1_15(100, 550, 578),
|
||||
V1_16(100, 700, 754),
|
||||
V1_17(100, 755, 756),
|
||||
V1_18(100, 757, 800),
|
||||
V1_19(100, 801, 1000),
|
||||
V1_18(100, 757, 758),
|
||||
V1_19(100, 759, 1000),
|
||||
HIGHER(Integer.MAX_VALUE, -1, Integer.MAX_VALUE);
|
||||
|
||||
// Latest version should always have the upper limit set to Integer.MAX_VALUE so
|
||||
@@ -67,6 +69,16 @@ public enum Version {
|
||||
return HIGHER;
|
||||
}
|
||||
|
||||
public static Version getVersion(int protocolVersion, Version def) {
|
||||
for (Version ver : Version.values()) {
|
||||
if (protocolVersion >= ver.MIN_VER && protocolVersion <= ver.MAX_VER) {
|
||||
return ver;
|
||||
}
|
||||
}
|
||||
ChatItem.debug("Failed to find version for protocol " + protocolVersion);
|
||||
return def;
|
||||
}
|
||||
|
||||
public static Version getVersion() {
|
||||
return SERVER_VERSION;
|
||||
}
|
||||
|
||||
@@ -50,6 +50,21 @@ general:
|
||||
tooltip:
|
||||
- "&7Nothing to see here"
|
||||
- "&7Just the empty hand of {display-name}."
|
||||
# Manage what is showed for bugged client.
|
||||
# Specially lunar client with old version (1.7)
|
||||
bugged_client:
|
||||
# You can try to show the most informations as possible:
|
||||
# item name & lore. You will not see specific item meta-data
|
||||
# Or just show the bugged tooltip.
|
||||
#
|
||||
# Action available:
|
||||
# nothing: no hover
|
||||
# item: only try to get values from item
|
||||
# tooltip: only show tooltip
|
||||
# show_both: show item & tooltip below
|
||||
action: "show_both"
|
||||
tooltip:
|
||||
- "&7Failed to parse item for your client"
|
||||
|
||||
# Here you can choose which commands will the plugin attempt to parse. Console commands will all be ignored,
|
||||
# however player commands will be taken into consideration. To add a command, simply add an element to the list
|
||||
|
||||
@@ -2,7 +2,7 @@ name: ChatItem
|
||||
main: me.dadus33.chatitem.ChatItem
|
||||
version: ${project.version}
|
||||
|
||||
softdepend: [ViaVersion, ProtocolSupport, ProtocolLib, LangUtils, HexNicks]
|
||||
softdepend: [ViaVersion, ProtocolSupport, ProtocolLib, LangUtils, HexNicks, EcoEnchants, DiscordSRV]
|
||||
authors: [dadus33, WOLFI3654, Elikill58]
|
||||
api-version: 1.13
|
||||
|
||||
|
||||
Reference in new issue
Block a user