Compare commits

...
23 Commits
Author SHA1 Message Date
Elikill58 6435ea0dad Upgrade to 2.6.2 2024-11-07 22:08:05 +01:00
Elikill58 4e7b14e618 Fix for spigot versions 2024-11-07 21:55:43 +01:00
Elikill58 c9ea8061c8 Fix auto selection 2024-11-07 20:16:18 +01:00
Elikill58 4b966f056e Begin of own formatter 2024-11-07 19:28:23 +01:00
Elikill58 3a2d0ee44d Add placeholders 2024-09-09 11:15:12 +02:00
Elikill58 5ee9cca3d7 Duplicated variable name... 2024-09-04 10:12:16 +02:00
Elikill58 e21f236a09 Prevent IncompatibleClassChangeError error 2024-09-04 10:09:12 +02:00
Elikill58 554dd8ad39 Change for actions 2024-09-03 19:48:05 +02:00
Elikill58 b7a60f1352 Use JDK 21 2024-08-27 23:36:15 +02:00
Elikill58 b8e5e213ae Upgrade github action for pull request 2024-08-27 23:23:07 +02:00
Elikill58 08101a8d18 Upgrade github actions 2024-08-27 23:22:32 +02:00
Elikill58 4ccb543869 Make pull 2024-08-27 22:43:21 +02:00
Elikill58 153667135b Prevent some error on 1.20.6 and 1.21 2024-08-27 22:43:14 +02:00
Elikill58 00ca8ac11b Prevent error 2024-08-23 14:03:47 +02:00
Elikill58 44867e86d8 Merge branch 'v2' of https://github.com/dadus33-plugins/ChatItem into v2 2024-08-20 21:14:51 +02:00
Elikill58 36148b5969 Prevent error with items 2024-08-20 21:14:42 +02:00
Elikill58 103ef2a4f2 Prevent error with unsignedContent 2024-08-20 18:07:01 +02:00
Elikill58 40f67cc41f Upgrade to snapshot 2024-08-20 18:06:32 +02:00
dependabot[bot] df555f7151 Bump com.discordsrv:discordsrv from 1.27.0 to 1.28.1 (#139)
Bumps com.discordsrv:discordsrv from 1.27.0 to 1.28.1.

---
updated-dependencies:
- dependency-name: com.discordsrv:discordsrv
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-12 10:27:03 +02:00
dependabot[bot] c76c35974c Bump com.viaversion:viaversion-api from 5.0.2 to 5.0.3 (#140)
Bumps com.viaversion:viaversion-api from 5.0.2 to 5.0.3.

---
updated-dependencies:
- dependency-name: com.viaversion:viaversion-api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-12 10:23:27 +02:00
Elikill58 81f9711019 Fix typo on config 2024-08-04 21:19:48 +02:00
dependabot[bot] 4edccde81c Bump com.github.MilkBowl:VaultAPI from 1.7 to 1.7.1 (#137)
Bumps [com.github.MilkBowl:VaultAPI](https://github.com/MilkBowl/VaultAPI) from 1.7 to 1.7.1.
- [Release notes](https://github.com/MilkBowl/VaultAPI/releases)
- [Commits](https://github.com/MilkBowl/VaultAPI/compare/1.7...1.7.1)

---
updated-dependencies:
- dependency-name: com.github.MilkBowl:VaultAPI
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-04 21:15:17 +02:00
dependabot[bot] eac6d1c68a Bump com.viaversion:viaversion-api from 4.10.2 to 5.0.2 (#138)
Bumps com.viaversion:viaversion-api from 4.10.2 to 5.0.2.

---
updated-dependencies:
- dependency-name: com.viaversion:viaversion-api
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-04 21:15:09 +02:00
24 changed files with 336 additions and 189 deletions

No files matched your search

+6 -6
View File
@@ -10,14 +10,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
name: Checkout repo
- name: Set up JDK 17 (LTS)
uses: actions/setup-java@v3
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'
java-version: '21'
distribution: 'temurin'
cache: maven
- name: Build with Maven
@@ -27,4 +27,4 @@ jobs:
name: Upload Artifact
with:
name: ChatItem.jar
path: target/ChatItem-*.jar
path: target/ChatItem-*.jar
+6 -6
View File
@@ -10,20 +10,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
name: Checkout repo
- name: Set up JDK 17 (LTS)
uses: actions/setup-java@v3
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'
java-version: '21'
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn install --file pom.xml
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
name: Upload Artifact
with:
name: ChatItem.jar
+8 -14
View File
@@ -6,7 +6,7 @@
<groupId>me.dadus33</groupId>
<artifactId>ChatItem</artifactId>
<version>2.6.1</version>
<version>2.6.2</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -72,7 +72,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.20.4-R0.1-SNAPSHOT</version>
<version>1.21-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -103,7 +103,7 @@
<dependency>
<groupId>com.viaversion</groupId>
<artifactId>viaversion-api</artifactId>
<version>4.10.2</version>
<version>5.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -127,31 +127,25 @@
<dependency>
<groupId>dev.majek</groupId>
<artifactId>HexNicks</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.MajekDev</groupId>
<artifactId>HexNicks</artifactId>
<version>3.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.14.0</version>
<version>4.17.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId>
<version>4.3.0</version>
<version>4.3.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.discordsrv</groupId>
<artifactId>discordsrv</artifactId>
<version>1.27.0</version>
<version>1.28.1</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -193,13 +187,13 @@
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<version>1.7.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.essentialsx</groupId>
<artifactId>EssentialsX</artifactId>
<version>2.20.1-SNAPSHOT</version>
<version>2.21.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
+5
View File
@@ -1,5 +1,6 @@
package me.dadus33.chatitem;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
@@ -8,4 +9,8 @@ public class C {
public static TextComponent text(String s) {
return LegacyComponentSerializer.legacySection().deserialize(s);
}
public static String string(Component c) {
return LegacyComponentSerializer.legacySection().serialize(c);
}
}
@@ -23,6 +23,7 @@ import me.dadus33.chatitem.chatmanager.ChatManager;
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
import me.dadus33.chatitem.chatmanager.v2.ChatListenerChatManager;
import me.dadus33.chatitem.chatmanager.v3.PaperChatManager;
import me.dadus33.chatitem.chatmanager.v4.OwnManager;
import me.dadus33.chatitem.commands.CIReloadCommand;
import me.dadus33.chatitem.commands.ChatItemCommand;
import me.dadus33.chatitem.hook.ChatControlSupport;
@@ -104,8 +105,10 @@ public class ChatItem extends JavaPlugin {
this.chatManager.add(new PacketEditingChatManager(this));
this.chatManager.add(new ChatListenerChatManager(this));
if(Utils.IS_PAPER)
if(Utils.IS_PAPER) {
this.chatManager.add(new PaperChatManager(this));
this.chatManager.add(new OwnManager());
}
String managerName = getStorage().manager;
@@ -1,5 +1,6 @@
package me.dadus33.chatitem.chatmanager;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@@ -15,7 +16,7 @@ public class ChatAction {
public ChatAction(ItemSlot slot, Player origin, ItemStack item) {
this.slot = slot;
this.item = item;
this.item = item == null ? new ItemStack(Material.AIR) : item;
this.origin = origin;
this.isItem = true;
}
@@ -48,6 +49,6 @@ public class ChatAction {
}
public ItemStack getItem() {
return item;
return item == null ? new ItemStack(Material.AIR) : item;
}
}
@@ -23,10 +23,6 @@ public class ChatEventListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onChat(AsyncPlayerChatEvent e) {
if (ChatManager.isTestingEnabled() && !ChatManager.isTesting("packet"))
return;
if(!ChatItem.getInstance().isManagerEnabled("packet"))
return;
if (ChatManager.containsSeparator(e.getMessage())) { // If the BELL character is found, we have to remove it
e.setMessage(ChatManager.removeSeparator(e.getMessage()));
}
@@ -38,7 +34,7 @@ public class ChatEventListener implements Listener {
return;
}
ChatAction action = ChatManager.getChatAction(slot, p);
if(!ChatManager.canUsePlaceholder(p, action.getItem(), slot, e))
if(!ChatManager.canUsePlaceholder(p, action, slot, e))
return;
String s = slot.replacePlaceholdersToSeparator(e.getMessage());
if (Utils.countMatches(s, Character.toString(ChatManager.SEPARATOR)) > getStorage().limit) {
@@ -209,10 +209,9 @@ public abstract class ChatManager {
if (ItemUtils.isEmpty(item)) {
if (c.handDisabled)
return ItemSlot.HAND.getPlaceholders().get(0);
else
return getHandName(p);
return getHandName(p);
}
return styleItem(viewer, item, c);
return ChatItem.replace(p, styleItem(viewer, item, c));
}
public static String getNameForChatAction(Player viewer, Chat chat, Storage c) {
@@ -221,13 +220,12 @@ public abstract class ChatManager {
ItemStack item = action.getItem();
if (ItemUtils.isEmpty(item)) {
if (c.handDisabled)
return ItemSlot.HAND.getPlaceholders().get(0);
else
return getHandName(chat);
return chat.getSlot().getPlaceholders().get(0);
return getHandName(chat);
}
return styleItem(viewer, item, c);
return ChatItem.replace(chat.getPlayer(), styleItem(viewer, item, c));
}
return Messages.getMessage(action.getSlot().name().toLowerCase() + ".chat", "%cible%", action.getOrigin().getName());
return ChatItem.replace(chat.getPlayer(), Messages.getMessage(action.getSlot().name().toLowerCase() + ".chat", "%cible%", action.getOrigin().getName()));
}
public static String getNameForChatAction(Player viewer, ChatAction action, Storage c) {
@@ -235,23 +233,23 @@ public abstract class ChatManager {
ItemStack item = action.getItem();
if (ItemUtils.isEmpty(item)) {
if (c.handDisabled)
return ItemSlot.HAND.getPlaceholders().get(0);
return action.getSlot().getPlaceholders().get(0);
else
return getHandName(action.getOrigin());
}
return styleItem(viewer, item, c);
return ChatItem.replace(action.getOrigin(), styleItem(viewer, item, c));
}
return Messages.getMessage(action.getSlot().name().toLowerCase() + ".chat", "%cible%", action.getOrigin().getName());
return ChatItem.replace(action.getOrigin(), Messages.getMessage(action.getSlot().name().toLowerCase() + ".chat", "%cible%", action.getOrigin().getName()));
}
@Deprecated
public static String getHandName(Player p) {
return ChatItem.getInstance().getStorage().handName.replace("{name}", p.getName()).replace("{display-name}", p.getDisplayName());
return ChatItem.replace(p, ChatItem.getInstance().getStorage().handName.replace("{name}", p.getName()).replace("{display-name}", p.getDisplayName()));
}
public static String getHandName(Chat c) {
Player p = c.getPlayer();
return ChatItem.getInstance().getStorage().handName.replace("{name}", p.getName()).replace("{display-name}", p.getDisplayName());
return ChatItem.replace(p, ChatItem.getInstance().getStorage().handName.replace("{name}", p.getName()).replace("{display-name}", p.getDisplayName()));
}
public static String calculateTime(long seconds) {
@@ -283,7 +281,7 @@ public abstract class ChatManager {
return builder.toString();
}
public static boolean canUsePlaceholder(Player p, ItemStack item, ItemSlot slot, @Nullable Cancellable e) {
public static boolean canUsePlaceholder(Player p, ChatAction action, ItemSlot slot, @Nullable Cancellable e) {
Storage c = ChatItem.getInstance().getStorage();
if (c.permissionEnabled && !p.hasPermission(c.permissionName)) {
if (!c.letMessageThrough) {
@@ -295,7 +293,7 @@ public abstract class ChatManager {
}
return false;
}
if (item != null && item.getType().equals(Material.AIR) && slot.isBasic()) {
if (action.isItem() && action.getItem().getType().equals(Material.AIR) && slot.isBasic()) {
if (slot.isDenyIfNoItem()) {
if (e != null)
e.setCancelled(true);
@@ -328,9 +326,9 @@ public abstract class ChatManager {
}
}
}
if (item != null) {
if (action.isItem()) {
for (String ignored : c.ignoredItems) {
if (item.getType().name().toLowerCase().contains(ignored.toLowerCase())) {
if (action.getItem().getType().name().toLowerCase().contains(ignored.toLowerCase())) {
return false;
}
}
@@ -376,7 +374,7 @@ public abstract class ChatManager {
if(isTestingEnabled())
return true;
String selected = ChatItem.getInstance().getStorage().manager;
if (selected == "both" || selected == "all")
if (selected.equalsIgnoreCase("both") || selected.equalsIgnoreCase("all"))
return true;
if (selected == "auto") {
if (Utils.IS_PAPER && actual == "paper")
@@ -48,7 +48,7 @@ public class AdventureComponentManager implements IComponentManager {
}
public void writeComponentToPacket(ChatItemPacket packet, Component next) {
if(packet.getContent().getSpecificModifier(Component.class).readSafely(0) == null) { // hard way
if(packet.getContent().getSpecificModifier(Component.class).readSafely(0) == null && ReflectionUtils.hasObject(packet.getPacket(), "unsignedContent")) { // hard way
ReflectionUtils.setField(ReflectionUtils.getObject(packet.getPacket(), "unsignedContent"), "adventure", next);
} else { // easy way
packet.getContent().getSpecificModifier(Component.class).write(0, next);
@@ -57,7 +57,7 @@ public class AdventureComponentManager implements IComponentManager {
public Component getComponentFromPacket(ChatItemPacket packet) {
Component comp = packet.getContent().getSpecificModifier(Component.class).readSafely(0);
if (comp == null && packet.getPacketName().equalsIgnoreCase("ClientboundPlayerChatPacket")) { // if can get one more
if (comp == null && packet.getPacketName().equalsIgnoreCase("ClientboundPlayerChatPacket") && ReflectionUtils.hasObject(packet.getPacket(), "unsignedContent")) { // if can get one more
comp = (Component) ReflectionUtils.getObject(ReflectionUtils.getObject(packet.getPacket(), "unsignedContent"), "adventure");
}
return comp;
@@ -84,6 +84,7 @@ public class AdventureComponentManager implements IComponentManager {
}
}
@SuppressWarnings("deprecation")
@Override
public Object manageContent(Player viewer, Chat chat, ChatItemPacket packet, String json, Storage c) throws Exception {
ChatAction action = chat.getAction();
@@ -4,11 +4,7 @@ import static me.dadus33.chatitem.utils.PacketUtils.getNmsClass;
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.Map;
import java.util.Set;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@@ -35,12 +31,10 @@ public class JSONManipulator {
return instance;
}
private static final List<String> SKIPPED = Arrays.asList("HSTRY_ENCHANTS");
public static final Class<?> CRAFT_ITEM_STACK_CLASS = PacketUtils.getObcClass("inventory.CraftItemStack");
public static final Class<?> NMS_ITEM_STACK_CLASS = getNmsClass("ItemStack", "world.item.");
public static final Method AS_NMS_COPY = ReflectionUtils.getMethod(CRAFT_ITEM_STACK_CLASS, "asNMSCopy", ItemStack.class);
public static final Class<?> NBT_TAG_COMPOUND = getNmsClass("NBTTagCompound", "nbt.");
public static final Class<?> NBT_TAG_COMPOUND = getNmsClass("NBTTagCompound", "nbt.", "CompoundTag");
public static final Method SAVE_NMS_ITEM_STACK_METHOD = ReflectionUtils.getMethod(NMS_ITEM_STACK_CLASS, NBT_TAG_COMPOUND, NBT_TAG_COMPOUND);
public static final Field MAP = ReflectionUtils.getField(NBT_TAG_COMPOUND, "map", "x");
@@ -74,7 +68,7 @@ public class JSONManipulator {
// Get the JSON representation of the item (well, not really JSON, but rather a
// string representation of NBT data)
hover.addProperty("value", stringifyItem(action.getItem()));
hover.addProperty("value", ChatItem.getPlatform().stringifyItem(action.getItem()));
} else {
hover.addProperty("action", "show_text");
@@ -114,7 +108,6 @@ public class JSONManipulator {
if (!obj.has("text")) {
obj.addProperty("text", "");
}
ChatItem.debug("Parsed array for item: " + obj.toString() + ", wrapper: " + wrapper);
return obj.toString();
}
@@ -262,70 +255,4 @@ public class JSONManipulator {
}
}
}
public static String stringifyItem(ItemStack is) {
try {
return stringifyItemInternal(is);
} catch (Exception e) {
e.printStackTrace();
return "{}";
}
}
@SuppressWarnings({ "deprecation" })
public static String stringifyItemInternal(ItemStack is) throws Exception {
Object nmsStack = JSONManipulator.AS_NMS_COPY.invoke(null, is);
Object nmsTag = JSONManipulator.NBT_TAG_COMPOUND.newInstance();
JSONManipulator.SAVE_NMS_ITEM_STACK_METHOD.invoke(nmsStack, nmsTag);
HashMap<String, String> tagMap = new HashMap<>();
Map<String, Object> nmsMap = (Map<String, Object>) JSONManipulator.MAP.get(nmsTag);
String id = nmsMap.get("id").toString().replace("\"", "");
Object realTag = nmsMap.get("tag");
if (JSONManipulator.NBT_TAG_COMPOUND.isInstance(realTag)) { // We need to make sure this is indeed an
// NBTTagCompound
Map<String, Object> realMap = (Map<String, Object>) JSONManipulator.MAP.get(realTag);
Set<Map.Entry<String, Object>> entrySet = realMap.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
tagMap.put(entry.getKey(), entry.getValue().toString());
}
}
// TODO check for ID remapping
// ItemRewriter.remapIds(Version.getVersion().MAX_VER, protocolVersion.MAX_VER,
// is);
StringBuilder sb = new StringBuilder("{id:");
sb.append("\"").append(id).append("\"").append(","); // Append the id
sb.append("Count:").append(is.getAmount()).append("b"); // Append the amount
if (!tagMap.containsKey("Damage")) { // for new versions
sb.append(",Damage:").append(is.getDurability()).append("s"); // Append the durability data
}
if (tagMap.isEmpty()) {
sb.append("}");
return sb.toString();
}
Set<Map.Entry<String, String>> entrySet = tagMap.entrySet();
boolean first = true;
sb.append(",tag:{"); // Start of the tag
for (Map.Entry<String, String> entry : entrySet) {
if (SKIPPED.contains(entry.getKey()))
continue;
if (!first)
sb.append(",");
first = false;
if (!entry.getKey().isEmpty()) {
if (entry.getKey().contains(";"))
sb.append("\"" + entry.getKey() + "\"");
else
sb.append(entry.getKey());
sb.append(":");
}
sb.append(cleanStr(entry.getValue()));
}
sb.append("}}"); // End of tag and end of item
return sb.toString();
}
private static String cleanStr(String s) {
return s.startsWith("'") && s.endsWith("'") ? s.substring(1, s.length() - 1) : s;
}
}
@@ -71,7 +71,7 @@ public class ChatListener implements Listener {
return;
}
ChatAction action = ChatManager.getChatAction(slot, p);
if(!ChatManager.canUsePlaceholder(p, action.getItem(), slot, e))
if(!ChatManager.canUsePlaceholder(p, action, slot, e))
return;
e.setCancelled(true);
String format = e.getFormat().replace(targetReplace, slot.getPlaceholders().get(0));
@@ -23,7 +23,6 @@ import net.kyori.adventure.text.TextReplacementConfig;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.event.HoverEventSource;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
public class PaperListener implements Listener {
@@ -46,13 +45,13 @@ public class PaperListener implements Listener {
Player p = e.getPlayer();
Component message = e.message();
String rawMessage = PlainTextComponentSerializer.plainText().serialize(message);
String rawMessage = C.string(message);
if (ChatManager.containsSeparator(rawMessage)) { // fix for v1
Chat chat = Chat.getFrom(rawMessage);
if (chat != null) {
message = message.replaceText(TextReplacementConfig.builder().matchLiteral(ChatManager.SEPARATOR + "" + chat.getId() + ChatManager.SEPARATOR_END)
.replacement(Component.text(chat.getSlot().getPlaceholders().get(0))).build());
rawMessage = PlainTextComponentSerializer.plainText().serialize(message);
.replacement(C.text(chat.getSlot().getPlaceholders().get(0))).build());
rawMessage = C.string(message);
}
}
ItemSlot slot = ItemSlot.getItemSlotFromMessage(rawMessage);
@@ -60,7 +59,7 @@ public class PaperListener implements Listener {
if (slot == null) // if not found
return;
ChatAction action = ChatManager.getChatAction(slot, p);
if (!ChatManager.canUsePlaceholder(p, action.getItem(), slot, e))
if (!ChatManager.canUsePlaceholder(p, action, slot, e))
return;
HoverEventSource<?> hoverEvent = null;
if(action.isItem()) {
@@ -79,7 +78,7 @@ public class PaperListener implements Listener {
}
} else
hoverEvent = HoverEvent.showText(C.text(Messages.getMessage(action.getSlot().name().toLowerCase() + ".hover", "%cible%", p.getName())));
TextComponent like = Component.text(ChatManager.getNameForChatAction(p, action, getStorage())).hoverEvent(hoverEvent);
TextComponent like = C.text(ChatManager.getNameForChatAction(p, action, getStorage())).hoverEvent(hoverEvent);
if (action.hasCommand())
like.clickEvent(ClickEvent.runCommand(action.getCommand()));
for (String s : slot.getPlaceholders())
@@ -90,7 +89,7 @@ public class PaperListener implements Listener {
e.setCancelled(true);
} else
e.message(message);
ChatItem.debug("Changed message to " + PlainTextComponentSerializer.plainText().serialize(message));
ChatItem.debug("Changed message to " + C.string(message));
if (getStorage().cooldown > 0 && !p.hasPermission("chatitem.ignore-cooldown"))
ChatManager.applyCooldown(p);
}
@@ -0,0 +1,26 @@
package me.dadus33.chatitem.chatmanager.v4;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import io.papermc.paper.event.player.AsyncChatEvent;
import me.dadus33.chatitem.chatmanager.ChatManager;
public class OwnListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onChat(AsyncChatEvent e) {
if (ChatManager.isTestingEnabled() && !ChatManager.isTesting("ownformatter"))
return;
if (!ChatManager.isSelected("ownformatter"))
return;
if (e.isCancelled())
return;
e.setCancelled(true);
/*Player p = e.getPlayer();
Component msg = e.message();*/
}
}
@@ -0,0 +1,22 @@
package me.dadus33.chatitem.chatmanager.v4;
import me.dadus33.chatitem.ChatItem;
import me.dadus33.chatitem.chatmanager.ChatManager;
public class OwnManager extends ChatManager {
@Override
public String getName() {
return "Own Formatter";
}
@Override
public String getId() {
return "ownformatter";
}
@Override
public void unload(ChatItem pl) {
}
}
@@ -26,17 +26,22 @@ public class InventoryListener implements Listener {
@EventHandler
public void onClick(InventoryClickEvent e) {
if (!(e.getWhoClicked() instanceof Player))
return;
Player p = (Player) e.getWhoClicked();
InventoryHolder openInventoryHolder = p.getOpenInventory().getTopInventory().getHolder();
InventoryHolder openInventoryHolder = null;
try {
openInventoryHolder = p.getOpenInventory().getTopInventory().getHolder();
} catch(java.lang.IncompatibleClassChangeError exc) {} // ignore this
if (openInventoryHolder instanceof CustomInventoryHolder) {
if (openInventoryHolder != null && openInventoryHolder instanceof CustomInventoryHolder) {
e.setCancelled(true);
return;
}
if (e.getClickedInventory() == null || !(e.getWhoClicked() instanceof Player))
if (e.getClickedInventory() == null)
return;
InventoryHolder holder = e.getClickedInventory().getHolder();
if (holder == null || !(holder instanceof ChatItemHolder)) {
if (e.getClick().equals(ClickType.DOUBLE_CLICK) && p.getOpenInventory() != null && p.getOpenInventory().getTopInventory() != null) {
@@ -113,8 +118,8 @@ public class InventoryListener implements Listener {
inv.setItem(i, ChatItem.getPlatform().createItemStack(ItemUtils.WHITE_STAINED_GLASS, "-"));
int slot = 0;
for (String manager : Arrays.asList("all", "packet", "chat", "paper")) {
if (manager == "paper" && !Utils.IS_PAPER)
for (String manager : Arrays.asList("all", "packet", "chat", "paper")) { //, "ownformatter")) {
if ((manager == "paper" || manager == "ownformatter") && !Utils.IS_PAPER)
continue;
holder.keyBySlot.put(slot, manager);
inv.setItem(slot++, getManagerItem(manager));
@@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -79,7 +78,7 @@ public class TranslationInventoryListener implements Listener {
holder.langBySlot.put(slot, lang);
ItemStack item = ChatItem.getPlatform().createItemStack(Material.PAPER, Colors.GOLD + Translation.getAllLangs().get(lang), Colors.GRAY + "Clic to select this language");
if(lang.equalsIgnoreCase(ChatItem.getInstance().getStorage().language)) {
item.addUnsafeEnchantment(Enchantment.DURABILITY, 1);
item.addUnsafeEnchantment(ItemUtils.getEnchant("DURABILITY", "UNBREAKING"), 1);
ItemMeta meta = item.getItemMeta();
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
item.setItemMeta(meta);
@@ -47,4 +47,6 @@ public interface IPlatform {
Object jsonToBaseComponent(String json);
void sendMessage(Player to, Player origin, ChatAction action, String msg);
String stringifyItem(ItemStack item);
}
@@ -3,7 +3,6 @@ package me.dadus33.chatitem.platform.hook;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@@ -27,6 +26,7 @@ import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TextReplacementConfig;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.event.HoverEvent.ShowItem;
import net.kyori.adventure.text.event.HoverEventSource;
import net.kyori.adventure.text.format.NamedTextColor;
@@ -60,12 +60,14 @@ public class PaperPlatform implements IPlatform {
item.setItemMeta(meta);
return item;
}
@SuppressWarnings("deprecation")
@Override
public String getItemDisplayName(ItemStack item) {
// actually the get Displayname for better ... See: https://github.com/KyoriPowered/adventure-platform/issues/185
// return LegacyComponentSerializer.legacySection().serialize(item.displayName());
// actually the get Displayname for better ... See:
// https://github.com/KyoriPowered/adventure-platform/issues/185
// return
// LegacyComponentSerializer.legacySection().serialize(item.displayName());
return item.hasItemMeta() && item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName() : null;
}
@@ -90,6 +92,11 @@ public class PaperPlatform implements IPlatform {
return SpigotPlatform.getBaseComponentToJsonMethod() != null;
}
private Object getRegistry() throws Exception {
Class<?> serverClass = Class.forName("net.minecraft.server.MinecraftServer");
return serverClass.getDeclaredMethod("registryAccess").invoke(serverClass.getDeclaredMethod("getServer").invoke(null));
}
@Override
public String baseComponentToJson(Object obj) {
Method m = SpigotPlatform.getBaseComponentToJsonMethod();
@@ -98,10 +105,10 @@ public class PaperPlatform implements IPlatform {
try {
Object[] args = new Object[m.getParameterCount()];
args[0] = obj;
if(args.length > 1 && ReflectionUtils.isClassExist("net.minecraft.core.HolderLookup$Provider")) {
if (args.length > 1 && ReflectionUtils.isClassExist("net.minecraft.core.HolderLookup$Provider")) {
Class<?> c = Class.forName("net.minecraft.core.HolderLookup$Provider");
if(m.getParameterTypes()[1].isAssignableFrom(c)) {
args[1] = c.getDeclaredMethod("create", Stream.class).invoke(null, Stream.of());
if (m.getParameterTypes()[1].isAssignableFrom(c)) {
args[1] = getRegistry();
}
}
return (String) m.invoke(null, args);
@@ -110,17 +117,17 @@ public class PaperPlatform implements IPlatform {
}
return null;
}
@Override
public Object jsonToBaseComponent(String json) {
Method m = SpigotPlatform.getJsonToBaseComponentMethod();
try {
Object[] args = new Object[m.getParameterCount()];
args[0] = json;
if(args.length > 1 && ReflectionUtils.isClassExist("net.minecraft.core.HolderLookup$Provider")) {
if (args.length > 1 && ReflectionUtils.isClassExist("net.minecraft.core.HolderLookup$Provider")) {
Class<?> c = Class.forName("net.minecraft.core.HolderLookup$Provider");
if(m.getParameterTypes()[1].isAssignableFrom(c)) {
args[1] = c.getDeclaredMethod("create", Stream.class).invoke(null, Stream.of());
if (m.getParameterTypes()[1].isAssignableFrom(c)) {
args[1] = getRegistry();
}
}
return m.invoke(null, args);
@@ -133,13 +140,13 @@ public class PaperPlatform implements IPlatform {
@Override
public void sendMessage(Player to, Player origin, ChatAction action, String msg) {
HoverEventSource<?> hoverEvent = null;
if(action.isItem()) {
if(!action.getItem().getType().equals(Material.AIR))
if (action.isItem()) {
if (!action.getItem().getType().equals(Material.AIR))
hoverEvent = action.getItem().asHoverEvent();
else {
Component t = null;
for(String line : Messages.getMessageList("general.hand.tooltip", "%cible%", origin.getName())) {
if(t == null) {
for (String line : Messages.getMessageList("general.hand.tooltip", "%cible%", origin.getName())) {
if (t == null) {
t = Component.text("");
} else
t.append(Component.newline());
@@ -155,4 +162,19 @@ public class PaperPlatform implements IPlatform {
to.sendMessage(C.text(msg).replaceText(TextReplacementConfig.builder().matchLiteral(ChatManager.SEPARATOR + "").replacement(like).build()));
}
@SuppressWarnings("deprecation")
@Override
public String stringifyItem(ItemStack item) {
ShowItem si = item.asHoverEvent().value();
String json = "{id:\"" + si.item().asString() + "\",count:" + item.getAmount();
if(si.nbt() != null) {
json += ",tag:{" + si.nbt().string() + "}";
} else if(Version.getVersion().isNewerOrEquals(Version.V1_20_6)) { // since MC 1.20.5 in fact
json += ",components:" + (item.hasItemMeta() ? item.getItemMeta().getAsString() : "{}");
}
json += "}";
ChatItem.debug("Item stringified: " + json);
return json;
}
}
@@ -3,7 +3,10 @@ package me.dadus33.chatitem.platform.hook;
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.Map;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@@ -19,6 +22,7 @@ import me.dadus33.chatitem.ItemPlayer;
import me.dadus33.chatitem.Storage;
import me.dadus33.chatitem.chatmanager.ChatAction;
import me.dadus33.chatitem.chatmanager.ChatManager;
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
import me.dadus33.chatitem.platform.IPlatform;
import me.dadus33.chatitem.playernamer.PlayerNamerManager;
import me.dadus33.chatitem.utils.ColorManager;
@@ -81,7 +85,7 @@ public class SpigotPlatform implements IPlatform {
item.setItemMeta(meta);
return item;
}
@Override
public String getItemDisplayName(ItemStack item) {
return item.hasItemMeta() && item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName() : null;
@@ -96,51 +100,68 @@ public class SpigotPlatform implements IPlatform {
public Version getMinecraftVersion() {
return Version.getVersionByName(getNMSVersion().replace("_R4", "_6"));
}
@Override
public String getNMSVersion() {
return Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
}
@Override
public boolean hasBaseComponentSerializer() {
return getBaseComponentToJsonMethod() != null;
}
@Override
public String baseComponentToJson(Object obj) {
Method m = getBaseComponentToJsonMethod();
try {
Object[] args = new Object[m.getParameterCount()];
args[0] = obj;
if (args.length > 1 && ReflectionUtils.isClassExist("net.minecraft.core.HolderLookup$a")) {
Class<?> c = Class.forName("net.minecraft.core.HolderLookup$a");
if (m.getParameterTypes()[1].isAssignableFrom(c)) {
args[1] = getRegistry();
}
}
return (String) m.invoke(null, args);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public Object jsonToBaseComponent(String json) {
Method m = getJsonToBaseComponentMethod();
try {
Object[] args = new Object[m.getParameterCount()];
args[0] = json;
if (args.length > 1 && ReflectionUtils.isClassExist("net.minecraft.core.HolderLookup$a")) {
Class<?> c = Class.forName("net.minecraft.core.HolderLookup$a");
if (m.getParameterTypes()[1].isAssignableFrom(c)) {
args[1] = getRegistry();
}
}
return m.invoke(null, args);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Object getRegistry() throws Exception {
Class<?> serverClass = Class.forName("net.minecraft.server.MinecraftServer");
return serverClass.getDeclaredMethod("ba").invoke(serverClass.getDeclaredMethod("getServer").invoke(null));
}
public static Method getBaseComponentToJsonMethod() {
Class<?> chatSerializerClass = PacketUtils.getNmsClass("IChatBaseComponent$ChatSerializer", "network.chat.", "ChatSerializer", "Component$Serializer");
Class<?> chatBaseComponentClass = PacketUtils.getNmsClass("IChatBaseComponent", "network.chat.", "Component");
if(chatSerializerClass == null || chatBaseComponentClass == null)
if (chatSerializerClass == null || chatBaseComponentClass == null)
return null;
try {
for (Method m : chatSerializerClass.getDeclaredMethods()) {
if(m.getParameterTypes()[0].equals(chatBaseComponentClass) && m.getReturnType().equals(String.class)) {
if (m.getParameterTypes()[0].equals(chatBaseComponentClass) && m.getReturnType().equals(String.class)) {
return m;
}
}
@@ -149,18 +170,19 @@ public class SpigotPlatform implements IPlatform {
}
return null;
}
public static Method getJsonToBaseComponentMethod() {
Class<?> chatSerializerClass = PacketUtils.getNmsClass("IChatBaseComponent$ChatSerializer", "network.chat.", "ChatSerializer", "Component$Serializer");
Class<?> chatBaseComponentClass = PacketUtils.getNmsClass("IChatBaseComponent", "network.chat.", "Component");
Class<?> chatMutableComponentClass = PacketUtils.getNmsClass("IChatMutableComponent", "network.chat.");
if(chatSerializerClass == null || chatBaseComponentClass == null)
if (chatSerializerClass == null || chatBaseComponentClass == null)
return null;
try {
for (Method m : chatSerializerClass.getDeclaredMethods()) {
if(m.getParameterCount() == 0)
if (m.getParameterCount() == 0)
continue;
if(m.getParameterTypes()[0].equals(String.class) && (m.getReturnType().isAssignableFrom(chatBaseComponentClass) || (chatMutableComponentClass != null && m.getReturnType().equals(chatMutableComponentClass)))) {
if (m.getParameterTypes()[0].equals(String.class)
&& (m.getReturnType().isAssignableFrom(chatBaseComponentClass) || (chatMutableComponentClass != null && m.getReturnType().equals(chatMutableComponentClass)))) {
m.setAccessible(true);
return m;
}
@@ -180,8 +202,7 @@ public class SpigotPlatform implements IPlatform {
for (char args : msg.toCharArray()) {
if (args == '§') { // begin of color
if (colorCode.isEmpty() && !text.isEmpty()) { // text before this char
if(text.length() > 2 && text.startsWith("§") && text.substring(2) == ChatColor.stripColor(text)
&& color != null && color != ChatColor.WHITE) {
if (text.length() > 2 && text.startsWith("§") && text.substring(2) == ChatColor.stripColor(text) && color != null && color != ChatColor.WHITE) {
text = text.substring(2); // remove some code which should not be here
}
appendToComponentBuilder(builder, createComponent(to, text, color, action));
@@ -194,8 +215,8 @@ public class SpigotPlatform implements IPlatform {
if (args == 'r' && colorCode.isEmpty()) {
color = ChatColor.RESET;
continue;
} else if(args == 'x') {
if(!colorCode.isEmpty()) {
} else if (args == 'x') {
if (!colorCode.isEmpty()) {
color = ColorManager.getColor(colorCode);
colorCode = ""; // clean for previous things
}
@@ -220,16 +241,16 @@ public class SpigotPlatform implements IPlatform {
if (args == ChatManager.SEPARATOR) {
// here put the item
appendToComponentBuilder(builder, fixColorComponent(to, text, color, action));
if(action.isItem())
if (action.isItem())
addItem(builder, to, origin, action.getItem(), action);
else
addCommand(builder, to, origin, action.getCommand(), action);
text = "";
if(ChatManager.containsSeparatorEnd(msg))
if (ChatManager.containsSeparatorEnd(msg))
removing = true;
} else if(args == ChatManager.SEPARATOR_END) {
} else if (args == ChatManager.SEPARATOR_END) {
removing = false;
} else if(!removing) { // not removing content
} else if (!removing) { // not removing content
// basic text, not waiting for code after '§'
text += args;
}
@@ -349,21 +370,81 @@ public class SpigotPlatform implements IPlatform {
}
return builder.create();
}
private static BaseComponent[] createComponent(Player to, String text, ChatColor color, ChatAction action) {
ComponentBuilder littleBuilder = new ComponentBuilder(ChatItem.replace(action.getOrigin(), text));
if(color != null && !Colors.isFormatting(color)) // don't add reset thing
if (color != null && !Colors.isFormatting(color)) // don't add reset thing
littleBuilder.color(color);
if (action.isItem()) {
if(action.getItem().getType().equals(Material.AIR))
if (action.getItem().getType().equals(Material.AIR))
littleBuilder.event(Utils.createTextHover(String.join("\n", ChatItem.getInstance().getStorage().tooltipHand)));
else
littleBuilder.event(Utils.createItemHover(action.getItem(), to));
} else {
littleBuilder.event(Utils.createTextHover(Messages.getMessage(action.getSlot().name().toLowerCase() + ".hover")));
if(action.hasCommand())
if (action.hasCommand())
littleBuilder.event(Utils.createRunCommand(action.getCommand()));
}
return littleBuilder.create();
}
private static final List<String> SKIPPED = Arrays.asList("HSTRY_ENCHANTS");
@Override
public String stringifyItem(ItemStack item) {
try {
ChatItem.debug("[JSONManipulator] stringifying item");
Object nmsStack = JSONManipulator.AS_NMS_COPY.invoke(null, item);
Object nmsTag = JSONManipulator.NBT_TAG_COMPOUND.newInstance();
JSONManipulator.SAVE_NMS_ITEM_STACK_METHOD.invoke(nmsStack, nmsTag);
HashMap<String, String> tagMap = new HashMap<>();
Map<String, Object> nmsMap = (Map<String, Object>) JSONManipulator.MAP.get(nmsTag);
String id = nmsMap.get("id").toString().replace("\"", "");
Object realTag = nmsMap.get("tag");
if (JSONManipulator.NBT_TAG_COMPOUND.isInstance(realTag)) { // We need to make sure this is indeed an
// NBTTagCompound
Map<String, Object> realMap = (Map<String, Object>) JSONManipulator.MAP.get(realTag);
Set<Map.Entry<String, Object>> entrySet = realMap.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
tagMap.put(entry.getKey(), entry.getValue().toString());
}
}
// TODO check for ID remapping
// ItemRewriter.remapIds(Version.getVersion().MAX_VER, protocolVersion.MAX_VER,
// is);
StringBuilder sb = new StringBuilder("{id:");
sb.append("\"").append(id).append("\"").append(","); // Append the id
sb.append("Count:").append(item.getAmount()).append("b"); // Append the amount
if (!tagMap.containsKey("Damage")) { // for new versions
sb.append(",Damage:").append(item.getDurability()).append("s"); // Append the durability data
}
if (tagMap.isEmpty()) {
sb.append("}");
return sb.toString();
}
Set<Map.Entry<String, String>> entrySet = tagMap.entrySet();
boolean first = true;
sb.append(",tag:{"); // Start of the tag
for (Map.Entry<String, String> entry : entrySet) {
if (SKIPPED.contains(entry.getKey()))
continue;
if (!first)
sb.append(",");
first = false;
if (!entry.getKey().isEmpty()) {
if (entry.getKey().contains(";"))
sb.append("\"" + entry.getKey() + "\"");
else
sb.append(entry.getKey());
sb.append(":");
}
sb.append(Utils.cleanStr(entry.getValue()));
}
sb.append("}}"); // End of tag and end of item
return sb.toString();
} catch (Exception e) {
return "{}";
}
}
}
@@ -1,9 +1,11 @@
package me.dadus33.chatitem.playernamer.hook;
import java.util.concurrent.CompletableFuture;
import org.bukkit.entity.Player;
import dev.majek.hexnicks.Nicks;
import me.dadus33.chatitem.playernamer.IPlayerNamer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
import net.md_5.bungee.api.chat.BaseComponent;
@@ -11,7 +13,14 @@ public class HexNicksV2PlayerNamer implements IPlayerNamer {
@Override
public BaseComponent[] getName(Player p) {
return BungeeComponentSerializer.get().serialize(Nicks.api().getStoredNick(p).join());
try {
Object api = Class.forName("dev.majek.hexnicks.Nicks").getDeclaredMethod("api").invoke(null);
CompletableFuture<Component> storedNick = (CompletableFuture<Component>) api.getClass().getDeclaredMethod("getStoredNick", Player.class).invoke(api, p);
return BungeeComponentSerializer.get().serialize(storedNick.join());
} catch (Exception e) {
e.printStackTrace();
}
return new BaseComponent[0];
}
}
@@ -2,6 +2,7 @@ package me.dadus33.chatitem.utils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
@@ -78,4 +79,14 @@ public class ItemUtils {
}
i.setItemMeta(im);
}
@SuppressWarnings("deprecation")
public static Enchantment getEnchant(String... names) {
for(String name : names) {
Enchantment possible = Enchantment.getByName(name);
if(possible != null)
return possible;
}
return null;
}
}
@@ -1,5 +1,6 @@
package me.dadus33.chatitem.utils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@@ -17,6 +18,17 @@ public class ReflectionUtils {
return null;
}
}
public static Method getMethodByName(Class<?> clazz, String methodName) {
try {
for(Method m : clazz.getDeclaredMethods())
if(m.getName().equals(methodName))
return m;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static Method getMethod(Class<?> clazz, Class<?> returned, Class<?>... params) {
try {
@@ -71,6 +83,20 @@ public class ReflectionUtils {
}
}
public static boolean hasObject(Object source, String... field) {
if(source == null)
return false;
for(String fieldName : field) {
try {
source.getClass().getDeclaredField(fieldName);
return true;
} catch (NoSuchFieldException e) {
// ignore because going to next item
}
}
return false;
}
/**
* Get the specified field name in the object source
*
@@ -195,4 +221,11 @@ public class ReflectionUtils {
return false;
}
}
public static Constructor<?> getConstructor(Class<?> clazz, Class<?>... params) {
try {
return clazz.getConstructor(params);
} catch (Exception e) {}
return null;
}
}
@@ -27,7 +27,6 @@ import org.bukkit.inventory.ItemStack;
import me.dadus33.chatitem.ChatItem;
import me.dadus33.chatitem.chatmanager.ChatManager;
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
import me.dadus33.chatitem.playerversion.PlayerVersionManager;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
@@ -178,7 +177,7 @@ public class Utils {
if(Version.getVersion().isNewerOrEquals(Version.V1_13)) {
return new HoverEvent(HoverEvent.Action.SHOW_ITEM, new Item(item.getType().getKey().getKey(), item.getAmount(), ItemTag.ofNbt(PacketUtils.getNbtTag(item))));
} else {
return new HoverEvent(HoverEvent.Action.SHOW_ITEM, new ComponentBuilder(JSONManipulator.stringifyItem(item)).create());
return new HoverEvent(HoverEvent.Action.SHOW_ITEM, new ComponentBuilder(ChatItem.getPlatform().stringifyItem(item)).create());
}
}
@@ -269,4 +268,8 @@ public class Utils {
return false;
}
}
public static String cleanStr(String s) {
return s.startsWith("'") && s.endsWith("'") ? s.substring(1, s.length() - 1) : s;
}
}
+11 -1
View File
@@ -54,7 +54,7 @@ general:
- "{legs}"
# Show what is their feets
boots:
enabled: false
enabled: true
deny-if-no-item: true
keys:
- "[feet]"
@@ -145,6 +145,9 @@ general:
sub-commands:
broadcast: true
show: true
ownformatter:
format: "%name%: %message%"
# Messages section. You can disable any of them by simply leaving them empty, like this: ""
@@ -253,6 +256,13 @@ messages:
- "&eAdapted for paper user, and could be used with more plugin that others"
- ""
- "&7Since ChatItem v2.6"
ownformatter:
name: "&6ChatItem formatter"
lore:
- "&aChatItem format the chat for you."
- "&aNo longer needs another chat plugin."
- ""
- "&7Since ChatItem v2.7"
# The item that show the actual manager
actual:
name: '&6Actual manager: %manager%'