Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b8ce53553 | ||
|
|
6b157320c4 | ||
|
|
ba3da92061 | ||
|
|
dc6ce9c260 | ||
|
|
cf45b8e436 | ||
|
|
fc8966dab0 | ||
|
|
c537e72a27 | ||
|
|
dee359a37d | ||
|
|
34f67345e2 | ||
|
|
d937f5d89e | ||
|
|
856a5f182f | ||
|
|
6653b9c057 | ||
|
|
0b60780fe2 | ||
|
|
a16b2ea462 | ||
|
|
05771d975c | ||
|
|
417b63e86d | ||
|
|
01da231510 | ||
|
|
5e2559c1ee | ||
|
|
0bb784f7f2 | ||
|
|
eef3bf80c8 | ||
|
|
2d97d5fd45 | ||
|
|
32e71bc683 | ||
|
|
31c08cbb37 | ||
|
|
084cc40f88 | ||
|
|
c322fb2eec | ||
|
|
4e90d96f48 | ||
|
|
828a8e3824 | ||
|
|
7da5adf264 | ||
|
|
513185de26 | ||
|
|
2f17aa897a | ||
|
|
dd2359f96d | ||
|
|
8799aa6fc0 | ||
|
|
4dfe50038b | ||
|
|
51c4311233 | ||
|
|
72557594eb | ||
|
|
708e995ac7 | ||
|
|
589318ea8d | ||
|
|
17e9edbd53 | ||
|
|
f5124f749f | ||
|
|
fe10f7ca5b | ||
|
|
d590b66630 | ||
|
|
e68b843f73 | ||
|
|
2cf594f9ed | ||
|
|
1b33b42e94 | ||
|
|
77ba7e65ce | ||
|
|
7375f970af | ||
|
|
870d9052a0 | ||
|
|
4ea4aa43bf | ||
|
|
39ffa60e7a | ||
|
|
fc1c9b0019 | ||
|
|
ed3ad9db85 | ||
|
|
c38d68d081 | ||
|
|
352dcb82b7 | ||
|
|
7981ccaa1e | ||
|
|
e5444216ce | ||
|
|
207159bb17 | ||
|
|
32d4d3556d | ||
|
|
9102b6a11f | ||
|
|
587d6bbb93 | ||
|
|
9ea5d6ffb7 | ||
|
|
7ac7369a7f | ||
|
|
d548b68c8a | ||
|
|
92f4118015 | ||
|
|
3cae31998e | ||
|
|
396b8ccc05 | ||
|
|
70fece6c4f | ||
|
|
7ad2f1923e | ||
|
|
f1796cee43 | ||
|
|
e460940fcd | ||
|
|
26b71376b1 | ||
|
|
9b25f2e0ae | ||
|
|
cd40bc0894 | ||
|
|
06493ab38c | ||
|
|
5c3519171e | ||
|
|
ca6982d7b0 | ||
|
|
1c5a8dbdcc | ||
|
|
0cf3c25b2c | ||
|
|
d0122a123e | ||
|
|
5493d76d00 | ||
|
|
7fc535ffc6 | ||
|
|
8b9f9a2842 | ||
|
|
c60ade6a9c | ||
|
|
a0265599f6 | ||
|
|
9f45069c08 | ||
|
|
f3b95ad32d | ||
|
|
444d58900e | ||
|
|
72f239b293 | ||
|
|
6bc0b919c5 | ||
|
|
4864272c34 | ||
|
|
a421e6e167 | ||
|
|
76c6bafea7 | ||
|
|
f50dd5a1f8 | ||
|
|
0dbc6c14bb | ||
|
|
1d41b02f79 | ||
|
|
ec278c7d08 | ||
|
|
5729dbf4a6 | ||
|
|
4129b52dc5 | ||
|
|
55c9cc6673 | ||
|
|
59e75770fb | ||
|
|
d6ce0c62ff | ||
|
|
0ef13e39ae | ||
|
|
26b0837784 | ||
|
|
1f3a510411 | ||
|
|
039d5fb6d5 | ||
|
|
048fe69204 | ||
|
|
358c574153 | ||
|
|
efa0a345f9 | ||
|
|
78670bf8ec | ||
|
|
a47b93ea1a | ||
|
|
f4d56b56e1 | ||
|
|
3eb54bb4d6 | ||
|
|
a0f54df9b7 | ||
|
|
80a000cee7 | ||
|
|
8bd6bed5fb | ||
|
|
ba5e8d9935 | ||
|
|
8d6b3e7987 | ||
|
|
3fd14b3bdb | ||
|
|
6c3784e662 | ||
|
|
6256de065e | ||
|
|
4c1d64f04c | ||
|
|
4475f19268 | ||
|
|
2b5065dbec | ||
|
|
ba54582f7f | ||
|
|
2b0de9aa3c | ||
|
|
3981992e37 | ||
|
|
439710086e | ||
|
|
f5381b0430 | ||
|
|
3cce52953a | ||
|
|
797de9c602 | ||
|
|
c7f76d9f7b | ||
|
|
3947ea88d5 | ||
|
|
cc30049fdf | ||
|
|
7a964bb97c | ||
|
|
13bbf3e5ca | ||
|
|
46de91b2ff | ||
|
|
cb5b3acab0 | ||
|
|
6f6d4dc263 | ||
|
|
250b119391 |
No files matched your search
@@ -0,0 +1,12 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "maven"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
@@ -10,11 +10,11 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
name: Checkout repo
|
||||
|
||||
- name: Set up JDK 17 (LTS)
|
||||
uses: actions/setup-java@v2
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
- name: Build with Maven
|
||||
run: mvn install --file pom.xml
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
name: Upload Artifact
|
||||
with:
|
||||
name: ChatItem.jar
|
||||
|
||||
@@ -10,11 +10,11 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
name: Checkout repo
|
||||
|
||||
- name: Set up JDK 17 (LTS)
|
||||
uses: actions/setup-java@v2
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
- name: Build with Maven
|
||||
run: mvn install --file pom.xml
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
name: Upload Artifact
|
||||
with:
|
||||
name: ChatItem.jar
|
||||
|
||||
+3
-1
@@ -6,4 +6,6 @@ target/
|
||||
dependency-reduced-pom.xml
|
||||
.classpath
|
||||
.project
|
||||
.settings/
|
||||
.settings/
|
||||
/.apt_generated/
|
||||
/.apt_generated_tests/
|
||||
@@ -1,2 +0,0 @@
|
||||
language: java
|
||||
script: "mvn clean package -DskipTests"
|
||||
@@ -1,5 +1,29 @@
|
||||
# ChatItem [](https://travis-ci.org/dadus33/ChatItem) [](https://discord.gg/eQJbVJt)
|
||||
# ChatItem
|
||||
|
||||
The official repository of the ChatItem Spigot/Bukkit plugin.
|
||||
|
||||
You can:
|
||||
|
||||
- [Download latest dev build](https://nightly.link/dadus33-plugins/ChatItem/workflows/build/v2/ChatItem.jar.zip)
|
||||
- [  ](https://discord.gg/yng5PPf62h)
|
||||
- [Check the wiki](https://github.com/dadus33-plugins/ChatItem/wiki)
|
||||
|
||||
# Item not well showed in chat
|
||||
|
||||
You can try to do `/chatitem admin` then select different paper item. It will change how the plugin try to add item in chat.
|
||||
|
||||
**If you already have issue, please do**:
|
||||
1) Do `/chatitem admin` then select on "Debug" item at top right
|
||||
2) Try to use ChatItem in chat
|
||||
3) Come on discord [here](https://discord.gg/yng5PPf62h) or in private message: `Elikill58#0743`
|
||||
4) Send the **full file `logs/latest.log`**
|
||||
|
||||
PS: Yes you can disable the debug behavior after.
|
||||
|
||||
# Building
|
||||
|
||||
Building this is simple as we use Maven.
|
||||
|
||||
To build it, simply clone this repository and then run `mvn clean install`.
|
||||
|
||||
You can add the parameter `export_dir` to set the URL where the JAR will be exported.
|
||||
@@ -5,8 +5,8 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>me.dadus33</groupId>
|
||||
<artifactId>chatitem</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<artifactId>ChatItem</artifactId>
|
||||
<version>2.4.8</version>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
@@ -70,18 +70,6 @@
|
||||
<type>jar</type>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-api</artifactId>
|
||||
<version>2.17.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>2.17.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
@@ -97,13 +85,13 @@
|
||||
<dependency>
|
||||
<groupId>com.comphenix.protocol</groupId>
|
||||
<artifactId>ProtocolLib</artifactId>
|
||||
<version>5.0.0-SNAPSHOT</version>
|
||||
<version>5.0.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>us.myles</groupId>
|
||||
<artifactId>viaversion</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<groupId>com.viaversion</groupId>
|
||||
<artifactId>viaversion-api</artifactId>
|
||||
<version>4.7.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -115,13 +103,13 @@
|
||||
<dependency>
|
||||
<groupId>io.netty</groupId>
|
||||
<artifactId>netty-all</artifactId>
|
||||
<version>4.1.53.Final</version>
|
||||
<version>4.1.58.Final</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.GeyserMC</groupId>
|
||||
<artifactId>opennbt</artifactId>
|
||||
<version>1.4</version>
|
||||
<version>1.5</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -131,21 +119,27 @@
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-api</artifactId>
|
||||
<version>4.11.0</version>
|
||||
<groupId>com.github.MajekDev</groupId>
|
||||
<artifactId>HexNicks</artifactId>
|
||||
<version>3.1.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-platform-bungeecord</artifactId>
|
||||
<version>4.1.0</version>
|
||||
<artifactId>adventure-api</artifactId>
|
||||
<version>4.14.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-platform-bukkit</artifactId>
|
||||
<version>4.3.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.discordsrv</groupId>
|
||||
<artifactId>discordsrv</artifactId>
|
||||
<version>1.25.1</version>
|
||||
<version>1.26.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -154,6 +148,30 @@
|
||||
<version>8.57.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.Auxilor</groupId>
|
||||
<artifactId>EcoEnchants</artifactId>
|
||||
<version>10.23.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.kangarko</groupId>
|
||||
<artifactId>ChatControl-Free</artifactId>
|
||||
<version>5.9.5</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ryderbelserion</groupId>
|
||||
<artifactId>ChatManager</artifactId>
|
||||
<version>3.7.7</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.willfp</groupId>
|
||||
<artifactId>eco</artifactId>
|
||||
<version>6.65.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
@@ -162,10 +180,6 @@
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<includes>
|
||||
<include>plugin.yml</include>
|
||||
<include>config.yml</include>
|
||||
</includes>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
@@ -183,7 +197,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<version>3.4.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
@@ -223,7 +237,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.2.2</version>
|
||||
<version>3.3.0</version>
|
||||
<configuration>
|
||||
<outputDirectory>${export_dir}</outputDirectory>
|
||||
</configuration>
|
||||
|
||||
@@ -1,20 +1,13 @@
|
||||
package me.dadus33.chatitem;
|
||||
|
||||
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;
|
||||
import me.dadus33.chatitem.commands.CIReloadCommand;
|
||||
import me.dadus33.chatitem.commands.ChatItemCommand;
|
||||
import me.dadus33.chatitem.filters.Log4jFilter;
|
||||
import me.dadus33.chatitem.itemnamer.NamerManager;
|
||||
import me.dadus33.chatitem.listeners.InventoryListener;
|
||||
import me.dadus33.chatitem.listeners.JoinListener;
|
||||
import me.dadus33.chatitem.playernamer.PlayerNamerManager;
|
||||
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 java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -23,177 +16,205 @@ import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.*;
|
||||
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;
|
||||
import me.dadus33.chatitem.commands.CIReloadCommand;
|
||||
import me.dadus33.chatitem.commands.ChatItemCommand;
|
||||
import me.dadus33.chatitem.hook.ChatControlSupport;
|
||||
import me.dadus33.chatitem.hook.ChatManagerSupport;
|
||||
import me.dadus33.chatitem.hook.ecoenchants.EcoEnchantsSupport;
|
||||
import me.dadus33.chatitem.itemnamer.NamerManager;
|
||||
import me.dadus33.chatitem.listeners.InventoryListener;
|
||||
import me.dadus33.chatitem.listeners.JoinListener;
|
||||
import me.dadus33.chatitem.listeners.TranslationInventoryListener;
|
||||
import me.dadus33.chatitem.playernamer.PlayerNamerManager;
|
||||
import me.dadus33.chatitem.utils.SemVer;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
|
||||
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 final static int CFG_VER = 13;
|
||||
public static boolean discordSrvSupport = 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 Storage storage;
|
||||
|
||||
public static void reload(CommandSender sender) {
|
||||
ChatItem pl = getInstance();
|
||||
if (pl.getConfig().getKeys(false).isEmpty())
|
||||
pl.saveDefaultConfig();
|
||||
pl.reloadConfig();
|
||||
String oldChatManager = pl.storage.MANAGER;
|
||||
pl.storage = new Storage(pl.getConfig());
|
||||
pl.chooseManagers();
|
||||
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.");
|
||||
}
|
||||
public static void reload(CommandSender sender) {
|
||||
ChatItem pl = getInstance();
|
||||
if (pl.getConfig().getKeys(false).isEmpty())
|
||||
pl.saveDefaultConfig();
|
||||
pl.reloadConfig();
|
||||
String oldChatManager = pl.storage.manager;
|
||||
pl.storage = new Storage(pl.getConfig());
|
||||
pl.chooseManagers();
|
||||
Translation.load(pl);
|
||||
if(sender != null) {
|
||||
if (!pl.storage.messageReload.isEmpty())
|
||||
sender.sendMessage(pl.storage.messageReload);
|
||||
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 ChatItem getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static void debug(String msg) {
|
||||
if (getInstance().getStorage().DEBUG)
|
||||
getInstance().getLogger().info("[Debug] " + msg.replace(ChatManager.SEPARATOR, 'S'));
|
||||
}
|
||||
public static void debug(String msg) {
|
||||
if (getInstance().getStorage().debug)
|
||||
getInstance().getLogger().info("[Debug] " + msg.replace(ChatManager.SEPARATOR, 'S').replace(ChatManager.SEPARATOR_END, 'E'));
|
||||
}
|
||||
|
||||
private void chooseManagers() {
|
||||
this.chatManager.forEach((cm) -> cm.unload(this));
|
||||
this.chatManager.clear();
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
String managerName = getStorage().MANAGER;
|
||||
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;
|
||||
}
|
||||
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()));
|
||||
this.chatManager.forEach((cm) -> cm.load(this, getStorage()));
|
||||
|
||||
NamerManager.load(this);
|
||||
PlayerNamerManager.load(this);
|
||||
}
|
||||
NamerManager.load(this);
|
||||
PlayerNamerManager.load(this);
|
||||
}
|
||||
|
||||
private List<String> getPluginThatRequirePacket() {
|
||||
return Arrays.asList("DeluxeChat", "HexNicks", "VentureChat");
|
||||
}
|
||||
private List<String> getPluginThatRequirePacket() {
|
||||
return Arrays.asList("DeluxeChat", "HexNicks", "VentureChat", "ItemsAdder");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
//Save the instance (we're basically a singleton)
|
||||
instance = this;
|
||||
getLogger().info("Detected server version: " + Version.getVersion().name().toLowerCase());
|
||||
@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());
|
||||
// Load config
|
||||
if (!new File(getDataFolder(), "config.yml").exists()) {
|
||||
getLogger().info("--------------");
|
||||
getLogger().info("");
|
||||
getLogger().info("Welcome on ChatItem !");
|
||||
getLogger().info("If you need help for setup, USE: /chatitem select");
|
||||
getLogger().info("Then follow steps.");
|
||||
getLogger().info("");
|
||||
getLogger().info("--------------");
|
||||
saveDefaultConfig();
|
||||
}
|
||||
storage = new Storage(getConfig());
|
||||
|
||||
//Commands
|
||||
loadCommand(getCommand("cireload"), new CIReloadCommand());
|
||||
loadCommand(getCommand("chatitem"), new ChatItemCommand());
|
||||
// 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);
|
||||
// events
|
||||
PluginManager pm = getServer().getPluginManager();
|
||||
pm.registerEvents(new JoinListener(), this);
|
||||
pm.registerEvents(new InventoryListener(), this);
|
||||
pm.registerEvents(new TranslationInventoryListener(), this);
|
||||
|
||||
chooseManagers();
|
||||
chooseManagers();
|
||||
|
||||
//Initialize Log4J filter (remove ugly console messages)
|
||||
filter = new Log4jFilter(storage);
|
||||
StringJoiner plugins = new StringJoiner(", ");
|
||||
if (pm.isPluginEnabled("DiscordSRV")) {
|
||||
discordSrvSupport = true;
|
||||
plugins.add("DiscordSRV");
|
||||
}
|
||||
if (pm.isPluginEnabled("ChatControl")) {
|
||||
ChatControlSupport.init(this);
|
||||
plugins.add("ChatControl");
|
||||
}
|
||||
if (pm.isPluginEnabled("ChatManager")) {
|
||||
ChatManagerSupport.init(this);
|
||||
plugins.add("ChatManager");
|
||||
}
|
||||
if (pm.isPluginEnabled("EcoEnchants") && EcoEnchantsSupport.load()) {
|
||||
plugins.add("EcoEnchants");
|
||||
}
|
||||
|
||||
StringJoiner plugins = new StringJoiner(", ");
|
||||
if (pm.getPlugin("DiscordSRV") != null) {
|
||||
discordSrvSupport = true;
|
||||
plugins.add("DiscordSRV");
|
||||
}
|
||||
if (plugins.length() > 0)
|
||||
getLogger().info("Load " + plugins.toString() + " support.");
|
||||
|
||||
if (pm.getPlugin("EcoEnchants") != null) {
|
||||
ecoEnchantsSupport = true;
|
||||
plugins.add("EcoEnchants");
|
||||
}
|
||||
if(plugins.length() > 0)
|
||||
getLogger().info("Load " + plugins.toString() + " support.");
|
||||
|
||||
Translation.load(this);
|
||||
|
||||
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);
|
||||
});
|
||||
getServer().getMessenger().registerIncomingPluginChannel(this, brandChannelName, (chan, p, msg) -> ItemPlayer.getPlayer(p).setClientName(new String(msg).substring(1)));
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (storage.checkUpdate) {
|
||||
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.updateMessage);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
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 Storage getStorage() {
|
||||
return storage;
|
||||
}
|
||||
|
||||
public List<ChatManager> getChatManager() {
|
||||
return chatManager;
|
||||
}
|
||||
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 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 boolean isHasNewVersion() {
|
||||
return hasNewVersion;
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public class ItemPlayer {
|
||||
}
|
||||
|
||||
public boolean isBuggedClient() {
|
||||
return getVersion().equals(Version.V1_7) && getClientName().toLowerCase().contains("lunarclient");
|
||||
return (getVersion().equals(Version.V1_7) && getClientName().toLowerCase().contains("lunarclient")) || (!getVersion().isNewerOrEquals(Version.V1_15) && Version.getVersion().isNewerOrEquals(Version.V1_16));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
package me.dadus33.chatitem;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
public class Storage {
|
||||
|
||||
public String handName, nameFormat, amountFormat, commandFormat, manager, permissionName, buggedClientAction, language;
|
||||
public final String messageNoPermission, messageDeny, messageReload, messageCooldown, messageLimit, messageIgnoredItem;
|
||||
public final String SECONDS, minutes, hours;
|
||||
public final String updateMessage, updateHover;
|
||||
public final List<String> placeholders, tooltipHand, tooltipBuggedClient, ignoredItems;
|
||||
public boolean colorIfColored, addAmountForced, letMessageThrough, denyIfNoItem, debug, handDisabled, showNoPermissionMessage, checkUpdate, permissionEnabled;
|
||||
public int configVersion, limit, cooldown;
|
||||
private FileConfiguration conf;
|
||||
|
||||
public Storage(FileConfiguration cnf) {
|
||||
this.conf = cnf;
|
||||
configVersion = conf.getInt("config-version", 13);
|
||||
checkConfigVersion();
|
||||
this.manager = conf.getString("manager", "auto");
|
||||
language = conf.getString("general.language", "en_gb");
|
||||
debug = conf.getBoolean("debug", false);
|
||||
placeholders = ImmutableList.copyOf(conf.getStringList("general.placeholders"));
|
||||
nameFormat = color(conf.getString("general.name-format", "&b&l&o{name} {amount}&r"));
|
||||
amountFormat = color(conf.getString("general.amount-format", "x{times}"));
|
||||
commandFormat = color(conf.getString("general.command-format", "&6%name%'s item is %item%"));
|
||||
colorIfColored = conf.getBoolean("general.color-if-already-colored", true);
|
||||
letMessageThrough = conf.getBoolean("general.let-message-through", true);
|
||||
addAmountForced = conf.getBoolean("general.force-add-amount", true);
|
||||
denyIfNoItem = conf.getBoolean("general.deny-if-no-item", false);
|
||||
limit = conf.getInt("general.limit", 8);
|
||||
cooldown = conf.getInt("general.cooldown", 60);
|
||||
showNoPermissionMessage = conf.getBoolean("general.show-no-permission-message.normal", true);
|
||||
permissionEnabled = conf.getBoolean("general.permission.enabled", false);
|
||||
permissionName = conf.getString("general.permission.name", "chatitem.use");
|
||||
handDisabled = conf.getBoolean("general.hand.disabled", false);
|
||||
handName = color(conf.getString("general.hand.name", "&b&l&o{display-name}&b&l&o's hand"));
|
||||
tooltipHand = conf.getStringList("general.hand.tooltip").stream().map(Storage::color).collect(Collectors.toList());
|
||||
buggedClientAction = conf.getString("general.bugged_client.action", "show_both");
|
||||
tooltipBuggedClient = conf.getStringList("general.bugged_client.tooltip").stream().map(Storage::color).collect(Collectors.toList());
|
||||
ignoredItems = conf.getStringList("general.ignored_items");
|
||||
checkUpdate = conf.getBoolean("general.check-update", true);
|
||||
messageDeny = color(conf.getString("messages.deny-message", "&c&lYou have no item in hand!"));
|
||||
messageReload = color(conf.getString("messages.reload-success", "&b&lSuccessful reload!"));
|
||||
messageNoPermission = color(conf.getString("messages.no-permission", "&c&lI'm sorry, but you are not allowed to use the placeholder in chat!"));
|
||||
messageCooldown = color(conf.getString("messages.cooldown-message", "&c&lYou can only use items in chat once a minute! You have {remaining} left!"));
|
||||
updateMessage = color(conf.getString("messages.join-update.message", "&cA new version of ChatItem is available. &aClick here to download."));
|
||||
updateHover = color(conf.getString("messages.join-update.hover", "&6Click to go to spigot page !"));
|
||||
messageLimit = color(conf.getString("messages.limit-message", "&c&lYou can only add 8 item placeholders per message!"));
|
||||
messageIgnoredItem = color(conf.getString("messages.ignored-item", "&cThis item is not allowed to be showed."));
|
||||
|
||||
SECONDS = color(conf.getString("messages.seconds", " seconds"));
|
||||
minutes = color(conf.getString("messages.minutes", " minutes"));
|
||||
hours = color(conf.getString("messages.hours", " hours"));
|
||||
colorStringList(tooltipHand);
|
||||
|
||||
}
|
||||
|
||||
public static String color(String s) {
|
||||
return s == null || s.isEmpty() ? s : ChatColor.translateAlternateColorCodes('&', s);
|
||||
}
|
||||
|
||||
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 != configVersion) {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package me.dadus33.chatitem;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
|
||||
public class Translation {
|
||||
|
||||
private static File folder;
|
||||
private static YamlConfiguration legacy, allLangsConfig;
|
||||
private static JsonObject messages;
|
||||
private static HashMap<String, String> allLangs = new HashMap<>();
|
||||
|
||||
public static void load(ChatItem pl) {
|
||||
folder = new File(pl.getDataFolder(), "lang");
|
||||
if (!folder.exists())
|
||||
folder.mkdir();
|
||||
legacy = Utils.copyLoadFile(folder, "legacy.yml", "lang/legacy.yml");
|
||||
allLangsConfig = Utils.copyLoadFile(pl.getDataFolder(), "langs.yml", "langs.yml");
|
||||
|
||||
allLangsConfig.getStringList("all").forEach(langKey -> {
|
||||
JsonObject content = JsonParser.parseReader(new InputStreamReader(pl.getResource("lang/" + langKey + ".json"))).getAsJsonObject();
|
||||
allLangs.put(langKey, content.get("language.name").getAsString() + " (" + content.get("language.region").getAsString() + ")");
|
||||
});
|
||||
allLangs = allLangs.entrySet().stream().sorted(Entry.comparingByValue()).collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
|
||||
loadLang(pl.getStorage().language);
|
||||
}
|
||||
|
||||
public static HashMap<String, String> getAllLangs() {
|
||||
return allLangs;
|
||||
}
|
||||
|
||||
public static JsonObject getMessages() {
|
||||
return messages;
|
||||
}
|
||||
|
||||
public static void loadLang(String lang) {
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
File langFile = new File(folder, lang + ".json");
|
||||
if (!langFile.exists()) {
|
||||
if (pl.getResource("lang/" + lang + ".json") != null) {
|
||||
Utils.copyFile("lang/" + lang + ".json", langFile);
|
||||
} else {
|
||||
pl.getLogger().severe("Failed to find lang file for " + lang);
|
||||
if(lang != "en_gb")
|
||||
loadLang("en_gb");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
messages = JsonParser.parseReader(new FileReader(langFile)).getAsJsonObject();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
pl.getLogger().info("Loaded translation for " + lang + ".");
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static String get(ItemStack item) {
|
||||
String key = (item.getType().isBlock() ? "block" : "item") + ".minecraft." + item.getType().name().toLowerCase();
|
||||
if (messages != null && messages.has(key)) {
|
||||
return messages.get(key).getAsString();
|
||||
} else
|
||||
ChatItem.debug("Failed to find translation for " + key);
|
||||
return legacy.getString(item.getType().name() + "." + item.getDurability(), item.getType().name().toLowerCase().replace("_", " "));
|
||||
}
|
||||
|
||||
protected void thisMethodShouldNotBeUsed_InsteadToUpdateLangFileFromLocalInstall() throws Exception {
|
||||
File dir = new File("dir/to/result");
|
||||
File folder = new File("C:\\Dir\\To\\AppData\\Roaming\\.minecraft\\assets");// here we are looking for 1.19
|
||||
JsonObject json = JsonParser.parseReader(new FileReader(new File(folder, "indexes/1.19.json"))).getAsJsonObject().get("objects").getAsJsonObject();
|
||||
for (String key : json.keySet()) {
|
||||
if (key.startsWith("minecraft/lang")) { // only lang files
|
||||
String lang = key.toString().replace("minecraft/lang/", "");
|
||||
String hash = json.get(key).getAsJsonObject().get("hash").getAsString();
|
||||
File langFile = new File(folder, "objects/" + hash.substring(0, 2) + "/" + hash);
|
||||
JsonObject langs = JsonParser.parseReader(new FileReader(langFile)).getAsJsonObject();
|
||||
for (String langKey : new ArrayList<>(langs.keySet())) {
|
||||
if (!(langKey.startsWith("block.") || langKey.startsWith("language"))) { // only what we want
|
||||
langs.remove(langKey); // removing not needed
|
||||
}
|
||||
}
|
||||
File langDir = new File(dir, lang);
|
||||
Files.write(langDir.toPath(), Arrays.asList(langs.toString()));
|
||||
System.out.println("Copied " + lang); // using sysout as it's made for basic java, not mc
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package me.dadus33.chatitem.chatmanager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.ItemPlayer;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
|
||||
public class Chat {
|
||||
|
||||
private static int actualId = 0;
|
||||
private static final List<Chat> CHAT = new ArrayList<>();
|
||||
public static Optional<Chat> getChat(int id) {
|
||||
synchronized (CHAT) {
|
||||
CHAT.removeIf(Chat::isOld);
|
||||
return CHAT.stream().filter(o -> o.getId() == id).findFirst();
|
||||
}
|
||||
}
|
||||
public static Chat create(Player p, String message) {
|
||||
return new Chat(actualId++, p, message);
|
||||
}
|
||||
public static Chat getFrom(String message) {
|
||||
boolean found = false;
|
||||
String id = "";
|
||||
for(char c : ChatManager.fixSeparator(message).toCharArray()) {
|
||||
if(c == ChatManager.SEPARATOR)
|
||||
found = true;
|
||||
else if(c == ChatManager.SEPARATOR_END)
|
||||
break;
|
||||
else if(found)
|
||||
id += c;
|
||||
}
|
||||
ChatItem.debug("Search in " + message + ", id found: " + id);
|
||||
return (id != "" && Utils.isInteger(id)) ? Chat.getChat(Integer.parseInt(id)).orElse(null) : null;
|
||||
}
|
||||
|
||||
private final long time;
|
||||
private final int id;
|
||||
private final Player p;
|
||||
private final String message;
|
||||
|
||||
public Chat(int id, Player p, String message) {
|
||||
this.time = System.currentTimeMillis();
|
||||
this.id = id;
|
||||
this.p = p;
|
||||
this.message = message;
|
||||
CHAT.add(this);
|
||||
}
|
||||
|
||||
public long getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return p;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public ItemPlayer getItemPlayer() {
|
||||
return ItemPlayer.getPlayer(getPlayer());
|
||||
}
|
||||
|
||||
private boolean isOld() {
|
||||
return System.currentTimeMillis() > time + 10000;
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
CHAT.remove(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Chat{id=" + id + ",message=" + message + ",time=" + time + "}";
|
||||
}
|
||||
}
|
||||
@@ -15,14 +15,15 @@ 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.Storage;
|
||||
import me.dadus33.chatitem.hook.ecoenchants.EcoEnchantsSupport;
|
||||
import me.dadus33.chatitem.itemnamer.NamerManager;
|
||||
import me.dadus33.chatitem.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
|
||||
public abstract class ChatManager {
|
||||
|
||||
public static String inTest = null;
|
||||
private final static HashMap<UUID, Long> COOLDOWNS = new HashMap<>();
|
||||
private final static HashMap<UUID, Long> LAST_INFO_MESSAGE = new HashMap<>();
|
||||
private final static String NAME = "{name}";
|
||||
@@ -31,37 +32,35 @@ public abstract class ChatManager {
|
||||
private final static String LEFT = "{remaining}";
|
||||
public final static char SEPARATOR = ((char) 0x0007);
|
||||
public final static String SEPARATOR_STR = "\\u0007";
|
||||
public final static char SEPARATOR_END = ((char) 0x0003);
|
||||
public final static String SEPARATOR_END_STR = "\\u0003";
|
||||
|
||||
public static String removeSeparator(String message) {
|
||||
return fixSeparator(message).replace(Character.toString(SEPARATOR), "").replace(Character.toString(SEPARATOR_END), "");
|
||||
}
|
||||
|
||||
public static String replaceSeparator(Chat chat, String message, String replacement) {
|
||||
return fixSeparator(message).replace(Character.toString(SEPARATOR) + (chat != null ? chat.getId() : "") + Character.toString(SEPARATOR_END), replacement);
|
||||
}
|
||||
|
||||
public static String fixSeparator(String s) {
|
||||
return s.replace(ChatManager.SEPARATOR_STR, Character.toString(ChatManager.SEPARATOR));
|
||||
return s == null ? "" : s.replace(SEPARATOR_STR, Character.toString(SEPARATOR)).replace(SEPARATOR_END_STR, Character.toString(SEPARATOR_END));
|
||||
}
|
||||
|
||||
public static boolean equalsSeparator(String s) {
|
||||
return s.equalsIgnoreCase(SEPARATOR_STR) || s.equalsIgnoreCase(Character.toString(SEPARATOR));
|
||||
return s != null && (s.equalsIgnoreCase(SEPARATOR_STR) || s.equalsIgnoreCase(Character.toString(SEPARATOR)));
|
||||
}
|
||||
|
||||
public static boolean containsSeparator(String s) {
|
||||
return s.contains(SEPARATOR_STR) || s.contains(Character.toString(SEPARATOR));
|
||||
return s != null && (s.contains(SEPARATOR_STR) || s.contains(Character.toString(SEPARATOR)));
|
||||
}
|
||||
|
||||
public static boolean endsWithSeparator(String s) {
|
||||
return s.endsWith(SEPARATOR_STR) || s.endsWith(Character.toString(SEPARATOR));
|
||||
|
||||
public static boolean equalsSeparatorEnd(String s) {
|
||||
return s != null && (s.equalsIgnoreCase(SEPARATOR_END_STR) || s.equalsIgnoreCase(Character.toString(SEPARATOR_END)));
|
||||
}
|
||||
|
||||
public static String[] splitWithSeparator(String msg) {
|
||||
List<String> list = new ArrayList<>();
|
||||
String current = "";
|
||||
for(String s : msg.split("")) {
|
||||
if(equalsSeparator(s)) {
|
||||
if(!current.isEmpty())
|
||||
list.add(current);
|
||||
current = "";
|
||||
} else
|
||||
current += s;
|
||||
}
|
||||
if(!current.isEmpty())
|
||||
list.add(current);
|
||||
return list.toArray(new String[] {});
|
||||
|
||||
public static boolean containsSeparatorEnd(String s) {
|
||||
return s != null && (s.contains(SEPARATOR_END_STR) || s.contains(Character.toString(SEPARATOR_END)));
|
||||
}
|
||||
|
||||
protected Storage s;
|
||||
@@ -83,7 +82,7 @@ public abstract class ChatManager {
|
||||
}
|
||||
|
||||
public abstract void unload(ChatItem pl);
|
||||
|
||||
|
||||
/**
|
||||
* Get the item in hand as usable one.<br>
|
||||
* Will include, in lore, all informations from other plugins.
|
||||
@@ -93,23 +92,17 @@ public abstract class ChatManager {
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
if (EcoEnchantsSupport.hasSupport()) {
|
||||
item = EcoEnchantsSupport.manageItem(item);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all lores lines of an item, to replace the show_item action which is not working with ViaBackwards
|
||||
* Get all lores lines of an item, to replace the show_item action which is not
|
||||
* working with ViaBackwards
|
||||
*
|
||||
* @param item the item to get lines from
|
||||
* @return all lores
|
||||
@@ -118,8 +111,7 @@ public abstract class ChatManager {
|
||||
List<String> lines = new ArrayList<>();
|
||||
if (item.hasItemMeta()) {
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
lines.add(meta.hasDisplayName() ? meta.getDisplayName()
|
||||
: NamerManager.getName(p, item, ChatItem.getInstance().getStorage()));
|
||||
lines.add(meta.hasDisplayName() ? meta.getDisplayName() : NamerManager.getName(p, item, ChatItem.getInstance().getStorage()));
|
||||
if (meta.hasEnchants()) {
|
||||
meta.getEnchants().forEach((enchant, lvl) -> {
|
||||
lines.add(ChatColor.RESET + Utils.getEnchantName(enchant) + " " + Utils.toRoman(lvl));
|
||||
@@ -132,22 +124,22 @@ public abstract class ChatManager {
|
||||
}
|
||||
return lines;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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
|
||||
* 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
|
||||
* @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();
|
||||
String replacer = c.nameFormat;
|
||||
String amount = c.amountFormat;
|
||||
if (item.getAmount() == 1) {
|
||||
if (c.FORCE_ADD_AMOUNT) {
|
||||
if (c.addAmountForced) {
|
||||
amount = amount.replace(TIMES, "1");
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
} else {
|
||||
@@ -157,10 +149,10 @@ public abstract class ChatManager {
|
||||
amount = amount.replace(TIMES, String.valueOf(item.getAmount()));
|
||||
replacer = replacer.replace(AMOUNT, amount);
|
||||
}
|
||||
if (dname) {
|
||||
if (item.hasItemMeta() && item.getItemMeta().hasDisplayName()) {
|
||||
String trp = item.getItemMeta().getDisplayName();
|
||||
ChatItem.debug("trp: " + trp);
|
||||
if (c.COLOR_IF_ALREADY_COLORED) {
|
||||
if (c.colorIfColored) {
|
||||
replacer = replacer.replace(NAME, ChatColor.stripColor(trp));
|
||||
} else {
|
||||
replacer = replacer.replace(NAME, trp);
|
||||
@@ -174,43 +166,19 @@ public abstract class ChatManager {
|
||||
/**
|
||||
* Get the name of item according to player & config
|
||||
*
|
||||
* @param p the player
|
||||
* @param p the player that is owner of item
|
||||
* @param item the item
|
||||
* @param c the config
|
||||
* @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);
|
||||
if (ItemUtils.isEmpty(item)) {
|
||||
if (c.handDisabled)
|
||||
return c.placeholders.get(0);
|
||||
else
|
||||
return c.HAND_NAME;
|
||||
return c.handName;
|
||||
}
|
||||
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;
|
||||
return styleItem(p, item, c);
|
||||
}
|
||||
|
||||
public static String calculateTime(long seconds) {
|
||||
@@ -221,7 +189,7 @@ public abstract class ChatManager {
|
||||
if (seconds < 3600) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int minutes = (int) seconds / 60;
|
||||
builder.append(minutes).append(c.MINUTES);
|
||||
builder.append(minutes).append(c.minutes);
|
||||
int secs = (int) seconds - minutes * 60;
|
||||
if (secs != 0) {
|
||||
builder.append(" ").append(secs).append(c.SECONDS);
|
||||
@@ -230,10 +198,10 @@ public abstract class ChatManager {
|
||||
}
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int hours = (int) seconds / 3600;
|
||||
builder.append(hours).append(c.HOURS);
|
||||
builder.append(hours).append(c.hours);
|
||||
int minutes = (int) (seconds / 60) - (hours * 60);
|
||||
if (minutes != 0) {
|
||||
builder.append(" ").append(minutes).append(c.MINUTES);
|
||||
builder.append(" ").append(minutes).append(c.minutes);
|
||||
}
|
||||
int secs = (int) (seconds - ((seconds / 60) * 60));
|
||||
if (secs != 0) {
|
||||
@@ -244,70 +212,88 @@ public abstract class ChatManager {
|
||||
|
||||
public static boolean canShowItem(Player p, ItemStack item, @Nullable Cancellable e) {
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
if (c.PERMISSION_ENABLED && !p.hasPermission(c.PERMISSION_NAME)) {
|
||||
if (!c.LET_MESSAGE_THROUGH) {
|
||||
if(e != null)
|
||||
if (c.permissionEnabled && !p.hasPermission(c.permissionName)) {
|
||||
if (!c.letMessageThrough) {
|
||||
if (e != null)
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!c.NO_PERMISSION_MESSAGE.isEmpty() && c.SHOW_NO_PERM_NORMAL) {
|
||||
sendIfNeed(p, c.NO_PERMISSION_MESSAGE);
|
||||
if (!c.messageNoPermission.isEmpty() && c.showNoPermissionMessage) {
|
||||
sendIfNeed(p, c.messageNoPermission);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (item.getType().equals(Material.AIR)) {
|
||||
if (c.DENY_IF_NO_ITEM) {
|
||||
if(e != null)
|
||||
if (c.denyIfNoItem) {
|
||||
if (e != null)
|
||||
e.setCancelled(true);
|
||||
if (!c.DENY_MESSAGE.isEmpty())
|
||||
sendIfNeed(p, c.DENY_MESSAGE);
|
||||
if (!c.messageDeny.isEmpty())
|
||||
sendIfNeed(p, c.messageDeny);
|
||||
return false;
|
||||
}
|
||||
if (c.HAND_DISABLED) {
|
||||
if (c.handDisabled) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (c.COOLDOWN > 0 && !p.hasPermission("chatitem.ignore-cooldown")) {
|
||||
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) {
|
||||
if (elapsed >= c.cooldown) {
|
||||
COOLDOWNS.remove(p.getUniqueId());
|
||||
} else {
|
||||
if (!c.LET_MESSAGE_THROUGH) {
|
||||
if(e != null)
|
||||
if (!c.letMessageThrough) {
|
||||
if (e != null)
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (!c.COOLDOWN_MESSAGE.isEmpty()) {
|
||||
long left = (start + c.COOLDOWN) - current;
|
||||
sendIfNeed(p, c.COOLDOWN_MESSAGE.replace(LEFT, ChatManager.calculateTime(left)));
|
||||
if (!c.messageCooldown.isEmpty()) {
|
||||
long left = (start + c.cooldown) - current;
|
||||
sendIfNeed(p, c.messageCooldown.replace(LEFT, ChatManager.calculateTime(left)));
|
||||
}
|
||||
ChatItem.debug("Cooldown");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (String ignored : c.ignoredItems) {
|
||||
if (item.getType().name().toLowerCase().contains(ignored.toLowerCase())) {
|
||||
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) {
|
||||
if (time != null) {
|
||||
long diff = System.currentTimeMillis() - time;
|
||||
if(diff < 100)
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
public static void applyCooldown(Player p) {
|
||||
COOLDOWNS.put(p.getUniqueId(), System.currentTimeMillis() / 1000);
|
||||
}
|
||||
|
||||
public static boolean isTestingEnabled() {
|
||||
return inTest != null;
|
||||
}
|
||||
|
||||
public static boolean isTesting(String actual) {
|
||||
return inTest != null && (inTest == "both" || inTest.equalsIgnoreCase(actual));
|
||||
}
|
||||
|
||||
public static void setTesting(String actual) {
|
||||
inTest = actual;
|
||||
}
|
||||
}
|
||||
@@ -6,25 +6,22 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
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.packets.PacketManager;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class PacketEditingChatManager extends ChatManager {
|
||||
|
||||
private final JSONManipulatorCurrent jsonManipulator;
|
||||
private boolean baseComponentAvailable = true;
|
||||
private final ChatItemPacketManager packetManager;
|
||||
private final ChatEventListener chatEventListener;
|
||||
private final ChatPacketManager chatPacketManager;
|
||||
|
||||
public PacketEditingChatManager(ChatItem pl) {
|
||||
jsonManipulator = new JSONManipulatorCurrent();
|
||||
packetManager = new ChatItemPacketManager(pl);
|
||||
chatEventListener = new ChatEventListener(this);
|
||||
chatPacketManager = new ChatPacketManager(this);
|
||||
@@ -65,29 +62,64 @@ public class PacketEditingChatManager extends ChatManager {
|
||||
pm.stop();
|
||||
}
|
||||
|
||||
public JSONManipulatorCurrent getManipulator() {
|
||||
return jsonManipulator;
|
||||
}
|
||||
|
||||
public boolean supportsChatComponentApi() {
|
||||
return baseComponentAvailable;
|
||||
}
|
||||
|
||||
public static Object createSystemChatPacket(String json) throws Exception {
|
||||
Class<?> packetClass = PacketUtils.getNmsClass("ClientboundSystemChatPacket", "network.protocol.game.");
|
||||
Object packet = internalCreateSystemChatPacket(json);
|
||||
if(packet != null)
|
||||
return packet;
|
||||
packet = internalCreateSystemChatPacket(PacketUtils.ICB_FROM_JSON.invoke(null, json));
|
||||
if(packet != null)
|
||||
return packet;
|
||||
ChatItem.getInstance().getLogger().warning("Can't create a new packet for json " + json);
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Object internalCreateSystemChatPacket(Object obj) throws Exception {
|
||||
Class<?> packetClass = PacketUtils.getNmsClass("ClientboundSystemChatPacket", "network.protocol.game.", "PacketPlayOutChat");
|
||||
Constructor<?> betterOne = null;
|
||||
Object[] betterParam = null;
|
||||
for (Constructor<?> cons : packetClass.getDeclaredConstructors()) {
|
||||
if (!cons.isAccessible())
|
||||
cons.setAccessible(true);
|
||||
if (cons.getParameterCount() == 2 && cons.getParameterTypes()[0].equals(String.class)
|
||||
&& cons.getParameterTypes()[1].equals(int.class)) { // "string, int"
|
||||
return cons.newInstance(json, 1);
|
||||
} else if (cons.getParameterCount() == 3 && cons.getParameterTypes()[1].equals(String.class)
|
||||
&& cons.getParameterTypes()[2].equals(int.class)) { // "component", "string", "int"
|
||||
return cons.newInstance(null, json, 1);
|
||||
|
||||
// check for basic method
|
||||
if(obj instanceof String) {
|
||||
if (cons.getParameterCount() == 2 && cons.getParameterTypes()[0].equals(String.class) && cons.getParameterTypes()[1].equals(int.class)) { // "string, int"
|
||||
return cons.newInstance(obj, 1);
|
||||
} else if (cons.getParameterCount() == 3 && cons.getParameterTypes()[1].equals(String.class)) { // "component", "string", <something not checked>
|
||||
Class<?> secondParam = cons.getParameterTypes()[2];
|
||||
if (secondParam.equals(int.class)) // "component", "string", "int"
|
||||
return cons.newInstance(null, obj, 1);
|
||||
else if (secondParam.equals(boolean.class)) // "component", "string", "boolean"
|
||||
return cons.newInstance(null, obj, false);
|
||||
}
|
||||
}
|
||||
|
||||
int nbPut = 0;
|
||||
Object[] params = new Object[cons.getParameterCount()];
|
||||
for(int i = 0; i < params.length; i++) {
|
||||
if(cons.getParameterTypes()[i].isAssignableFrom(obj.getClass())) {
|
||||
params[i] = obj;
|
||||
nbPut++;
|
||||
}
|
||||
}
|
||||
if(nbPut == 1) {
|
||||
if((betterOne == null && betterParam == null) || betterParam.length > params.length) {
|
||||
betterOne = cons;
|
||||
betterParam = params;
|
||||
if(params.length == 1) // only what we need
|
||||
break;
|
||||
continue; // check for something better?
|
||||
}
|
||||
} else if(nbPut > 1)
|
||||
ChatItem.getInstance().getLogger().warning("Some constructor seems to have too many " + obj.getClass().getSimpleName() + ". Class: " + packetClass.getSimpleName());
|
||||
}
|
||||
if(betterOne != null && betterParam != null) {
|
||||
return betterOne.newInstance(betterParam);
|
||||
}
|
||||
ChatItem.getInstance().getLogger()
|
||||
.warning("Can't create a new packet for json " + json + ": no constructor found.");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public interface IBaseComponentGetter {
|
||||
|
||||
default boolean hasConditions() {
|
||||
return true;
|
||||
}
|
||||
|
||||
String getBaseComponentAsJSON(ChatItemPacket packet);
|
||||
|
||||
void writeJson(ChatItemPacket packet, String json);
|
||||
|
||||
/**
|
||||
* Use actual base component getter to check if the given json has placeholders
|
||||
*
|
||||
* @param c the storage config
|
||||
* @param json the json
|
||||
* @return the founded placeholder or null
|
||||
*/
|
||||
default @Nullable String hasPlaceholders(Storage c, String json) {
|
||||
if(json == null || json.isEmpty())
|
||||
return null;
|
||||
for (String rep : c.PLACEHOLDERS) {
|
||||
if (json.contains(rep)) {
|
||||
return rep;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
default @Nullable String getNameFromMessage(String json, String toReplace) {
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
String name = toReplace + p.getName();
|
||||
if (json.contains(name))
|
||||
return p.getName();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use actual base component getter to remove the player and the name.<br>
|
||||
* This is for special component which split message into sub string
|
||||
*
|
||||
* @param json the global json
|
||||
* @param toReplace the string which contains the placeholder
|
||||
* @param foundedPlayer the player which has the name in message
|
||||
* @return the replaced json
|
||||
*/
|
||||
default String removePlaceholdersAndName(String json, String toReplace, Player foundedPlayer) {
|
||||
return json.replace(toReplace + foundedPlayer.getName(), Character.toString(ChatManager.SEPARATOR));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
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.ItemPlayer;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.Chat;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
|
||||
public interface IComponentManager {
|
||||
|
||||
default boolean hasConditions() {
|
||||
return true;
|
||||
}
|
||||
|
||||
String getBaseComponentAsJSON(ChatItemPacket packet);
|
||||
|
||||
void writeJson(ChatItemPacket packet, String json);
|
||||
|
||||
default @Nullable Chat getChat(String json) {
|
||||
json = ChatManager.fixSeparator(json);
|
||||
try {
|
||||
Chat possibleChat = Chat.getFrom(json);
|
||||
if (possibleChat != null) // found something with basic search
|
||||
return possibleChat;
|
||||
Chat chat = new Searching(json).search();
|
||||
if (chat == null)
|
||||
ChatItem.debug("Failed to find chat for JSON " + json);
|
||||
return chat;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} // not JSON
|
||||
return null;
|
||||
}
|
||||
|
||||
default Object manageItem(Player p, Chat chat, ChatItemPacket packet, ItemStack item, Storage c) throws Exception {
|
||||
String message = JSONManipulator.getInstance().parse(chat, getBaseComponentAsJSON(packet), item, ChatManager.styleItem(chat.getPlayer(), item, c),
|
||||
ItemPlayer.getPlayer(p).getProtocolVersion());
|
||||
if (message != null) {
|
||||
ChatItem.debug("(v1) Writing message: " + message);
|
||||
writeJson(packet, message);
|
||||
}
|
||||
return packet.getPacket();
|
||||
}
|
||||
|
||||
default Object manageEmpty(Player p, Chat chat, ChatItemPacket packet, Storage c) {
|
||||
String message = JSONManipulator.getInstance().parseEmpty(getBaseComponentAsJSON(packet), c.handName, c.tooltipHand, chat.getPlayer());
|
||||
if (message != null) {
|
||||
ChatItem.debug("(v1) Writing empty message: " + message);
|
||||
writeJson(packet, message);
|
||||
}
|
||||
return packet.getPacket();
|
||||
}
|
||||
|
||||
public static class Searching {
|
||||
|
||||
private boolean found = false;
|
||||
private String id = "", json;
|
||||
|
||||
public Searching(String json) {
|
||||
this.json = json;
|
||||
}
|
||||
|
||||
private Chat search() {
|
||||
JsonObject jsonObj = JsonParser.parseString(json).getAsJsonObject();
|
||||
if (jsonObj.has("extra")) {
|
||||
if (searchInExtra(jsonObj.getAsJsonArray("extra"))) {
|
||||
return getWithId();
|
||||
}
|
||||
}
|
||||
if (jsonObj.has("text")) {
|
||||
JsonElement text = jsonObj.get("text");
|
||||
if(text.isJsonObject() && searchInObject(text.getAsJsonObject()))
|
||||
return getWithId();
|
||||
else if(text.isJsonArray() && searchInExtra(text.getAsJsonArray()))
|
||||
return getWithId();
|
||||
else if(text.isJsonPrimitive() && searchInString(text.getAsString()))
|
||||
return getWithId();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private Chat getWithId() {
|
||||
return id != "" && Utils.isInteger(id) ? Chat.getChat(Integer.parseInt(id)).orElse(null) : null;
|
||||
}
|
||||
|
||||
private boolean searchInExtra(JsonArray json) {
|
||||
for (JsonElement element : json) {
|
||||
if (element.isJsonObject()) {
|
||||
JsonObject withObj = element.getAsJsonObject();
|
||||
if (withObj.has("extra") && searchInExtra(withObj.getAsJsonArray("extra")))
|
||||
return true;
|
||||
else if (withObj.has("text") && searchInObject(withObj))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean searchInObject(JsonObject json) {
|
||||
return json.has("text") && json.get("text").isJsonPrimitive() && searchInString(json.get("text").getAsString());
|
||||
}
|
||||
|
||||
private boolean searchInString(String s) {
|
||||
for (char c : ChatManager.fixSeparator(s).toCharArray()) {
|
||||
if (c == ChatManager.SEPARATOR)
|
||||
found = true;
|
||||
else if (c == ChatManager.SEPARATOR_END)
|
||||
return true;
|
||||
else if (found)
|
||||
id += c;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
-283
@@ -1,283 +0,0 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
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.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
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.builder.AbstractBuilder",
|
||||
"net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer"))
|
||||
Class.forName(cl);
|
||||
} catch (Exception 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.get().serialize(comp).clone());
|
||||
ChatItem.debug("AdventureJSON : " + json);
|
||||
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 String hasPlaceholders(Storage c, String json) {
|
||||
if(useExtra)
|
||||
return IBaseComponentGetter.super.hasPlaceholders(c, json);
|
||||
JsonObject jsonObj = JsonParser.parseString(json).getAsJsonObject();
|
||||
if(!jsonObj.has("extra"))
|
||||
return null;
|
||||
for(JsonElement element : jsonObj.get("extra").getAsJsonArray()) {
|
||||
if(element.isJsonObject()) {
|
||||
JsonObject withObj = element.getAsJsonObject();
|
||||
if(withObj.has("extra")) {
|
||||
String text = "";
|
||||
for(JsonElement extra : withObj.get("extra").getAsJsonArray()) {
|
||||
if(extra.isJsonObject()) {
|
||||
JsonObject extraObj = extra.getAsJsonObject();
|
||||
if(extraObj.has("text") && extraObj.get("text").isJsonPrimitive())
|
||||
text += extraObj.get("text").getAsString();
|
||||
}
|
||||
}
|
||||
String placeholder = IBaseComponentGetter.super.hasPlaceholders(c, text);
|
||||
if(placeholder != null)
|
||||
return placeholder;
|
||||
} else if(withObj.has("text")) {
|
||||
String placeholder = IBaseComponentGetter.super.hasPlaceholders(c, withObj.get("text").getAsString());
|
||||
if(placeholder != null)
|
||||
return placeholder;
|
||||
}
|
||||
} // ignoring all others because it should not appear
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNameFromMessage(String json, String toReplace) {
|
||||
if(useExtra)
|
||||
return IBaseComponentGetter.super.getNameFromMessage(json, toReplace);
|
||||
String tmpName = IBaseComponentGetter.super.getNameFromMessage(json, toReplace);
|
||||
if(tmpName != null)
|
||||
return tmpName; // don't need to check for json if basically found
|
||||
JsonObject jsonObj = JsonParser.parseString(json).getAsJsonObject();
|
||||
if(!jsonObj.has("extra"))
|
||||
return null;
|
||||
for(JsonElement element : jsonObj.get("extra").getAsJsonArray()) {
|
||||
if(element.isJsonObject()) {
|
||||
JsonObject withObj = element.getAsJsonObject();
|
||||
if(withObj.has("extra")) {
|
||||
String text = "";
|
||||
for(JsonElement extra : withObj.get("extra").getAsJsonArray()) {
|
||||
if(extra.isJsonObject()) {
|
||||
JsonObject extraObj = extra.getAsJsonObject();
|
||||
if(extraObj.has("text") && extraObj.get("text").isJsonPrimitive())
|
||||
text += extraObj.get("text").getAsString();
|
||||
}
|
||||
}
|
||||
String possibleName = IBaseComponentGetter.super.getNameFromMessage(text, toReplace);
|
||||
if(possibleName != null)
|
||||
return possibleName;
|
||||
} else if(withObj.has("text")) {
|
||||
String possibleName = IBaseComponentGetter.super.getNameFromMessage(withObj.get("text").getAsString(), toReplace);
|
||||
if(possibleName != null)
|
||||
return possibleName;
|
||||
}
|
||||
} // ignoring all others because it should not appear
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String removePlaceholdersAndName(String json, String toReplace, Player foundedPlayer) {
|
||||
if(useExtra)
|
||||
return IBaseComponentGetter.super.removePlaceholdersAndName(json, toReplace, foundedPlayer);
|
||||
String tmpName = IBaseComponentGetter.super.removePlaceholdersAndName(json, toReplace, foundedPlayer);
|
||||
if(!tmpName.equals(json)) // if not the same -> name found and removed
|
||||
return tmpName;
|
||||
JsonObject jsonObj = JsonParser.parseString(json).getAsJsonObject();
|
||||
if(!jsonObj.has("extra"))
|
||||
return json;
|
||||
String searched = toReplace + foundedPlayer.getName();
|
||||
for(JsonElement element : jsonObj.get("extra").getAsJsonArray()) {
|
||||
if(element.isJsonObject()) {
|
||||
JsonObject withObj = element.getAsJsonObject();
|
||||
if(withObj.has("extra")) {
|
||||
String text = "";
|
||||
int possibleId = -1;
|
||||
JsonArray extraArray = withObj.get("extra").getAsJsonArray();
|
||||
for(int i = 0; i < extraArray.size(); i++) {
|
||||
JsonElement extra = extraArray.get(i);
|
||||
if(!extra.isJsonObject())
|
||||
continue; // prevent error but should not appear
|
||||
JsonObject extraObj = extra.getAsJsonObject();
|
||||
if(extraObj.has("text") && extraObj.get("text").isJsonPrimitive()) {
|
||||
String extraTxt = extraObj.get("text").getAsString();
|
||||
if(possibleId == -1) { // don't found the begin yet
|
||||
if(searched.startsWith(extraTxt)) { // begin of replaced
|
||||
possibleId = i;
|
||||
text = extraTxt;
|
||||
}
|
||||
} else {
|
||||
if(searched.startsWith(extraTxt, text.length()) || ChatManager.equalsSeparator(extraTxt)) {
|
||||
text += extraTxt;
|
||||
if(searched.equals(text)) { // found everything
|
||||
// change actual, then remove all old
|
||||
extraArray.set(i, JsonParser.parseString("{\"text\":\"" + Character.toString(ChatManager.SEPARATOR) + "\"}"));
|
||||
for(int x = possibleId; x < i; x++)
|
||||
extraArray.remove(possibleId); // remove elements
|
||||
ChatItem.debug("Cleaned: " + jsonObj.toString());
|
||||
return jsonObj.toString();
|
||||
}
|
||||
} else {
|
||||
possibleId = -1; // was not good things
|
||||
text = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ChatItem.debug("Failed to find: " + text + ", id: " + possibleId + " for " + withObj);
|
||||
}
|
||||
} // ignoring all others because it should not appear
|
||||
}
|
||||
ChatItem.debug("Nothing founded while trying to remove placeholders");
|
||||
return IBaseComponentGetter.super.removePlaceholdersAndName(json, toReplace, foundedPlayer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
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("ClientboundSystemChatPacket")) {
|
||||
packet.setPacket(PacketEditingChatManager.createSystemChatPacket(localJson));
|
||||
} else {
|
||||
throw new UnsupportedOperationException("The packet " + packetClass.getSimpleName() + " isn't supported 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;
|
||||
}
|
||||
}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.Chat;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketContent.ContentModifier;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import net.kyori.adventure.nbt.api.BinaryTagHolder;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.TranslatableComponent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
|
||||
public class AdventureComponentManager implements IComponentManager {
|
||||
|
||||
@Override
|
||||
public boolean hasConditions() {
|
||||
try {
|
||||
for (String cl : Arrays.asList("net.kyori.adventure.text.Component", "net.kyori.adventure.text.serializer.gson.GsonComponentSerializer"))
|
||||
Class.forName(cl);
|
||||
} catch (Throwable e) { // can't support this, adventure comp not found
|
||||
ChatItem.debug("Can't load AdventureComponentManager : " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {}
|
||||
|
||||
@Override
|
||||
public String getBaseComponentAsJSON(ChatItemPacket packet) {
|
||||
Component comp = packet.getContent().getSpecificModifier(Component.class).readSafely(0);
|
||||
if (comp == null)
|
||||
return null;
|
||||
try {
|
||||
String json = GsonComponentSerializer.gson().serialize(comp);
|
||||
JsonObject jsonObj = JsonParser.parseString(json).getAsJsonObject();
|
||||
ChatItem.debug("AdventureJSON : " + json);
|
||||
if (jsonObj.has("with")) {
|
||||
JsonObject next = new JsonObject();
|
||||
next.add("extra", jsonObj.get("with"));
|
||||
return next.toString();
|
||||
}
|
||||
return json;
|
||||
} catch (JsonParseException e) { // ignore this and just let skip this
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object manageItem(Player p, Chat chat, ChatItemPacket packet, ItemStack item, Storage c) throws Exception {
|
||||
String itemName = ChatManager.getNameOfItem(chat.getPlayer(), item, c);ChatItem.debug("NBT tag: " + PacketUtils.getNbtTag(item));;
|
||||
return manage(p, chat, packet, itemName, HoverEvent.showItem(Key.key(item.getType().getKey().getKey()), item.getAmount(), BinaryTagHolder.of(PacketUtils.getNbtTag(item))));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object manageEmpty(Player p, Chat chat, ChatItemPacket packet, Storage c) {
|
||||
Component builder = Component.text("");
|
||||
c.tooltipHand.forEach(s -> builder.append(Component.text(s)));
|
||||
Player sender = chat.getPlayer();
|
||||
String handName = c.handName.replace("{name}", sender.getName()).replace("{display-name}", sender.getDisplayName());
|
||||
return manage(p, chat, packet, handName, HoverEvent.showText(builder));
|
||||
}
|
||||
|
||||
private Object manage(Player p, Chat chat, ChatItemPacket packet, String replacement, HoverEvent<?> hover) {
|
||||
ContentModifier<Component> modifier = packet.getContent().getSpecificModifier(Component.class);
|
||||
Component comp = modifier.readSafely(0);
|
||||
if (comp == null) {
|
||||
ChatItem.debug("The component is null.");
|
||||
return null;
|
||||
}
|
||||
comp = checkComponent(comp, hover, replacement, chat);
|
||||
ChatItem.debug("Result: " + GsonComponentSerializer.gson().serialize(comp));
|
||||
try {
|
||||
packet.setPacket(PacketEditingChatManager.createSystemChatPacket(GsonComponentSerializer.gson().serialize(comp)));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return packet.getPacket();
|
||||
}
|
||||
|
||||
private Component checkComponent(Component comp, HoverEvent<?> hover, String itemName, Chat chat) {
|
||||
if (comp instanceof TextComponent) {
|
||||
TextComponent tc = (TextComponent) comp;
|
||||
if (ChatManager.containsSeparator(tc.content())) {
|
||||
ChatItem.debug("Changing text " + tc.content() + " to " + itemName);
|
||||
comp = tc.content(ChatManager.replaceSeparator(chat, tc.content(), itemName)).hoverEvent(hover);
|
||||
} else
|
||||
ChatItem.debug("No insert of text without separator: " + tc.content());
|
||||
} else if(comp instanceof TranslatableComponent) {
|
||||
TranslatableComponent tc = (TranslatableComponent) comp;
|
||||
List<Component> next = new ArrayList<>();
|
||||
for (Component extra : tc.args()) {
|
||||
next.add(checkComponent(extra, hover, itemName, chat));
|
||||
}
|
||||
comp = tc.args(next);
|
||||
} else
|
||||
ChatItem.debug("Not valid comp class " + comp.getClass().getSimpleName() + " : " + comp);
|
||||
List<Component> next = new ArrayList<>();
|
||||
for (Component extra : comp.children()) {
|
||||
next.add(checkComponent(extra, hover, itemName, chat));
|
||||
}
|
||||
return comp.children(next);
|
||||
}
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
+7
-7
@@ -1,23 +1,23 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
|
||||
public class ComponentGetter implements IBaseComponentGetter {
|
||||
public class ComponentNMSManager implements IComponentManager {
|
||||
|
||||
@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);
|
||||
Object chatBaseComp = packet.getContent().getChatComponents().readSafely(0);
|
||||
if (chatBaseComp != null) {
|
||||
try {
|
||||
return PacketUtils.CHAT_SERIALIZER.getMethod("a", PacketUtils.COMPONENT_CLASS)
|
||||
.invoke(null, packet.getPacket()).toString();
|
||||
return PacketUtils.CHAT_SERIALIZER.getMethod("a", PacketUtils.COMPONENT_CLASS).invoke(null, chatBaseComp).toString();
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
@@ -28,7 +28,7 @@ public class ComponentGetter implements IBaseComponentGetter {
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
try {
|
||||
packet.getContent().getChatComponents().write(0, PacketUtils.CHAT_SERIALIZER.getMethod("a", String.class).invoke(null, json));
|
||||
packet.setPacket(PacketEditingChatManager.createSystemChatPacket(json));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
-95
@@ -1,95 +0,0 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Method;
|
||||
import java.time.Instant;
|
||||
import java.util.Optional;
|
||||
|
||||
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.chatmanager.v1.packets.PacketContent;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
|
||||
public class IChatBaseComponentGetter implements IBaseComponentGetter {
|
||||
|
||||
private Method serializerGetJson;
|
||||
private boolean canEditVariable = true;
|
||||
|
||||
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 {
|
||||
PacketContent content = packet.getContent();
|
||||
Object chatComponent = PacketUtils.CHAT_SERIALIZER.getMethod("a", String.class).invoke(null, json);
|
||||
if (canEditVariable)
|
||||
content.getChatComponents().write(0, chatComponent);
|
||||
else {
|
||||
try {
|
||||
Class<?> packetClass = packet.getPacket().getClass();
|
||||
if (packetClass.getSimpleName().equalsIgnoreCase("ClientboundSystemChatPacket")) {
|
||||
for (Constructor<?> cons : packetClass.getConstructors()) {
|
||||
if (cons.getParameterCount() == 6) {
|
||||
Object newPacket = cons.newInstance(chatComponent, Optional.empty(),
|
||||
content.getIntegers().readSafely(0, 0),
|
||||
content.getSpecificModifier(
|
||||
PacketUtils.getNmsClass("ChatSender", "network.chat.")).read(0),
|
||||
content.getSpecificModifier(Instant.class).read(0),
|
||||
ReflectionUtils.getObject(packet.getPacket(), "f"));
|
||||
packet.setPacket(newPacket);
|
||||
}
|
||||
}
|
||||
throw new UnsupportedOperationException("Failed to find valid constructor for packet "
|
||||
+ packetClass.getSimpleName() + ". Please report this.");
|
||||
} else {
|
||||
throw new UnsupportedOperationException("The packet " + packetClass.getSimpleName()
|
||||
+ " isn't supported by the AdventureGetter. Please report this.");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
if (canEditVariable) {
|
||||
canEditVariable = false;
|
||||
writeJson(packet, json); // try again with good config
|
||||
} else
|
||||
e.printStackTrace(); // something else
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
|
||||
public class IChatBaseComponentManager implements IComponentManager {
|
||||
|
||||
private Method serializerGetJson;
|
||||
|
||||
public IChatBaseComponentManager() {
|
||||
try {
|
||||
Class<?> chatSerializer = PacketUtils.CHAT_SERIALIZER;
|
||||
//fromJson = chatSerializer.getMethod("a", String.class);
|
||||
for (Method m : chatSerializer.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: " + chatSerializer.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.setPacket(PacketEditingChatManager.createSystemChatPacket(json));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.Arrays;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.PacketContent.ContentModifier;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
|
||||
public class PCMComponentManager implements IComponentManager {
|
||||
|
||||
@Override
|
||||
public boolean hasConditions() {
|
||||
try {
|
||||
for (String cl : Arrays.asList("net.minecraft.network.chat.PlayerChatMessage"))
|
||||
Class.forName(cl);
|
||||
} catch (Exception e) { // can't support this
|
||||
ChatItem.debug("Can't load PCMComponentManager : " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBaseComponentAsJSON(ChatItemPacket packet) {
|
||||
Class<?> pcmClass = PacketUtils.getNmsClass("PlayerChatMessage", "network.chat.");
|
||||
Object pcm = packet.getContent().getSpecificModifier(pcmClass).readSafely(0);
|
||||
if (pcm != null) {
|
||||
try {
|
||||
Object chatBaseComp = ReflectionUtils.getMethod(pcmClass, PacketUtils.COMPONENT_CLASS).invoke(pcm);
|
||||
if(chatBaseComp != null)
|
||||
ChatItem.debug("[PCMManager] Founded " + chatBaseComp.getClass().getSimpleName());
|
||||
return chatBaseComp == null ? null : PacketUtils.CHAT_SERIALIZER.getMethod("a", PacketUtils.COMPONENT_CLASS).invoke(null, chatBaseComp).toString();
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
try {
|
||||
Object chatComp = PacketUtils.CHAT_SERIALIZER.getMethod("a", String.class).invoke(null, json);
|
||||
Class<?> pcmClass = PacketUtils.getNmsClass("PlayerChatMessage", "network.chat.");
|
||||
ContentModifier<Object> pcmModifier = packet.getContent().getSpecificModifier((Class<Object>) pcmClass);
|
||||
Object pcm = ReflectionUtils.getMethod(pcmClass, pcmClass, PacketUtils.COMPONENT_CLASS).invoke(pcmModifier.readSafely(0), chatComp);
|
||||
for(Constructor<?> cons : packet.getPacket().getClass().getConstructors()) {
|
||||
if(cons.getParameterCount() <= 1)
|
||||
continue;
|
||||
Object[] params = new Object[cons.getParameterCount()];
|
||||
for(int i = 0; i < params.length; i++) {
|
||||
Class<?> cls = cons.getParameterTypes()[i];
|
||||
if(cls.equals(pcmClass)) {
|
||||
params[i] = pcm;
|
||||
} else
|
||||
params[i] = packet.getContent().getSpecificModifier(cls).readSafely(0);
|
||||
}
|
||||
packet.setPacket(cons.newInstance(params));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
-44
@@ -1,44 +0,0 @@
|
||||
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.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IBaseComponentGetter;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
|
||||
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(PacketEditingChatManager.createSystemChatPacket(json));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.basecomp.hook;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
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.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.Chat;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.PacketEditingChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.IComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.packets.ChatItemPacket;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
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.TextComponent;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
|
||||
public class StringComponentManager implements IComponentManager {
|
||||
|
||||
@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();
|
||||
} else if (json == null) {
|
||||
BaseComponent[] comp = packet.getContent().getSpecificModifier(BaseComponent[].class).readSafely(0);
|
||||
if (comp != null)
|
||||
return ComponentSerializer.toString(comp);
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeJson(ChatItemPacket packet, String json) {
|
||||
try {
|
||||
packet.setPacket(PacketEditingChatManager.createSystemChatPacket(json));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object manageItem(Player p, Chat chat, ChatItemPacket packet, ItemStack item, Storage c) throws Exception {
|
||||
return manage(p, chat, packet, ChatManager.getNameOfItem(chat.getPlayer(), item, c), Utils.createItemHover(item));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object manageEmpty(Player p, Chat chat, ChatItemPacket packet, Storage c) {
|
||||
ComponentBuilder builder = new ComponentBuilder("");
|
||||
c.tooltipHand.forEach(s -> builder.append(s));
|
||||
Player sender = chat.getPlayer();
|
||||
String handName = c.handName.replace("{name}", sender.getName()).replace("{display-name}", sender.getDisplayName());
|
||||
return manage(p, chat, packet, handName, Utils.createTextHover(builder.create()));
|
||||
}
|
||||
|
||||
private Object manage(Player p, Chat chat, ChatItemPacket packet, String replacement, HoverEvent hover) {
|
||||
BaseComponent[] components = packet.getContent().getSpecificModifier(BaseComponent[].class).readSafely(0);
|
||||
if (components == null) {
|
||||
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();
|
||||
}
|
||||
ChatItem.debug("[StringComponentManager] Using JSON " + json);
|
||||
try {
|
||||
components = ComponentSerializer.parse(json);
|
||||
} catch (Exception e) {
|
||||
ChatItem.getInstance().getLogger().severe("Failed to parse JSON: " + json + ". Error:");
|
||||
e.printStackTrace();
|
||||
return packet.getPacket();
|
||||
}
|
||||
}
|
||||
ChatItem.debug("Checking for " + components.length + " components");
|
||||
Arrays.asList(components).forEach(comp -> checkComponent(comp, hover, replacement, chat));
|
||||
try {
|
||||
packet.setPacket(PacketEditingChatManager.createSystemChatPacket(ComponentSerializer.toString(components)));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return packet.getPacket();
|
||||
}
|
||||
|
||||
private void checkComponent(BaseComponent comp, HoverEvent hover, String itemName, Chat chat) {
|
||||
if (comp instanceof TextComponent) {
|
||||
TextComponent tc = (TextComponent) comp;
|
||||
if (ChatManager.containsSeparator(tc.getText())) {
|
||||
String oldText = tc.getText();
|
||||
ChatItem.debug("Changing text " + oldText + " to " + itemName + ", extra: " + (tc.getExtra() == null ? "-" : tc.getExtra().size()));
|
||||
tc.setText(ChatManager.replaceSeparator(chat, oldText, itemName));
|
||||
tc.setHoverEvent(hover);
|
||||
} else
|
||||
ChatItem.debug("No insert of text without separator: " + tc.getText() + " (legacy: " + tc.toLegacyText() + ")");
|
||||
}
|
||||
if (comp.getExtra() != null) {
|
||||
for (BaseComponent extra : comp.getExtra()) {
|
||||
checkComponent(extra, hover, itemName, chat);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+105
-59
@@ -5,6 +5,7 @@ import static me.dadus33.chatitem.utils.PacketUtils.getNmsClass;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -22,49 +23,64 @@ import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.Chat;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.Reflect;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
import me.dadus33.chatitem.utils.Version;
|
||||
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public class JSONManipulatorCurrent {
|
||||
public class JSONManipulator {
|
||||
|
||||
private static final Class<?> CRAFT_ITEM_STACK_CLASS = PacketUtils.getObcClass("inventory.CraftItemStack");
|
||||
private static final Class<?> NMS_ITEM_STACK_CLASS = getNmsClass("ItemStack", "world.item.");
|
||||
private static final Method AS_NMS_COPY = Reflect.getMethod(CRAFT_ITEM_STACK_CLASS, "asNMSCopy", ItemStack.class);
|
||||
private static final Class<?> NBT_TAG_COMPOUND = getNmsClass("NBTTagCompound", "nbt.");
|
||||
private static final Method SAVE_NMS_ITEM_STACK_METHOD = Reflect.getMethod(NMS_ITEM_STACK_CLASS, NBT_TAG_COMPOUND,
|
||||
NBT_TAG_COMPOUND);
|
||||
private static final Field MAP = Reflect.getField(NBT_TAG_COMPOUND, "map", "x");
|
||||
private static JSONManipulator instance = new JSONManipulator();
|
||||
|
||||
public static JSONManipulator getInstance() {
|
||||
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 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");
|
||||
|
||||
private static final ConcurrentHashMap<Map.Entry<Version, ItemStack>, JsonObject> STACKS = new ConcurrentHashMap<>();
|
||||
|
||||
private Version protocolVersion;
|
||||
private JsonObject itemTooltip;
|
||||
private JsonArray classicTooltip;
|
||||
|
||||
public String parse(String json, ItemStack item, String replacement, int protocol)
|
||||
throws Exception {
|
||||
public String parse(Chat chat, String json, ItemStack item, String replacement, int protocol) throws Exception {
|
||||
JsonObject obj = JsonParser.parseString(json).getAsJsonObject();
|
||||
JsonArray array = obj.has("extra") ? obj.getAsJsonArray("extra") : new JsonArray();
|
||||
final AbstractMap.SimpleEntry<Version, ItemStack> p = new AbstractMap.SimpleEntry<>(
|
||||
protocolVersion = Version.getVersion(protocol), item);
|
||||
final AbstractMap.SimpleEntry<Version, ItemStack> p = new AbstractMap.SimpleEntry<>(Version.getVersion(protocol), item);
|
||||
|
||||
JsonObject wrapper = new JsonObject(); // Create a wrapper object for the whole array
|
||||
if ((itemTooltip = STACKS.get(p)) == null) {
|
||||
JsonArray use = Translator.toJson(replacement); // We get the json representation of the old color
|
||||
// formatting method
|
||||
ChatItem.debug("Remplacement: " + replacement + " use: " + use.toString());
|
||||
// There's no public clone method for JSONObjects so we need to parse them every time
|
||||
// There's no public clone method for JSONObjects so we need to parse them every
|
||||
// time
|
||||
JsonObject hover = new JsonObject();
|
||||
hover.addProperty("action", "show_item");
|
||||
|
||||
// Get the JSON representation of the item (well, not really JSON, but rather a string representation of NBT data)
|
||||
hover.addProperty("value", stringifyItem(this, item, protocolVersion));
|
||||
// Get the JSON representation of the item (well, not really JSON, but rather a
|
||||
// string representation of NBT data)
|
||||
hover.addProperty("value", stringifyItem(item));
|
||||
|
||||
JsonObject wrapper = new JsonObject(); // Create a wrapper object for the whole array
|
||||
wrapper.addProperty("text", ""); // The text field is compulsory, even if it's empty
|
||||
wrapper.add("extra", use);
|
||||
if (use.size() == 1) {
|
||||
JsonElement extraElement = use.get(0);
|
||||
if (extraElement.isJsonPrimitive())
|
||||
wrapper.addProperty("text", extraElement.getAsString());
|
||||
else if (extraElement.isJsonObject())
|
||||
wrapper.addProperty("text", extraElement.getAsJsonObject().get("text").getAsString());
|
||||
else
|
||||
wrapper.add("extra", use); // add it only if
|
||||
} else if (!use.isEmpty())
|
||||
wrapper.add("extra", use); // add it only if
|
||||
if (!wrapper.has("text"))
|
||||
wrapper.addProperty("text", ""); // The text field is compulsory, even if it's empty
|
||||
wrapper.add("hoverEvent", hover);
|
||||
|
||||
itemTooltip = wrapper; // Save the tooltip for later use when we encounter a placeholder
|
||||
@@ -73,26 +89,29 @@ public class JSONManipulatorCurrent {
|
||||
// We remove it later when no longer needed to save memory
|
||||
Bukkit.getScheduler().runTaskLaterAsynchronously(ChatItem.getInstance(), () -> STACKS.remove(p), 100L);
|
||||
}
|
||||
|
||||
obj.add("extra", parseArray(array, itemTooltip));
|
||||
if (obj.size() == 1 && obj.has("text")) {
|
||||
itemTooltip.add("text", obj.get("text"));
|
||||
ChatItem.debug("[JsonManipulator] Parsed quick: " + obj.toString() + ", wrapper: " + itemTooltip);
|
||||
return ChatManager.replaceSeparator(chat, itemTooltip.toString(), replacement);
|
||||
}
|
||||
obj.add("extra", parseArray(obj.has("extra") ? obj.getAsJsonArray("extra") : new JsonArray(), itemTooltip));
|
||||
if (!obj.has("text")) {
|
||||
obj.addProperty("text", "");
|
||||
}
|
||||
ChatItem.debug("Parsed array for item: " + obj.toString() + ", wrapper: " + itemTooltip);
|
||||
return obj.toString();
|
||||
}
|
||||
|
||||
public String parseEmpty(String json, String repl, List<String> tooltip, Player sender) {
|
||||
JsonObject obj = JsonParser.parseString(json).getAsJsonObject();
|
||||
JsonArray array = obj.has("extra") ? obj.getAsJsonArray("extra") : new JsonArray();
|
||||
JsonArray use = Translator
|
||||
.toJson(repl.replace("{name}", sender.getName()).replace("{display-name}", sender.getDisplayName()));
|
||||
JsonArray use = Translator.toJson(repl.replace("{name}", sender.getName()).replace("{display-name}", sender.getDisplayName()));
|
||||
JsonObject hover = JsonParser.parseString("{\"action\":\"show_text\", \"value\": \"\"}").getAsJsonObject();
|
||||
|
||||
StringBuilder oneLineTooltip = new StringBuilder("");
|
||||
int index = 0;
|
||||
for (String m : tooltip) {
|
||||
oneLineTooltip
|
||||
.append(m.replace("{name}", sender.getName()).replace("{display-name}", sender.getDisplayName()));
|
||||
oneLineTooltip.append(m.replace("{name}", sender.getName()).replace("{display-name}", sender.getDisplayName()));
|
||||
++index;
|
||||
if (index != tooltip.size()) {
|
||||
oneLineTooltip.append('\n');
|
||||
@@ -114,25 +133,32 @@ public class JSONManipulatorCurrent {
|
||||
|
||||
private JsonArray parseArray(JsonArray arr, JsonElement tooltip) {
|
||||
JsonArray replacer = new JsonArray();
|
||||
boolean isComplex = false;
|
||||
for (int i = 0; i < arr.size(); ++i) {
|
||||
if (arr.get(i).isJsonNull()) {
|
||||
JsonElement element = arr.get(i);
|
||||
if (element.isJsonNull()) {
|
||||
continue;
|
||||
} else if (arr.get(i).isJsonObject()) {
|
||||
addParsedJsonObjectToArray(arr.get(i).getAsJsonObject(), replacer, tooltip);
|
||||
} else if (arr.get(i).isJsonArray()) {
|
||||
JsonArray jar = arr.get(i).getAsJsonArray();
|
||||
} else if (element.isJsonObject()) {
|
||||
isComplex = true;
|
||||
addParsedJsonObjectToArray(element.getAsJsonObject(), replacer, tooltip);
|
||||
} else if (element.isJsonArray()) {
|
||||
isComplex = true;
|
||||
JsonArray jar = element.getAsJsonArray();
|
||||
if (jar.size() != 0) {
|
||||
jar = parseArray(arr.get(i).getAsJsonArray(), tooltip);
|
||||
jar = parseArray(element.getAsJsonArray(), tooltip);
|
||||
replacer.set(i, jar);
|
||||
}
|
||||
} else if (element.isJsonPrimitive() && isComplex) {
|
||||
ChatItem.debug("[JSONManipulator] Put " + element + " to trash as it's primitive with complex things");
|
||||
// ignore
|
||||
} else {
|
||||
addParsedStringToArray(arr.get(i).getAsString(), replacer, arr.get(i), tooltip);
|
||||
addParsedStringToArray(element.getAsString(), replacer, element, tooltip);
|
||||
}
|
||||
|
||||
}
|
||||
return replacer;
|
||||
}
|
||||
|
||||
|
||||
private void addParsedJsonObjectToArray(JsonObject o, JsonArray rep, JsonElement tooltip) {
|
||||
JsonElement text = o.get("text");
|
||||
if (text == null) {
|
||||
@@ -140,7 +166,11 @@ public class JSONManipulatorCurrent {
|
||||
if (el != null) {
|
||||
JsonArray jar = el.getAsJsonArray();
|
||||
if (jar.size() != 0) {
|
||||
o.add("extra", parseArray(jar, tooltip));
|
||||
JsonArray tmpArray = parseArray(jar, tooltip);
|
||||
if (!tmpArray.isEmpty())
|
||||
o.add("extra", tmpArray);
|
||||
else
|
||||
o.remove("extra");
|
||||
} else {
|
||||
o.remove("extra");
|
||||
}
|
||||
@@ -151,8 +181,12 @@ public class JSONManipulatorCurrent {
|
||||
JsonElement el = o.get("extra");
|
||||
if (el != null) {
|
||||
JsonArray jar = el.getAsJsonArray();
|
||||
if (jar.size() != 0) {
|
||||
o.add("extra", parseArray(jar, tooltip));
|
||||
if (!jar.isEmpty()) {
|
||||
JsonArray tmpArray = parseArray(jar, tooltip);
|
||||
if (!tmpArray.isEmpty())
|
||||
o.add("extra", tmpArray);
|
||||
else
|
||||
o.remove("extra");
|
||||
} else {
|
||||
o.remove("extra");
|
||||
}
|
||||
@@ -162,42 +196,55 @@ public class JSONManipulatorCurrent {
|
||||
|
||||
addParsedStringToArray(text.getAsString(), rep, o, tooltip);
|
||||
}
|
||||
|
||||
|
||||
private void addParsedStringToArray(String msg, JsonArray rep, JsonElement o, JsonElement tooltip) {
|
||||
ChatItem.debug("Checking " + msg + " > " + rep + ", o: " + o);
|
||||
if(!ChatManager.containsSeparator(msg)) {
|
||||
if (!ChatManager.containsSeparator(msg)) {
|
||||
rep.add(o);
|
||||
return;
|
||||
}
|
||||
String current = "";
|
||||
for(String parts : msg.split("")) {
|
||||
if(ChatManager.equalsSeparator(parts)) {
|
||||
if(!current.isEmpty()) {
|
||||
boolean wasSep = false;
|
||||
for (String parts : msg.split("")) {
|
||||
if (ChatManager.equalsSeparator(parts)) {
|
||||
if (!current.isEmpty()) {
|
||||
rep.add(current);
|
||||
current = "";
|
||||
}
|
||||
rep.add(tooltip);
|
||||
wasSep = true;
|
||||
} else if (wasSep) {
|
||||
if (ChatManager.equalsSeparatorEnd(parts)) // sep finished
|
||||
wasSep = false;
|
||||
} else {
|
||||
current += parts;
|
||||
}
|
||||
}
|
||||
if(!current.isEmpty())
|
||||
if (!current.isEmpty())
|
||||
rep.add(current);
|
||||
}
|
||||
|
||||
public static String stringifyItem(ItemStack is) {
|
||||
try {
|
||||
return stringifyItemInternal(is);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return "{}";
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "deprecation" })
|
||||
public static String stringifyItem(JSONManipulatorCurrent j, ItemStack is, Version protocolVersion)
|
||||
throws Exception {
|
||||
Object nmsStack = JSONManipulatorCurrent.AS_NMS_COPY.invoke(null, is);
|
||||
Object nmsTag = JSONManipulatorCurrent.NBT_TAG_COMPOUND.newInstance();
|
||||
JSONManipulatorCurrent.SAVE_NMS_ITEM_STACK_METHOD.invoke(nmsStack, nmsTag);
|
||||
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>) JSONManipulatorCurrent.MAP.get(nmsTag);
|
||||
Map<String, Object> nmsMap = (Map<String, Object>) JSONManipulator.MAP.get(nmsTag);
|
||||
String id = nmsMap.get("id").toString().replace("\"", "");
|
||||
Object realTag = nmsMap.get("tag");
|
||||
if (JSONManipulatorCurrent.NBT_TAG_COMPOUND.isInstance(realTag)) { // We need to make sure this is indeed an
|
||||
// NBTTagCompound
|
||||
Map<String, Object> realMap = (Map<String, Object>) JSONManipulatorCurrent.MAP.get(realTag);
|
||||
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());
|
||||
@@ -207,10 +254,7 @@ public class JSONManipulatorCurrent {
|
||||
// ItemRewriter.remapIds(Version.getVersion().MAX_VER, protocolVersion.MAX_VER,
|
||||
// is);
|
||||
StringBuilder sb = new StringBuilder("{id:");
|
||||
if (protocolVersion.equals(Version.V1_7))
|
||||
sb.append(id).append(","); // Append the id
|
||||
else
|
||||
sb.append("\"").append(id).append("\"").append(","); // Append the 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
|
||||
@@ -224,11 +268,13 @@ public class JSONManipulatorCurrent {
|
||||
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(";"))
|
||||
if (entry.getKey().contains(";"))
|
||||
sb.append("\"" + entry.getKey() + "\"");
|
||||
else
|
||||
sb.append(entry.getKey());
|
||||
+20
-104
@@ -1,23 +1,20 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.listeners;
|
||||
|
||||
import static me.dadus33.chatitem.chatmanager.ChatManager.SEPARATOR;
|
||||
import static me.dadus33.chatitem.chatmanager.ChatManager.SEPARATOR_END;
|
||||
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
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.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.Chat;
|
||||
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 {
|
||||
@@ -32,23 +29,21 @@ public class ChatEventListener implements Listener {
|
||||
return this.manage.getStorage();
|
||||
}
|
||||
|
||||
@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
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onChat(AsyncPlayerChatEvent e) {
|
||||
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());
|
||||
e.setMessage(msg);
|
||||
if(ChatManager.isTestingEnabled() && !ChatManager.isTesting("packet"))
|
||||
return;
|
||||
if (ChatManager.containsSeparator(e.getMessage())) { // If the BELL character is found, we have to remove it
|
||||
e.setMessage(ChatManager.removeSeparator(e.getMessage()));
|
||||
}
|
||||
boolean found = false;
|
||||
final String oldMsg = e.getMessage();
|
||||
for (String rep : getStorage().PLACEHOLDERS)
|
||||
for (String rep : getStorage().placeholders) {
|
||||
if (oldMsg.contains(rep)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
if (!found) {
|
||||
ChatItem.debug("(v1) not found placeholders in: " + e.getMessage());
|
||||
return;
|
||||
@@ -56,101 +51,22 @@ public class ChatEventListener implements Listener {
|
||||
|
||||
Player p = e.getPlayer();
|
||||
ItemStack item = ChatManager.getUsableItem(p);
|
||||
if(!ChatManager.canShowItem(p, item, e))
|
||||
if (!ChatManager.canShowItem(p, item, e))
|
||||
return;
|
||||
String s = e.getMessage(), firstPlaceholder = getStorage().PLACEHOLDERS.get(0);
|
||||
for (String placeholder : getStorage().PLACEHOLDERS) {
|
||||
String s = e.getMessage(), firstPlaceholder = getStorage().placeholders.get(0);
|
||||
for (String placeholder : getStorage().placeholders) {
|
||||
s = s.replace(placeholder, firstPlaceholder);
|
||||
}
|
||||
if (Utils.countMatches(s, firstPlaceholder) > getStorage().LIMIT) {
|
||||
if (Utils.countMatches(s, firstPlaceholder) > getStorage().limit) {
|
||||
e.setCancelled(true);
|
||||
if (getStorage().LIMIT_MESSAGE.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
p.sendMessage(getStorage().LIMIT_MESSAGE);
|
||||
if (!getStorage().messageLimit.isEmpty())
|
||||
p.sendMessage(getStorage().messageLimit);
|
||||
return;
|
||||
}
|
||||
|
||||
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());
|
||||
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() + ", format: " + e.getFormat());
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@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
|
||||
String msg = e.getMessage().replace(Character.toString(SEPARATOR), "");
|
||||
e.setMessage(msg);
|
||||
}
|
||||
String commandString = e.getMessage().split(" ")[0].replaceAll("^/+", ""); // First part of the command, without
|
||||
// leading slashes and without
|
||||
// arguments
|
||||
Command cmd = Bukkit.getPluginCommand(commandString);
|
||||
if (cmd == null) { // not a plugin command
|
||||
if (!getStorage().ALLOWED_DEFAULT_COMMANDS.contains(commandString)) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (!getStorage().ALLOWED_PLUGIN_COMMANDS.contains(cmd)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Player p = e.getPlayer();
|
||||
boolean found = false;
|
||||
|
||||
for (String rep : getStorage().PLACEHOLDERS) {
|
||||
if (e.getMessage().contains(rep)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
return;
|
||||
}
|
||||
ItemStack item = ChatManager.getUsableItem(p);
|
||||
if(!ChatManager.canShowItem(p, item, e))
|
||||
return;
|
||||
String s = e.getMessage(), firstPlaceholder = getStorage().PLACEHOLDERS.get(0);
|
||||
for (String placeholder : getStorage().PLACEHOLDERS) {
|
||||
s = s.replace(placeholder, firstPlaceholder);
|
||||
}
|
||||
if (Utils.countMatches(s, firstPlaceholder) > getStorage().LIMIT) {
|
||||
e.setCancelled(true);
|
||||
if (getStorage().LIMIT_MESSAGE.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
p.sendMessage(getStorage().LIMIT_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
ChatItem.debug("(v1) Set placeholder: " + e.getMessage());
|
||||
try {
|
||||
StringJoiner msg = new StringJoiner(" ");
|
||||
for(String part : s.split(" ")) {
|
||||
if(part.equalsIgnoreCase(firstPlaceholder)) {
|
||||
msg.add(firstPlaceholder + Character.toString(SEPARATOR) + p.getName());
|
||||
} else {
|
||||
msg.add(part);
|
||||
}
|
||||
}
|
||||
e.setMessage(msg.toString());
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
Chat c = Chat.create(p, oldMsg);
|
||||
ChatItem.debug("(v1) Set placeholder to message " + c);
|
||||
e.setMessage(s.replace(firstPlaceholder, SEPARATOR + Integer.toString(c.getId()) + SEPARATOR_END));
|
||||
e.setFormat(e.getFormat().replace(oldMsg, e.getMessage())); // set own message for plugin that already put the message into the format
|
||||
}
|
||||
}
|
||||
+97
-121
@@ -1,8 +1,6 @@
|
||||
package me.dadus33.chatitem.chatmanager.v1.listeners;
|
||||
|
||||
import static me.dadus33.chatitem.chatmanager.ChatManager.SEPARATOR;
|
||||
import static me.dadus33.chatitem.chatmanager.ChatManager.SEPARATOR_STR;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -21,210 +19,188 @@ import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.ItemPlayer;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.Chat;
|
||||
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.basecomp.IComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.AdventureComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.ComponentNMSManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.PCMComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.basecomp.hook.StringComponentManager;
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
|
||||
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.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
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 Object lastSentPacket = null;
|
||||
private Method serializerGetJson;
|
||||
private PacketEditingChatManager manager;
|
||||
private final List<IBaseComponentGetter> baseComponentGetter = new ArrayList<>();
|
||||
private final List<IComponentManager> componentManager = new ArrayList<>();
|
||||
|
||||
public ChatPacketManager(PacketEditingChatManager manager) {
|
||||
this.manager = manager;
|
||||
try {
|
||||
for (Method m : PacketUtils.CHAT_SERIALIZER.getDeclaredMethods()) {
|
||||
if (m.getParameterCount() == 1 && m.getParameterTypes()[0].equals(PacketUtils.COMPONENT_CLASS)
|
||||
&& m.getReturnType().equals(String.class)) {
|
||||
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());
|
||||
ChatItem.getInstance().getLogger().warning("Failed to find JSON serializer in class: " + PacketUtils.CHAT_SERIALIZER.getCanonicalName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
for(IBaseComponentGetter getter : Arrays.asList(new IChatBaseComponentGetter(), new BaseComponentGetter(), new ComponentGetter(), new StringComponentGetter(), new AdventureComponentGetter())) {
|
||||
if(getter.hasConditions())
|
||||
baseComponentGetter.add(getter);
|
||||
|
||||
for (IComponentManager getter : Arrays.asList(new StringComponentManager(), new ComponentNMSManager(), new PCMComponentManager())) {
|
||||
tryRegister(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())));
|
||||
try {
|
||||
if (Class.forName("net.kyori.adventure.text.Component") != null)
|
||||
tryRegister(new AdventureComponentManager());
|
||||
} catch (Exception e) {
|
||||
}
|
||||
ChatItem.getInstance().getLogger().info("Loaded " + componentManager.size() + " getter for base components.");
|
||||
ChatItem.debug("ComponentManager: " + String.join(", ", componentManager.stream().map(IComponentManager::getClass).map(Class::getSimpleName).collect(Collectors.toList())));
|
||||
}
|
||||
|
||||
private void tryRegister(IComponentManager getter) {
|
||||
if (getter.hasConditions())
|
||||
componentManager.add(getter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSend(ChatItemPacket e) {
|
||||
if (!e.hasPlayer() || !e.getPacketType().equals(PacketType.Server.CHAT))
|
||||
return;
|
||||
if(ChatManager.isTestingEnabled() && !ChatManager.isTesting("packet"))
|
||||
return;
|
||||
if (lastSentPacket != null && lastSentPacket == e.getPacket())
|
||||
return; // prevent infinite loop
|
||||
ChatItem.debug("Checking: " + e.getPacket().getClass().getSimpleName() + " to " + e.getPlayername());
|
||||
PacketContent packet = e.getContent();
|
||||
Version version = Version.getVersion();
|
||||
String json = "{}";
|
||||
IBaseComponentGetter choosedGetter = null;
|
||||
IComponentManager choosedGetter = null;
|
||||
if (version.isNewerOrEquals(Version.V1_19)) {
|
||||
if(packet.getIntegers().readSafely(0, 0) != 1)
|
||||
/*if (packet.getIntegers().readSafely(0, 0) > 1) { // not parsed chat message type
|
||||
ChatItem.debug("Invalid int: " + packet.getIntegers().read(0));
|
||||
return;
|
||||
choosedGetter = new StringComponentGetter();
|
||||
}*/
|
||||
choosedGetter = new StringComponentManager();
|
||||
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 {
|
||||
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) {
|
||||
// only if action bar messages are supported
|
||||
if (((Enum<?>) packet.getSpecificModifier(PacketUtils.getNmsClass("ChatMessageType", "network.chat.")).read(0)).name().equals("GAME_INFO"))
|
||||
return; // It's an actionbar message, ignoring
|
||||
} else if (version.isNewerOrEquals(Version.V1_8) && packet.getBytes().readSafely(0) == (byte) 2)
|
||||
return; // It's an actionbar message, ignoring
|
||||
if (json == null || choosedGetter == null) {
|
||||
for (IComponentManager getters : componentManager) {
|
||||
String tmpJson = getters.getBaseComponentAsJSON(e);
|
||||
if(tmpJson != null) {
|
||||
if (tmpJson != null) {
|
||||
json = ChatManager.fixSeparator(tmpJson);
|
||||
choosedGetter = getters;
|
||||
break;
|
||||
if (ChatManager.containsSeparator(json))
|
||||
break; // be sure it's valid one
|
||||
} else
|
||||
ChatItem.debug("Null JSON for manager " + getters.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
if (json == null || choosedGetter == null) {
|
||||
ChatItem.debug("Can't find valid json getter or json itself");
|
||||
ChatItem.debug("String: " + packet.getStrings().getContent());
|
||||
for (Field f : e.getPacket().getClass().getDeclaredFields()) {
|
||||
f.setAccessible(true);
|
||||
try {
|
||||
ChatItem.debug(f.getName() + ": " + f.get(e.getPacket()));
|
||||
} catch (Exception exc) {
|
||||
exc.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
if(json == null)
|
||||
return; // can't find something
|
||||
String placeholder = choosedGetter.hasPlaceholders(getStorage(), json);
|
||||
if (placeholder == null) {
|
||||
ChatItem.debug("No placeholders founded in " + json);
|
||||
ChatItem.debug("String: " + packet.getStrings().getContent());
|
||||
return; // then it's just a normal message without placeholders, so we leave it alone
|
||||
}
|
||||
ChatItem.debug("Found " + placeholder + " with " + choosedGetter.getClass().getName());
|
||||
String toReplace = null;
|
||||
if (json.lastIndexOf(SEPARATOR) != -1)
|
||||
toReplace = ((Object) SEPARATOR).toString();
|
||||
if (json.lastIndexOf(SEPARATOR_STR) != -1)
|
||||
toReplace = SEPARATOR_STR;
|
||||
if (toReplace == null) { // if the message doesn't contain the BELL separator
|
||||
ChatItem.debug("Not containing bell " + json);
|
||||
if (!ChatManager.containsSeparator(json)) // if the message doesn't contain the BELL separator
|
||||
return;
|
||||
}
|
||||
toReplace = placeholder + toReplace; // add placeholder
|
||||
String name = choosedGetter.getNameFromMessage(json, toReplace);
|
||||
if (name == null) { // something went really bad, so we run away and hide (AKA the player left or is
|
||||
ChatItem.debug("Found with " + choosedGetter.getClass().getName());
|
||||
Chat chat = choosedGetter.getChat(json);
|
||||
if (chat == null) { // something went really bad, so we run away and hide (AKA the player left or is
|
||||
// on another server)
|
||||
ChatItem.debug("Name null for " + json);
|
||||
ChatItem.debug("Chat null for " + json);
|
||||
return;
|
||||
}
|
||||
Player itemPlayer = Bukkit.getPlayer(name);
|
||||
String localJson = choosedGetter.removePlaceholdersAndName(json, toReplace, itemPlayer);
|
||||
ChatItem.debug("Local json: " + localJson);
|
||||
IBaseComponentGetter fchoosedGetter = choosedGetter;
|
||||
e.setCancelled(true); // We cancel the packet as we're going to resend it anyways (ignoring listeners
|
||||
// this time)
|
||||
Player itemPlayer = chat.getPlayer();
|
||||
if (getStorage().cooldown > 0 && !itemPlayer.hasPermission("chatitem.ignore-cooldown"))
|
||||
ChatManager.applyCooldown(itemPlayer);
|
||||
IComponentManager getter = choosedGetter;
|
||||
e.setCancelled(true); // We cancel the packet as we're going to resends it anyways
|
||||
Bukkit.getScheduler().runTaskAsynchronously(ChatItem.getInstance(), () -> {
|
||||
Player p = e.getPlayer();
|
||||
if (getStorage().COOLDOWN > 0 && !itemPlayer.hasPermission("chatitem.ignore-cooldown")) {
|
||||
ChatManager.applyCooldown(itemPlayer);
|
||||
}
|
||||
String message = null;
|
||||
try {
|
||||
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 (ItemPlayer.getPlayer(p).isBuggedClient()) { // if the guy that will receive it is bugged
|
||||
String act = getStorage().buggedClientAction;
|
||||
List<String> tooltip;
|
||||
if (act.equalsIgnoreCase("tooltip"))
|
||||
tooltip = getStorage().BUGGED_CLIENTS_TOOLTIP;
|
||||
tooltip = getStorage().tooltipBuggedClient;
|
||||
else if (act.equalsIgnoreCase("item"))
|
||||
tooltip = ChatManager.getMaxLinesFromItem(p, copy);
|
||||
else if (act.equalsIgnoreCase("show_both")) {
|
||||
tooltip = ChatManager.getMaxLinesFromItem(p, copy);
|
||||
tooltip.addAll(getStorage().BUGGED_CLIENTS_TOOLTIP);
|
||||
tooltip.addAll(getStorage().tooltipBuggedClient);
|
||||
} else
|
||||
tooltip = new ArrayList<>();
|
||||
message = manager.getManipulator().parseEmpty(localJson,
|
||||
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));
|
||||
message = JSONManipulator.getInstance().parseEmpty(getter.getBaseComponentAsJSON(e), ChatManager.styleItem(p, copy, getStorage()), tooltip, chat.getPlayer());
|
||||
if(message != null) {
|
||||
getter.writeJson(e, 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());
|
||||
copy.setItemMeta(bm);
|
||||
} else {
|
||||
if (copy.getType().name().contains("SHULKER_BOX")) { // if it's shulker
|
||||
if (copy.hasItemMeta()) {
|
||||
BlockStateMeta bsm = (BlockStateMeta) copy.getItemMeta();
|
||||
if (bsm.hasBlockState()) {
|
||||
ShulkerBox sb = (ShulkerBox) bsm.getBlockState();
|
||||
for (ItemStack itemInv : sb.getInventory()) {
|
||||
stripData(itemInv);
|
||||
}
|
||||
bsm.setBlockState(sb);
|
||||
if (copy.hasItemMeta()) {
|
||||
ItemMeta meta = copy.getItemMeta();
|
||||
if (meta instanceof BookMeta) { // filtering written books
|
||||
BookMeta bm = (BookMeta) copy.getItemMeta();
|
||||
bm.setPages(Collections.emptyList());
|
||||
copy.setItemMeta(bm);
|
||||
} else if (meta instanceof BlockStateMeta && Version.getVersion().isNewerOrEquals(Version.V1_9)) { // if it's a block
|
||||
BlockStateMeta bsm = (BlockStateMeta) copy.getItemMeta();
|
||||
if (bsm.hasBlockState() && bsm.getBlockState() instanceof ShulkerBox) {
|
||||
ShulkerBox sb = (ShulkerBox) bsm.getBlockState();
|
||||
for (ItemStack itemInv : sb.getInventory()) {
|
||||
stripData(itemInv);
|
||||
}
|
||||
copy.setItemMeta(bsm);
|
||||
bsm.setBlockState(sb);
|
||||
}
|
||||
copy.setItemMeta(bsm);
|
||||
}
|
||||
}
|
||||
message = manager.getManipulator().parse(localJson, copy,
|
||||
ChatManager.styleItem(p, copy, getStorage()), ItemPlayer.getPlayer(itemPlayer).getProtocolVersion());
|
||||
lastSentPacket = getter.manageItem(p, chat, e, item, getStorage());
|
||||
} else {
|
||||
if (!getStorage().HAND_DISABLED) {
|
||||
message = manager.getManipulator().parseEmpty(localJson, getStorage().HAND_NAME, getStorage().HAND_TOOLTIP, itemPlayer);
|
||||
if (!getStorage().handDisabled) {
|
||||
lastSentPacket = getter.manageEmpty(p, chat, e, getStorage());
|
||||
}
|
||||
}
|
||||
if (lastSentPacket == null)
|
||||
ChatItem.debug("(v1) No packet to sent with manager " + getter.getClass().getName());
|
||||
else
|
||||
PacketUtils.sendPacket(p, lastSentPacket);
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
if (message != null) {
|
||||
ChatItem.debug("(v1) Writing message: " + message);
|
||||
fchoosedGetter.writeJson(e, message);
|
||||
}
|
||||
lastSentPacket = e.getPacket();
|
||||
PacketUtils.sendPacket(p, lastSentPacket);
|
||||
});
|
||||
}
|
||||
|
||||
private Object jsonToChatComponent(String json) {
|
||||
try {
|
||||
return PacketUtils.CHAT_SERIALIZER.getMethod("a", String.class).invoke(null, json);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void stripData(ItemStack i) {
|
||||
if (i == null) {
|
||||
return;
|
||||
|
||||
@@ -67,7 +67,6 @@ public class PacketContent {
|
||||
return new ContentModifier<byte[]>(obj, byte[].class);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ContentModifier<Object> getChatComponents() {
|
||||
return (ContentModifier<Object>) getSpecificModifier(PacketUtils.COMPONENT_CLASS);
|
||||
}
|
||||
@@ -77,7 +76,6 @@ public class PacketContent {
|
||||
private Object obj;
|
||||
private HashMap<Field, T> content = new HashMap<>();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ContentModifier(Object obj, Class<?> clazz) {
|
||||
this.obj = obj;
|
||||
|
||||
@@ -105,6 +103,10 @@ public class PacketContent {
|
||||
}
|
||||
}
|
||||
|
||||
public Object getObj() {
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the size of the Map of content
|
||||
*
|
||||
@@ -189,11 +191,6 @@ public class PacketContent {
|
||||
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();
|
||||
|
||||
+3
-3
@@ -26,7 +26,6 @@ public class INC2Channel extends ChannelAbstract {
|
||||
private final ChannelInboundHandler boundHandler;
|
||||
private ChannelPipeline pipeline;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public INC2Channel(CustomPacketManager customPacketManager) {
|
||||
super(customPacketManager);
|
||||
boundHandler = new ChannelInboundHandler(customPacketManager);
|
||||
@@ -87,8 +86,9 @@ public class INC2Channel extends ChannelAbstract {
|
||||
|
||||
@Override
|
||||
public Channel getChannel(Player p) throws Exception {
|
||||
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);
|
||||
Object playerConnection = getPlayerConnection(p);
|
||||
Object networkManager = ReflectionUtils.getFirstWith(playerConnection, playerConnection.getClass(), PacketUtils.getNmsClass("NetworkManager", "network."));
|
||||
return ReflectionUtils.getFirstWith(networkManager, networkManager.getClass(), Channel.class);
|
||||
}
|
||||
|
||||
private class ChannelHandlerSent extends ChannelOutboundHandlerAdapter {
|
||||
|
||||
-1
@@ -22,7 +22,6 @@ import me.dadus33.chatitem.chatmanager.v1.packets.custom.CustomPacketManager;
|
||||
import me.dadus33.chatitem.utils.PacketUtils;
|
||||
import me.dadus33.chatitem.utils.ReflectionUtils;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class INCChannel extends ChannelAbstract {
|
||||
|
||||
private final ChannelInboundHandler boundHandler;
|
||||
|
||||
-1
@@ -36,7 +36,6 @@ public class NMUChannel extends ChannelAbstract {
|
||||
Object dedicatedSrv = PacketUtils.getCraftServer();
|
||||
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", "e");
|
||||
g.forEach((channelFuture) -> {
|
||||
pipeline = channelFuture.channel().pipeline();
|
||||
|
||||
@@ -3,9 +3,13 @@ package me.dadus33.chatitem.chatmanager.v2;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@@ -16,6 +20,8 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.ItemPlayer;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.Chat;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.hook.DiscordSrvSupport;
|
||||
import me.dadus33.chatitem.playernamer.PlayerNamerManager;
|
||||
@@ -23,22 +29,17 @@ 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 static Method saveMethod;
|
||||
private static boolean shouldUseAppendMethod = false;
|
||||
|
||||
|
||||
static {
|
||||
try {
|
||||
Class<?> nbtTag = PacketUtils.getNmsClass("NBTTagCompound", "nbt.");
|
||||
@@ -60,14 +61,13 @@ public class ChatListener implements Listener {
|
||||
|
||||
}
|
||||
Logger log = ChatItem.getInstance().getLogger();
|
||||
String appendMethodMsg = shouldUseAppendMethod ? "Use ComponentBuilder's method."
|
||||
: "Use own ComponentBuilder append method.";
|
||||
String appendMethodMsg = shouldUseAppendMethod ? "Use ComponentBuilder's method." : "Use own ComponentBuilder append method.";
|
||||
if (saveMethod == null)
|
||||
log.info("Failed to find save method. Using default system. " + appendMethodMsg);
|
||||
else
|
||||
log.info("Save method founded: " + saveMethod.getName() + ". " + appendMethodMsg);
|
||||
}
|
||||
|
||||
|
||||
private ChatListenerChatManager manage;
|
||||
|
||||
public ChatListener(ChatListenerChatManager manage) {
|
||||
@@ -80,14 +80,15 @@ public class ChatListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onChat(AsyncPlayerChatEvent e) {
|
||||
if(ChatManager.isTestingEnabled() && !ChatManager.isTesting("chat"))
|
||||
return;
|
||||
Storage c = getStorage();
|
||||
if (e.isCancelled()) {
|
||||
if (ChatItem.getInstance().getChatManager().size() == 1) { // only chat
|
||||
String msg = e.getMessage().toLowerCase();
|
||||
for (String rep : c.PLACEHOLDERS) {
|
||||
for (String rep : c.placeholders) {
|
||||
if (msg.contains(rep)) {
|
||||
ChatItem.debug(
|
||||
"You choose 'chat' manager but it seems to don't be the good choice. More informations here: https://github.com/dadus33-plugins/ChatItem/wiki");
|
||||
ChatItem.debug("You choose 'chat' manager but it seems to don't be the good choice. More informations here: https://github.com/dadus33-plugins/ChatItem/wiki");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -96,16 +97,13 @@ public class ChatListener implements Listener {
|
||||
return;
|
||||
}
|
||||
Player p = e.getPlayer();
|
||||
boolean hasv1 = false;
|
||||
if(ChatManager.containsSeparator(e.getMessage())) { // fix for v1
|
||||
Chat chat = Chat.getFrom(e.getMessage());
|
||||
if(chat != null)
|
||||
e.setMessage(ChatManager.replaceSeparator(chat, e.getMessage(), c.placeholders.get(0)));
|
||||
}
|
||||
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;
|
||||
ChatItem.debug("Found v1 placeholders in v2");
|
||||
placeholder = rep;
|
||||
break;
|
||||
}
|
||||
for (String rep : c.placeholders) {
|
||||
if (e.getMessage().contains(rep)) {
|
||||
placeholder = rep;
|
||||
break;
|
||||
@@ -117,41 +115,33 @@ public class ChatListener implements Listener {
|
||||
return;
|
||||
}
|
||||
ItemStack item = ChatManager.getUsableItem(p);
|
||||
if(!ChatManager.canShowItem(p, item, e))
|
||||
if (!ChatManager.canShowItem(p, item, e))
|
||||
return;
|
||||
e.setCancelled(true);
|
||||
String format = e.getFormat();
|
||||
String msg, defMsg = e.getMessage();
|
||||
for (String rep : c.PLACEHOLDERS) {
|
||||
if (hasv1) // remove v1 char
|
||||
defMsg = defMsg.replace(rep + ChatManager.SEPARATOR + p.getName(), String.valueOf(ChatManager.SEPARATOR));
|
||||
else
|
||||
defMsg = defMsg.replace(rep, String.valueOf(ChatManager.SEPARATOR));
|
||||
for (String rep : c.placeholders) {
|
||||
defMsg = defMsg.replace(rep, Character.toString(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);
|
||||
if (Utils.countMatches(defMsg, Character.toString(ChatManager.SEPARATOR)) > getStorage().limit) {
|
||||
if (!getStorage().messageLimit.isEmpty())
|
||||
p.sendMessage(getStorage().messageLimit);
|
||||
return;
|
||||
}
|
||||
if (format.contains("%1$s") || format.contains("%2$s")) {
|
||||
msg = (format.contains("%2$s") ? String.format(format, p.getDisplayName(), defMsg)
|
||||
: String.format(format, p.getDisplayName()));
|
||||
msg = (format.contains("%2$s") ? String.format(format, p.getDisplayName(), defMsg) : String.format(format, p.getDisplayName()));
|
||||
} else {
|
||||
msg = format.replace(e.getMessage(), defMsg);
|
||||
}
|
||||
String itemName = ChatManager.getNameOfItem(p, item, c);
|
||||
String loggedMessage = msg.replace(ChatManager.SEPARATOR + "", itemName).replace("{name}", p.getName())
|
||||
.replace("{display-name}", p.getDisplayName());
|
||||
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, 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"))
|
||||
DiscordSrvSupport.sendChatMessage(p, defMsg.replace(ChatManager.SEPARATOR + "", itemName).replace("{name}", p.getName()).replace("{display-name}", p.getDisplayName()));
|
||||
Set<Player> recipients = e.getRecipients().isEmpty() ? new HashSet<>(Bukkit.getOnlinePlayers()) : e.getRecipients();
|
||||
ChatItem.debug("Msg: " + msg.replace(ChatColor.COLOR_CHAR, '&') + ", format: " + format + " to " + recipients.size() + " players");
|
||||
recipients.forEach((pl) -> showItem(pl, p, item, msg));
|
||||
if (c.cooldown > 0 && !p.hasPermission("chatitem.ignore-cooldown"))
|
||||
ChatManager.applyCooldown(p);
|
||||
}
|
||||
|
||||
@@ -159,39 +149,44 @@ public class ChatListener implements Listener {
|
||||
ComponentBuilder builder = new ComponentBuilder("");
|
||||
ChatColor color = ChatColor.WHITE;
|
||||
String colorCode = "", text = "";
|
||||
boolean waiting = false;
|
||||
boolean waiting = false, removing = false;
|
||||
for (char args : msg.toCharArray()) {
|
||||
if (args == '§') { // begin of color
|
||||
if (colorCode.isEmpty() && !text.isEmpty()) { // text before this char
|
||||
ChatItem.debug("Append " + text);
|
||||
appendToComponentBuilder(builder, new ComponentBuilder(text).color(color).create());
|
||||
ChatItem.debug("Append '" + text.replace(ChatColor.COLOR_CHAR, '&') + "' (len: " + text.length() + ")");
|
||||
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(text, color));
|
||||
text = "";
|
||||
}
|
||||
waiting = true; // waiting for color code
|
||||
} else if (waiting) { // if waiting for code and valid str
|
||||
// if it's hexademical value and with enough space for full color
|
||||
waiting = false;
|
||||
if(args == 'r' && colorCode.isEmpty()) {
|
||||
if (args == 'r' && colorCode.isEmpty()) {
|
||||
color = ChatColor.RESET;
|
||||
continue;
|
||||
} else if(args == 'x') {
|
||||
if(!colorCode.isEmpty()) {
|
||||
color = ColorManager.getColor(colorCode);
|
||||
colorCode = ""; // clean for previous things
|
||||
}
|
||||
}
|
||||
if(args == 'x' && !colorCode.isEmpty()) {
|
||||
text += ColorManager.getColorString(colorCode);
|
||||
colorCode = "x";
|
||||
} else
|
||||
colorCode += args; // a color by itself
|
||||
colorCode += args;
|
||||
} else {
|
||||
waiting = false;
|
||||
if(!colorCode.isEmpty()) {
|
||||
if(colorCode.startsWith("x") && colorCode.length() >= 7) {
|
||||
if(colorCode.length() == 7)
|
||||
if (!colorCode.isEmpty()) {
|
||||
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
|
||||
} else if (colorCode.length() == 1) // if only one color code
|
||||
color = ColorManager.getColor(colorCode);
|
||||
else
|
||||
text += ColorManager.getColorString(colorCode);
|
||||
@@ -202,63 +197,41 @@ public class ChatListener implements Listener {
|
||||
appendToComponentBuilder(builder, fixColorComponent(text, color));
|
||||
addItem(builder, to, origin, item);
|
||||
text = "";
|
||||
} else {
|
||||
if(ChatManager.containsSeparatorEnd(msg))
|
||||
removing = true;
|
||||
} else if(args == ChatManager.SEPARATOR_END) {
|
||||
removing = false;
|
||||
} else if(!removing) { // not removing content
|
||||
// basic text, not waiting for code after '§'
|
||||
text += args;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!text.isEmpty())
|
||||
appendToComponentBuilder(builder, new ComponentBuilder(text).color(color).create());
|
||||
if (!text.isEmpty())
|
||||
appendToComponentBuilder(builder, createComponent(text, color));
|
||||
to.spigot().sendMessage(builder.create());
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an {@link org.bukkit.inventory.ItemStack} to a Json string for
|
||||
* sending with {@link net.md_5.bungee.api.chat.BaseComponent}'s.
|
||||
*
|
||||
* @param itemStack the item to convert
|
||||
* @return the Json string representation of the item
|
||||
*/
|
||||
public static String convertItemStackToJson(ItemStack itemStack) {
|
||||
try {
|
||||
Class<?> nbtTag = PacketUtils.getNmsClass("NBTTagCompound", "nbt.");
|
||||
Class<?> craftItemClass = PacketUtils.getObcClass("inventory.CraftItemStack");
|
||||
Object nmsNbtTagCompoundObj = nbtTag.getConstructor().newInstance();
|
||||
if (saveMethod == null) {
|
||||
Object nmsItemStackObj = craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, itemStack);
|
||||
return nmsItemStackObj.getClass().getMethod("save", nbtTag)
|
||||
.invoke(nmsItemStackObj, nmsNbtTagCompoundObj).toString();
|
||||
} else {
|
||||
Object nmsItemStackObj = craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, itemStack);
|
||||
return saveMethod.invoke(nmsItemStackObj, nmsNbtTagCompoundObj).toString();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void addItem(ComponentBuilder builder, Player to, Player origin, ItemStack item) {
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
if (!ItemUtils.isEmpty(item)) {
|
||||
ComponentBuilder itemComponent = new ComponentBuilder(ChatManager.styleItem(to, item, c));
|
||||
String itemJson = convertItemStackToJson(item);
|
||||
ChatItem.debug("Item for " + to.getName() + " (ver: " + ItemPlayer.getPlayer(to).getVersion().name() + ") : " + itemJson);
|
||||
itemComponent.event(new HoverEvent(Action.SHOW_ITEM, new ComponentBuilder(itemJson).create()));
|
||||
ComponentBuilder itemComponent = new ComponentBuilder("");
|
||||
appendToComponentBuilder(itemComponent, fixColorComponent(ChatManager.getNameOfItem(to, item, c), ChatColor.WHITE, item));
|
||||
ChatItem.debug("Item for " + to.getName() + " (ver: " + ItemPlayer.getPlayer(to).getVersion().name() + ") : " + PacketUtils.getNbtTag(item));
|
||||
// itemComponent.event(new HoverEvent(Action.SHOW_ITEM, itemBaseComponent));
|
||||
appendToComponentBuilder(builder, itemComponent.create());
|
||||
} else {
|
||||
String handName = c.HAND_NAME;
|
||||
String handName = c.handName;
|
||||
ComponentBuilder handComp = new ComponentBuilder("");
|
||||
ComponentBuilder handTooltip = new ComponentBuilder("");
|
||||
int stay = c.HAND_TOOLTIP.size();
|
||||
for (String line : c.HAND_TOOLTIP) {
|
||||
int stay = c.tooltipHand.size();
|
||||
for (String line : c.tooltipHand) {
|
||||
stay--;
|
||||
handTooltip.append(ColorManager.fixColor(line.replace("{name}", origin.getName()).replace("{display-name}", origin.getDisplayName())));
|
||||
if (stay > 0)
|
||||
handTooltip.append("\n");
|
||||
}
|
||||
handComp.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(handTooltip.create())));
|
||||
handComp.event(Utils.createTextHover(handTooltip.create()));
|
||||
if (handName.contains("{display-name}")) {
|
||||
String[] splitted = handName.split("\\{display-name\\}");
|
||||
for (int i = 0; i < (splitted.length - 1); i++) {
|
||||
@@ -272,14 +245,12 @@ public class ChatListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void appendToComponentBuilder(ComponentBuilder builder, BaseComponent[] comps) {
|
||||
if (shouldUseAppendMethod) {
|
||||
try {
|
||||
builder.append(comps);
|
||||
} catch (Exception e) {
|
||||
ChatItem.getInstance().getLogger().severe(
|
||||
"This should NEVER append. The ComponentBuilder#append(BaseComponent[]) was found but it's NOT. Using own next time.");
|
||||
ChatItem.getInstance().getLogger().severe("This should NEVER append. The ComponentBuilder#append(BaseComponent[]) was found but it's NOT. Using own next time.");
|
||||
shouldUseAppendMethod = false;
|
||||
}
|
||||
} else {
|
||||
@@ -296,52 +267,71 @@ public class ChatListener implements Listener {
|
||||
}
|
||||
|
||||
public static BaseComponent[] fixColorComponent(String message, ChatColor color) {
|
||||
return fixColorComponent(message, color, null);
|
||||
}
|
||||
|
||||
public static BaseComponent[] fixColorComponent(String message, ChatColor color, @Nullable ItemStack item) {
|
||||
ComponentBuilder builder = new ComponentBuilder("");
|
||||
String colorCode = "", text = "";
|
||||
boolean waiting = false;
|
||||
for (char args : message.toCharArray()) {
|
||||
if (args == '§') { // begin of color
|
||||
if (colorCode.isEmpty() && !text.isEmpty()) { // text before this char
|
||||
ChatItem.debug("Append while fixing name " + text);
|
||||
appendToComponentBuilder(builder, new ComponentBuilder(text).color(color).create());
|
||||
ChatItem.debug("Append while fixing name " + (ColorManager.isHexColor(color) && builder.getParts().isEmpty() ? ColorManager.removeColorAtBegin(text) : text));
|
||||
appendToComponentBuilder(builder, createComponent(ColorManager.isHexColor(color) ? ColorManager.removeColorAtBegin(text) : text, color, item));
|
||||
text = "";
|
||||
}
|
||||
waiting = true; // waiting for color code
|
||||
} else if (waiting) { // if waiting for code and valid str
|
||||
// if it's hexademical value and with enough space for full color
|
||||
waiting = false;
|
||||
if(args == 'r' && colorCode.isEmpty()) {
|
||||
if (args == 'r' && colorCode.isEmpty()) {
|
||||
color = ChatColor.RESET;
|
||||
continue;
|
||||
}
|
||||
if(args == 'x' && !colorCode.isEmpty()) {
|
||||
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(colorCode.startsWith("x") && colorCode.length() >= 7) {
|
||||
if(colorCode.length() == 7)
|
||||
if (!colorCode.isEmpty()) {
|
||||
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
|
||||
} else if (colorCode.length() == 1) // if only one color code
|
||||
color = ColorManager.getColor(colorCode);
|
||||
else
|
||||
text += ColorManager.getColorString(colorCode);
|
||||
ChatItem.debug("Color: " + color + ", text: " + text + ", code: " + colorCode);
|
||||
colorCode = "";
|
||||
}
|
||||
// basic text, not waiting for code after '§'
|
||||
text += args;
|
||||
}
|
||||
}
|
||||
if(!text.isEmpty())
|
||||
appendToComponentBuilder(builder, new ComponentBuilder(text).color(color).create());
|
||||
if (!text.isEmpty()) {
|
||||
appendToComponentBuilder(builder, createComponent(text, color, item));
|
||||
}
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
private static BaseComponent[] createComponent(String text, ChatColor color) {
|
||||
return createComponent(text, color, null);
|
||||
}
|
||||
|
||||
private static BaseComponent[] createComponent(String text, ChatColor color, ItemStack item) {
|
||||
ComponentBuilder littleBuilder = new ComponentBuilder(text);
|
||||
if(color != null && color != ChatColor.RESET) // don't add reset thing
|
||||
littleBuilder.color(color);
|
||||
if (item != null) // add to all possible sub parts
|
||||
littleBuilder.event(Utils.createItemHover(item));
|
||||
return littleBuilder.create();
|
||||
}
|
||||
}
|
||||
@@ -4,8 +4,8 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class ChatListenerChatManager extends ChatManager {
|
||||
|
||||
|
||||
@@ -16,19 +16,19 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.chatmanager.v2.ChatListener;
|
||||
import me.dadus33.chatitem.listeners.InventoryListener;
|
||||
import me.dadus33.chatitem.utils.Messages;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
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 {
|
||||
|
||||
private static final List<String> orders = Arrays.asList("packet", "chat", "both");
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
@@ -38,29 +38,29 @@ public class ChatItemCommand implements CommandExecutor, TabExecutor {
|
||||
Player p = (Player) sender;
|
||||
if (args.length == 0) {
|
||||
Messages.sendMessage(p, "chatitem-cmd.help");
|
||||
} else if (args[0].equalsIgnoreCase("admin")) {
|
||||
} else if (args[0].equalsIgnoreCase("admin") && p.hasPermission("chatitem.reload")) {
|
||||
InventoryListener.open(p);
|
||||
} else if (args[0].equalsIgnoreCase("reload")) {
|
||||
} else if (args[0].equalsIgnoreCase("reload") && p.hasPermission("chatitem.reload")) {
|
||||
ChatItem.reload(sender);
|
||||
} else if (args[0].equalsIgnoreCase("show")) {
|
||||
Player cible = args.length == 1 ? p : Bukkit.getPlayer(args[1]);
|
||||
if(cible == null) {
|
||||
p.sendMessage(ChatColor.RED + "The player " + args[1] + " can't be found.");
|
||||
Messages.sendMessage(p, "player-not-found", "%arg%", args[1]);
|
||||
return false;
|
||||
}
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
ItemStack item = ChatManager.getUsableItem(cible);
|
||||
ChatListener.showItem(p, cible, item, c.COMMAND_FORMAT.replace("%name%", cible.getName()).replace("%item%", ChatManager.SEPARATOR + ""));
|
||||
ChatListener.showItem(p, cible, item, c.commandFormat.replace("%name%", cible.getName()).replace("%item%", ChatManager.SEPARATOR + ""));
|
||||
} else if (args[0].equalsIgnoreCase("broadcast")) {
|
||||
Player cible = args.length == 1 ? p : Bukkit.getPlayer(args[1]);
|
||||
if(cible == null) {
|
||||
p.sendMessage(ChatColor.RED + "The player " + args[1] + " can't be found.");
|
||||
Messages.sendMessage(p, "player-not-found", "%arg%", args[1]);
|
||||
return false;
|
||||
}
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
ItemStack item = ChatManager.getUsableItem(cible);
|
||||
for(Player all : Bukkit.getOnlinePlayers())
|
||||
ChatListener.showItem(all, cible, item, c.COMMAND_FORMAT.replace("%name%", cible.getName()).replace("%item%", ChatManager.SEPARATOR + ""));
|
||||
ChatListener.showItem(all, cible, item, c.commandFormat.replace("%name%", cible.getName()).replace("%item%", ChatManager.SEPARATOR + ""));
|
||||
} else if (args[0].equalsIgnoreCase("link") || args[0].equalsIgnoreCase("links")) {
|
||||
ConfigurationSection config = ChatItem.getInstance().getConfig()
|
||||
.getConfigurationSection("messages.chatitem-cmd.links");
|
||||
@@ -70,27 +70,81 @@ public class ChatItemCommand implements CommandExecutor, TabExecutor {
|
||||
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())));
|
||||
linkComp.setHoverEvent(Utils.createTextHover(hover));
|
||||
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 if (args[0].equalsIgnoreCase("select")) {
|
||||
if(args.length == 1) {
|
||||
p.sendMessage(ChatColor.GRAY + "----------" + ChatColor.GOLD + " ChatItem - Setup " + ChatColor.GRAY + "----------");
|
||||
p.sendMessage(ChatColor.AQUA + "Welcome in the help of setup." + ChatColor.YELLOW + " Please follow step by simply answer to test.");
|
||||
sendCheckSelectMessage(p, orders.get(0));
|
||||
} else {
|
||||
String tested = args[1];
|
||||
if(!orders.contains(tested)) {
|
||||
p.sendMessage(ChatColor.RED + "Unknow test for " + tested + ".");
|
||||
return false;
|
||||
}
|
||||
if(args.length == 2) {
|
||||
p.sendMessage(ChatColor.RED + "Can't find if it works");
|
||||
return false;
|
||||
}
|
||||
if(args[2].equalsIgnoreCase("yes")) {
|
||||
ChatManager.setTesting(null);
|
||||
InventoryListener.setInConfig("manager", tested);
|
||||
p.sendMessage(ChatColor.GREEN + "Perfect ! Updating config ...");
|
||||
ChatItem.reload(p);
|
||||
} else if(args[2].equalsIgnoreCase("no")) {
|
||||
int index = orders.indexOf(tested);
|
||||
if(orders.size() == (index + 1)) {
|
||||
p.sendMessage(ChatColor.RED + "Sad. Sorry but nothing is available. I suggest you to come on discord for more help. Do '/chatitem link' for all links.");
|
||||
ChatManager.setTesting(null);
|
||||
} else {
|
||||
p.sendMessage(ChatColor.RED + "Sad. Checking for next manager ...");
|
||||
sendCheckSelectMessage(p, orders.get(index + 1));
|
||||
}
|
||||
} else {
|
||||
p.sendMessage(ChatColor.RED + "Can't find if it works");
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
Messages.sendMessage(p, "chatitem-cmd.help");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void sendCheckSelectMessage(Player p, String testing) {
|
||||
ChatManager.setTesting(testing);
|
||||
p.chat("Checking for " + testing + ": [i]");
|
||||
|
||||
Bukkit.getScheduler().runTaskLater(ChatItem.getInstance(), () -> {
|
||||
TextComponent text = new TextComponent(ChatColor.GOLD + "Did it worked fine? ");
|
||||
TextComponent agree = new TextComponent(ChatColor.GREEN + "Yes");
|
||||
agree.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/chatitem select " + testing + " yes"));
|
||||
agree.setHoverEvent(Utils.createTextHover(ChatColor.GRAY + "Click to say it worked fine"));
|
||||
text.addExtra(agree);
|
||||
text.addExtra(" ");
|
||||
TextComponent decline = new TextComponent(ChatColor.RED + "No");
|
||||
decline.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/chatitem select " + testing + " no"));
|
||||
decline.setHoverEvent(Utils.createTextHover(ChatColor.GRAY + "Click to say it's not working as expected"));
|
||||
text.addExtra(decline);
|
||||
p.spigot().sendMessage(text);
|
||||
}, 2);
|
||||
}
|
||||
|
||||
@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", "link", "show", "broadcast"))
|
||||
if (prefix.isEmpty() || s.startsWith(prefix))
|
||||
list.add(s);
|
||||
return list.isEmpty() ? null : list;
|
||||
if(arg.length <= 2) {
|
||||
for (String s : Arrays.asList("help", "admin", "reload", "link", "show", "broadcast", "select"))
|
||||
if (prefix.isEmpty() || s.startsWith(prefix))
|
||||
list.add(s);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
package me.dadus33.chatitem.filters;
|
||||
|
||||
import static org.apache.logging.log4j.core.Filter.Result.NEUTRAL;
|
||||
|
||||
import org.apache.logging.log4j.Level;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Marker;
|
||||
import org.apache.logging.log4j.core.Filter;
|
||||
import org.apache.logging.log4j.core.LogEvent;
|
||||
import org.apache.logging.log4j.core.Logger;
|
||||
import org.apache.logging.log4j.message.Message;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class Log4jFilter implements Filter {
|
||||
|
||||
private Storage c;
|
||||
|
||||
public Log4jFilter(Storage st) {
|
||||
c = st;
|
||||
((Logger) LogManager.getRootLogger()).addFilter(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result getOnMismatch() {
|
||||
return NEUTRAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result getOnMatch() {
|
||||
return NEUTRAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result filter(Logger logger, Level level, Marker marker, String s, Object... objects) {
|
||||
return checkMessage(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result filter(Logger logger, Level level, Marker marker, Object o, Throwable throwable) {
|
||||
return checkMessage(((Message) o).getFormattedMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result filter(Logger logger, Level level, Marker marker, Message message, Throwable throwable) {
|
||||
return checkMessage(message.getFormattedMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result filter(LogEvent logEvent) {
|
||||
return checkMessage(logEvent.getMessage().getFormattedMessage());
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
// seems to be required
|
||||
}
|
||||
|
||||
private Result checkMessage(String msg) {
|
||||
if (msg == null) {
|
||||
return Result.NEUTRAL;
|
||||
}
|
||||
for (String placeholder : c.PLACEHOLDERS) {
|
||||
if (msg.contains(placeholder)) {
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
if (msg.contains(ChatManager.SEPARATOR + p.getName())) {
|
||||
return Result.DENY;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return Result.NEUTRAL;
|
||||
}
|
||||
|
||||
public void setStorage(Storage nst) {
|
||||
this.c = nst;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package me.dadus33.chatitem.hook;
|
||||
|
||||
import org.mineacademy.chatcontrol.settings.Settings;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
|
||||
public class ChatControlSupport {
|
||||
|
||||
public static void init(ChatItem pl) {
|
||||
Settings.Chat.Grammar.CAPITALIZE = false;
|
||||
Settings.Chat.Grammar.INSERT_DOT = false;
|
||||
|
||||
pl.getLogger().info("Loaded ChatControl support by disabling 2 options in 'Chat.Grammar' config.");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package me.dadus33.chatitem.hook;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.h1dd3nxn1nja.chatmanager.Main;
|
||||
|
||||
public class ChatManagerSupport {
|
||||
|
||||
public static void init(ChatItem pl) {
|
||||
List<String> whitelist = Main.settings.getConfig().getStringList("Anti_Unicode.Whitelist");
|
||||
whitelist.add(ChatManager.SEPARATOR_STR);
|
||||
whitelist.add(ChatManager.SEPARATOR_END_STR);
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import github.scarsz.discordsrv.DiscordSRV;
|
||||
|
||||
public class DiscordSrvSupport {
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static void sendChatMessage(Player p, String message) {
|
||||
DiscordSRV pl = DiscordSRV.getPlugin();
|
||||
if (DiscordSRV.config().getBooleanElse("UseModernPaperChatEvent", false) && pl.isModernChatEventAvailable()) {
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
package me.dadus33.chatitem.hook.ecoenchants;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
|
||||
public class EcoEnchantsSupport {
|
||||
|
||||
private static int supportedVersion = 0;
|
||||
|
||||
public static boolean hasSupport() {
|
||||
return supportedVersion > 0;
|
||||
}
|
||||
|
||||
public static boolean load() {
|
||||
String ver = Bukkit.getPluginManager().getPlugin("EcoEnchants").getDescription().getVersion();
|
||||
if(ver.startsWith("8."))
|
||||
supportedVersion = 8;
|
||||
else if(ver.startsWith("10."))
|
||||
supportedVersion = 10;
|
||||
else {
|
||||
ChatItem.getInstance().getLogger().info("Failed to find support version for EcoEnchants " + ver);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static ItemStack manageItem(ItemStack item) {
|
||||
if(supportedVersion == 8) {
|
||||
List<String> addLore = EcoEnchantsV8Support.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);
|
||||
ChatItem.debug("Added " + addLore.size() + " lores from EcoEnchants");
|
||||
} else
|
||||
ChatItem.debug("No lore to add from EcoEnchants");
|
||||
} else if(supportedVersion == 10) {
|
||||
EcoEnchantsV10Support.display(item);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package me.dadus33.chatitem.hook.ecoenchants;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import com.willfp.eco.core.display.DisplayProperties;
|
||||
import com.willfp.ecoenchants.EcoEnchantsPlugin;
|
||||
import com.willfp.ecoenchants.display.EnchantDisplay;
|
||||
|
||||
public class EcoEnchantsV10Support {
|
||||
|
||||
private static EnchantDisplay enchantDisplay;
|
||||
|
||||
public static EnchantDisplay getEnchantDisplay() {
|
||||
if (enchantDisplay == null) {
|
||||
try {
|
||||
enchantDisplay = EnchantDisplay.class.getConstructor(EcoEnchantsPlugin.class).newInstance(EcoEnchantsPlugin.getInstance());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return enchantDisplay;
|
||||
}
|
||||
|
||||
public static void display(ItemStack item) {
|
||||
try {
|
||||
DisplayProperties display = DisplayProperties.class.getDeclaredConstructor(boolean.class, boolean.class, ItemStack.class).newInstance(false, false, item);
|
||||
getEnchantDisplay().display(item, (Player) null, display, new Object[] { false });
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+4
-4
@@ -1,4 +1,4 @@
|
||||
package me.dadus33.chatitem.hook;
|
||||
package me.dadus33.chatitem.hook.ecoenchants;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -8,7 +8,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
import com.willfp.ecoenchants.display.EnchantmentCache;
|
||||
import com.willfp.ecoenchants.enchantments.util.EnchantChecks;
|
||||
|
||||
public class EcoEnchantsSupport {
|
||||
public class EcoEnchantsV8Support {
|
||||
|
||||
public static List<String> getLores(ItemStack item) {
|
||||
List<String> lores = new ArrayList<>();
|
||||
@@ -17,5 +17,5 @@ public class EcoEnchantsSupport {
|
||||
});
|
||||
return lores;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import java.util.stream.Collectors;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
|
||||
public interface INamer {
|
||||
|
||||
|
||||
@@ -11,12 +11,12 @@ import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.itemnamer.INamer.Priority;
|
||||
import me.dadus33.chatitem.itemnamer.hook.ChatItemTranslationNamer;
|
||||
import me.dadus33.chatitem.itemnamer.hook.DefaultNamer;
|
||||
import me.dadus33.chatitem.itemnamer.hook.ItemDisplayNamer;
|
||||
import me.dadus33.chatitem.itemnamer.hook.LangUtilsNamer;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class NamerManager {
|
||||
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
package me.dadus33.chatitem.itemnamer.hook;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.Translation;
|
||||
import me.dadus33.chatitem.itemnamer.INamer;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class ChatItemTranslationNamer implements INamer {
|
||||
|
||||
@@ -17,13 +16,7 @@ public class ChatItemTranslationNamer implements INamer {
|
||||
|
||||
@Override
|
||||
public String getName(Player p, ItemStack item, Storage storage) {
|
||||
HashMap<Short, String> translationSection = storage.TRANSLATIONS.get(item.getType().name());
|
||||
if (translationSection != null) {
|
||||
@SuppressWarnings("deprecation")
|
||||
String translated = translationSection.get(item.getDurability());
|
||||
return translated;
|
||||
}
|
||||
return null;
|
||||
return Translation.get(item);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,8 +5,8 @@ import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.itemnamer.INamer;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class DefaultNamer implements INamer {
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.itemnamer.INamer;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class ItemDisplayNamer implements INamer {
|
||||
|
||||
@@ -18,7 +18,7 @@ public class ItemDisplayNamer implements INamer {
|
||||
public String getName(Player p, ItemStack item, Storage storage) {
|
||||
if(item.hasItemMeta() && item.getItemMeta().hasDisplayName()) {
|
||||
String name = item.getItemMeta().getDisplayName();
|
||||
return storage.COLOR_IF_ALREADY_COLORED ? ChatColor.stripColor(name) : name;
|
||||
return storage.colorIfColored ? ChatColor.stripColor(name) : name;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import com.meowj.langutils.lang.LanguageHelper;
|
||||
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.itemnamer.INamer;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class LangUtilsNamer implements INamer {
|
||||
|
||||
|
||||
@@ -15,16 +15,18 @@ import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
import me.dadus33.chatitem.Translation;
|
||||
import me.dadus33.chatitem.listeners.holder.AdminHolder;
|
||||
import me.dadus33.chatitem.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.Messages;
|
||||
import me.dadus33.chatitem.utils.Storage;
|
||||
|
||||
public class InventoryListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onClick(InventoryClickEvent e) {
|
||||
if(e.getClickedInventory() == null || !(e.getWhoClicked() instanceof Player) || e.getCurrentItem() == null
|
||||
|| !(e.getClickedInventory().getHolder() instanceof ChatItemAdminHolder))
|
||||
|| !(e.getClickedInventory().getHolder() instanceof AdminHolder))
|
||||
return;
|
||||
e.setCancelled(true);
|
||||
Player p = (Player) e.getWhoClicked();
|
||||
@@ -33,8 +35,10 @@ public class InventoryListener implements Listener {
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
if(type.equals(ItemUtils.MATERIAL_CLOSE)) {
|
||||
p.closeInventory();
|
||||
} else if(type.equals(Material.BOOK)) {
|
||||
TranslationInventoryListener.open(p, 0);
|
||||
} else if(type.equals(Material.PAPER)) {
|
||||
ChatItemAdminHolder holder = (ChatItemAdminHolder) e.getClickedInventory().getHolder();
|
||||
AdminHolder holder = (AdminHolder) e.getClickedInventory().getHolder();
|
||||
String key = holder.keyBySlot.get(e.getSlot());
|
||||
if(key != null) {
|
||||
setInConfig("manager", key);
|
||||
@@ -42,42 +46,45 @@ public class InventoryListener implements Listener {
|
||||
ChatItem.reload(p);
|
||||
}
|
||||
} else if(type.equals(ItemUtils.INK_SAC)) {
|
||||
setInConfig("general.color-if-already-colored", c.COLOR_IF_ALREADY_COLORED = !c.COLOR_IF_ALREADY_COLORED);
|
||||
setInConfig("general.color-if-already-colored", c.colorIfColored = !c.colorIfColored);
|
||||
open(p);
|
||||
} else if(type.equals(Material.REDSTONE)) {
|
||||
setInConfig("general.deny-if-no-item", c.DENY_IF_NO_ITEM = !c.DENY_IF_NO_ITEM);
|
||||
setInConfig("general.deny-if-no-item", c.denyIfNoItem = !c.denyIfNoItem);
|
||||
open(p);
|
||||
} else if(type.equals(Material.STICK)) {
|
||||
setInConfig("general.hand.disabled", c.HAND_DISABLED = !c.HAND_DISABLED);
|
||||
setInConfig("general.hand.disabled", c.handDisabled = !c.handDisabled);
|
||||
open(p);
|
||||
} else if(type.equals(Material.BLAZE_ROD)) {
|
||||
setInConfig("general.check-update", c.checkUpdate = !c.checkUpdate);
|
||||
open(p);
|
||||
} else if(type.equals(ItemUtils.FIREWORK_CHARGE)) {
|
||||
setInConfig("debug", c.DEBUG = !c.DEBUG);
|
||||
setInConfig("debug", c.debug = !c.debug);
|
||||
open(p);
|
||||
} else if(type.equals(Material.IRON_DOOR)) {
|
||||
if(e.getClick().equals(ClickType.RIGHT))
|
||||
c.LIMIT--;
|
||||
c.limit--;
|
||||
else if(e.getClick().equals(ClickType.LEFT))
|
||||
c.LIMIT++;
|
||||
setInConfig("general.limit-per-message", c.LIMIT);
|
||||
c.limit++;
|
||||
setInConfig("general.limit-per-message", c.limit);
|
||||
open(p);
|
||||
} else if(type.equals(Material.APPLE)) {
|
||||
if(e.getClick().equals(ClickType.RIGHT))
|
||||
c.COOLDOWN--;
|
||||
c.cooldown--;
|
||||
else if(e.getClick().equals(ClickType.LEFT))
|
||||
c.COOLDOWN++;
|
||||
setInConfig("general.cooldown", c.COOLDOWN);
|
||||
c.cooldown++;
|
||||
setInConfig("general.cooldown", c.cooldown);
|
||||
open(p);
|
||||
}
|
||||
}
|
||||
|
||||
private void setInConfig(String key, Object val) {
|
||||
public static void setInConfig(String key, Object val) {
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
pl.getConfig().set(key, val);
|
||||
pl.saveConfig();
|
||||
}
|
||||
|
||||
public static void open(Player p) {
|
||||
ChatItemAdminHolder holder = new ChatItemAdminHolder();
|
||||
AdminHolder holder = new AdminHolder();
|
||||
Storage c = ChatItem.getInstance().getStorage();
|
||||
Inventory inv = Bukkit.createInventory(holder, 27, Messages.getMessage("admin-inv.name"));
|
||||
for(int i = 0; i < inv.getSize(); i ++)
|
||||
@@ -88,15 +95,18 @@ public class InventoryListener implements Listener {
|
||||
holder.keyBySlot.put(slot, manager);
|
||||
inv.setItem(slot++, getManagerItem(manager));
|
||||
}
|
||||
inv.setItem(slot + 1, getManagerItem("actual", "%manager%", Messages.getMessage("admin-inv.manager." + c.MANAGER + ".name")));
|
||||
inv.setItem(slot + 1, getManagerItem("actual", "%manager%", Messages.getMessage("admin-inv.manager." + c.manager + ".name")));
|
||||
|
||||
inv.setItem(8, getBoolChangeItem(ItemUtils.FIREWORK_CHARGE, "debug", c.DEBUG));
|
||||
inv.setItem(8, getBoolChangeItem(ItemUtils.FIREWORK_CHARGE, "debug", c.debug));
|
||||
|
||||
inv.setItem(18, getBoolChangeItem(ItemUtils.INK_SAC, "color-if-already-colored", c.COLOR_IF_ALREADY_COLORED));
|
||||
inv.setItem(19, getBoolChangeItem(Material.REDSTONE, "deny-no-item", c.DENY_IF_NO_ITEM));
|
||||
inv.setItem(20, getBoolChangeItem(Material.STICK, "hand-disabled", c.HAND_DISABLED));
|
||||
inv.setItem(21, getAmountChangeItem(Material.IRON_DOOR, "limit-per-message", c.LIMIT));
|
||||
inv.setItem(22, getAmountChangeItem(Material.APPLE, "cooldown", c.COOLDOWN));
|
||||
inv.setItem(18, getBoolChangeItem(ItemUtils.INK_SAC, "color-if-already-colored", c.colorIfColored));
|
||||
inv.setItem(19, getBoolChangeItem(Material.REDSTONE, "deny-no-item", c.denyIfNoItem));
|
||||
inv.setItem(20, getBoolChangeItem(Material.STICK, "hand-disabled", c.handDisabled));
|
||||
inv.setItem(21, getAmountChangeItem(Material.IRON_DOOR, "limit-per-message", c.limit));
|
||||
inv.setItem(22, getAmountChangeItem(Material.APPLE, "cooldown", c.cooldown));
|
||||
inv.setItem(23, getBoolChangeItem(Material.BLAZE_ROD, "check-update", c.checkUpdate));
|
||||
inv.setItem(24, createItem(Material.BOOK, Messages.getMessage("admin-inv.language.name"),
|
||||
Messages.getMessage("admin-inv.language.lore", "%name%", Translation.getMessages().get("language.name").getAsString())));
|
||||
|
||||
inv.setItem(26, createItem(ItemUtils.MATERIAL_CLOSE, Messages.getMessage("admin-inv.close")));
|
||||
p.openInventory(inv);
|
||||
|
||||
@@ -8,11 +8,9 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.ChatManager;
|
||||
import me.dadus33.chatitem.utils.Utils;
|
||||
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 {
|
||||
|
||||
@@ -23,8 +21,8 @@ public class JoinListener implements Listener {
|
||||
return;
|
||||
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 Text(new ComponentBuilder(pl.getStorage().JOIN_UPDATE_HOVER).create())));
|
||||
TextComponent text = new TextComponent(pl.getStorage().updateMessage);
|
||||
text.setHoverEvent(Utils.createTextHover(pl.getStorage().updateHover));
|
||||
text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.spigotmc.org/resources/19064/"));
|
||||
p.spigot().sendMessage(text);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
package me.dadus33.chatitem.listeners;
|
||||
|
||||
import static me.dadus33.chatitem.utils.ItemUtils.createItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Translation;
|
||||
import me.dadus33.chatitem.listeners.holder.TranslationHolder;
|
||||
import me.dadus33.chatitem.utils.ItemUtils;
|
||||
import me.dadus33.chatitem.utils.Messages;
|
||||
|
||||
public class TranslationInventoryListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onClick(InventoryClickEvent e) {
|
||||
if(e.getClickedInventory() == null || !(e.getWhoClicked() instanceof Player) || e.getCurrentItem() == null
|
||||
|| !(e.getClickedInventory().getHolder() instanceof TranslationHolder))
|
||||
return;
|
||||
e.setCancelled(true);
|
||||
Player p = (Player) e.getWhoClicked();
|
||||
ItemStack item = e.getCurrentItem();
|
||||
Material type = item.getType();
|
||||
TranslationHolder holder = (TranslationHolder) e.getClickedInventory().getHolder();
|
||||
if(type.equals(Material.ARROW)) {
|
||||
if(e.getSlot() == 0)
|
||||
InventoryListener.open(p);
|
||||
else if(e.getSlot() == 3)
|
||||
open(p, holder.getPage() - 1);
|
||||
else if(e.getSlot() == 5)
|
||||
open(p, holder.getPage() + 1);
|
||||
} else if(type.equals(ItemUtils.MATERIAL_CLOSE))
|
||||
p.closeInventory();
|
||||
else if(type.equals(Material.PAPER)) {
|
||||
String lang = holder.langBySlot.get(e.getSlot());
|
||||
if(lang == null)
|
||||
return;
|
||||
p.closeInventory();
|
||||
ChatItem pl = ChatItem.getInstance();
|
||||
pl.getStorage().language = lang;
|
||||
pl.getConfig().set("general.language", lang);
|
||||
pl.saveConfig();
|
||||
Translation.loadLang(lang);
|
||||
p.sendMessage(ChatColor.GREEN + "Language changed to " + Translation.getMessages().get("language.name").getAsString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void open(Player p, int page) {
|
||||
int perPage = 45;
|
||||
List<String> langs = new ArrayList<>(Translation.getAllLangs().keySet());
|
||||
TranslationHolder holder = new TranslationHolder(page);
|
||||
Inventory inv = Bukkit.createInventory(holder, 54, "Change language - " + ChatColor.GOLD + " Page " + (page + 1) + " / " + ((langs.size() / perPage) + 1));
|
||||
for(int i = 0; i < 9; i ++)
|
||||
inv.setItem(i, new ItemStack(ItemUtils.GRAY_STAINED_GLASS_PANE));
|
||||
inv.setItem(0, createItem(Material.ARROW, ChatColor.GRAY + "Back"));
|
||||
|
||||
if(page > 0)
|
||||
inv.setItem(3, createItem(Material.ARROW, ChatColor.RED + "Previous page"));
|
||||
if(langs.size() > (perPage * (page + 1)))
|
||||
inv.setItem(5, createItem(Material.ARROW, ChatColor.GREEN + "Next page"));
|
||||
|
||||
inv.setItem(8, createItem(ItemUtils.MATERIAL_CLOSE, Messages.getMessage("admin-inv.close")));
|
||||
|
||||
int slot = 9;
|
||||
for(int i = (page * perPage); i < langs.size() && (i < ((page + 1) * perPage)); i++) {
|
||||
String lang = langs.get(i);
|
||||
holder.langBySlot.put(slot, lang);
|
||||
ItemStack item = createItem(Material.PAPER, ChatColor.GOLD + Translation.getAllLangs().get(lang), ChatColor.GRAY + "Clic to select this language");
|
||||
if(lang.equalsIgnoreCase(ChatItem.getInstance().getStorage().language)) {
|
||||
item.addUnsafeEnchantment(Enchantment.DURABILITY, 1);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
inv.setItem(slot++, item);
|
||||
}
|
||||
|
||||
p.openInventory(inv);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,11 +1,11 @@
|
||||
package me.dadus33.chatitem.listeners;
|
||||
package me.dadus33.chatitem.listeners.holder;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
public class ChatItemAdminHolder implements InventoryHolder {
|
||||
public class AdminHolder implements InventoryHolder {
|
||||
|
||||
public final HashMap<Integer, String> keyBySlot = new HashMap<>();
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package me.dadus33.chatitem.listeners.holder;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
public class TranslationHolder implements InventoryHolder {
|
||||
|
||||
public final HashMap<Integer, String> langBySlot = new HashMap<>();
|
||||
private final int page;
|
||||
|
||||
public TranslationHolder(int page) {
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
public int getPage() {
|
||||
return page;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Inventory getInventory() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
package me.dadus33.chatitem.playernamer;
|
||||
|
||||
import me.dadus33.chatitem.playernamer.hook.HexNicksV3PlayerNamer;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.playernamer.hook.DefaultPlayerNamer;
|
||||
import me.dadus33.chatitem.playernamer.hook.HexNicksPlayerNamer;
|
||||
import me.dadus33.chatitem.playernamer.hook.HexNicksV2PlayerNamer;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class PlayerNamerManager {
|
||||
|
||||
@@ -17,11 +19,24 @@ public class PlayerNamerManager {
|
||||
}
|
||||
|
||||
public static void load(ChatItem pl) {
|
||||
if(Bukkit.getPluginManager().getPlugin("HexNicks") != null) {
|
||||
setPlayerNamer(new HexNicksPlayerNamer());
|
||||
pl.getLogger().info("Enable support for HexNicks plugin !");
|
||||
} else {
|
||||
setPlayerNamer(new DefaultPlayerNamer());
|
||||
Plugin plugin = Bukkit.getPluginManager().getPlugin("HexNicks");
|
||||
|
||||
|
||||
if (plugin != null) {
|
||||
char majorVersion = plugin.getDescription().getVersion().charAt(0);
|
||||
|
||||
if (majorVersion == '3')
|
||||
setPlayerNamer(new HexNicksV3PlayerNamer());
|
||||
else
|
||||
setPlayerNamer(new HexNicksV2PlayerNamer());
|
||||
|
||||
pl.getLogger().info("Enable support for HexNicks plugin v" + majorVersion);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
setPlayerNamer(new DefaultPlayerNamer());
|
||||
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -7,7 +7,7 @@ import me.dadus33.chatitem.playernamer.IPlayerNamer;
|
||||
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
|
||||
public class HexNicksPlayerNamer implements IPlayerNamer {
|
||||
public class HexNicksV2PlayerNamer implements IPlayerNamer {
|
||||
|
||||
@Override
|
||||
public BaseComponent[] getName(Player p) {
|
||||
@@ -0,0 +1,17 @@
|
||||
package me.dadus33.chatitem.playernamer.hook;
|
||||
|
||||
import dev.majek.hexnicks.HexNicks;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import me.dadus33.chatitem.playernamer.IPlayerNamer;
|
||||
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
|
||||
public class HexNicksV3PlayerNamer implements IPlayerNamer {
|
||||
|
||||
@Override
|
||||
public BaseComponent[] getName(Player p) {
|
||||
return BungeeComponentSerializer.get().serialize(HexNicks.api().getStoredNick(p).join());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,8 +2,9 @@ package me.dadus33.chatitem.playerversion.hooks;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
|
||||
import me.dadus33.chatitem.playerversion.IPlayerVersion;
|
||||
import us.myles.ViaVersion.api.Via;
|
||||
|
||||
public class ViaVersionHook implements IPlayerVersion {
|
||||
|
||||
|
||||
@@ -1,16 +1,54 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
|
||||
public class ColorManager {
|
||||
|
||||
public static final List<String> COLORS = Arrays.asList("4", "c", "6", "e", "2", "a", "b", "3", "1", "9", "d", "5", "f", "7", "8", "0");
|
||||
|
||||
public static boolean isHexColor(ChatColor c) {
|
||||
return Version.getVersion().isNewerOrEquals(Version.V1_16) && c.getName().startsWith("#");
|
||||
}
|
||||
|
||||
public static boolean isHexColor(String c) {
|
||||
return Version.getVersion().isNewerOrEquals(Version.V1_16) && c.startsWith("x");
|
||||
}
|
||||
|
||||
public static String removeColorAtBegin(String s) {
|
||||
if(s == null || s.isEmpty())
|
||||
return "";
|
||||
boolean wasColorChar = s.startsWith(Character.toString(ChatColor.COLOR_CHAR));
|
||||
if(!wasColorChar)
|
||||
return s;
|
||||
String next = "";
|
||||
for(int i = 1; i < s.length(); i++) {
|
||||
char c = s.charAt(i);
|
||||
if(wasColorChar) {
|
||||
if(!COLORS.contains(Character.toString(c)))
|
||||
next = next + ChatColor.COLOR_CHAR + "" + c;
|
||||
wasColorChar = false;
|
||||
} else {
|
||||
wasColorChar = c == ChatColor.COLOR_CHAR;
|
||||
if(!wasColorChar) { // something other than color code
|
||||
next += s.substring(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(next.isEmpty())
|
||||
next = s;
|
||||
return next;
|
||||
}
|
||||
|
||||
public static String getColorString(String input) {
|
||||
if (input == null || input.isEmpty())
|
||||
return "";
|
||||
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));
|
||||
if (isHexColor(input)) { // x mean it's an hex
|
||||
input = input.substring(1);
|
||||
if (input.length() >= 6) { // at least hex
|
||||
str.append(ChatColor.of("#" + input.substring(0, 6))); // get first hex color code
|
||||
@@ -30,8 +68,7 @@ public class ColorManager {
|
||||
public static ChatColor getColor(String input) {
|
||||
if (input == null || input.isEmpty())
|
||||
return ChatColor.RESET;
|
||||
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));
|
||||
if (isHexColor(input)) { // x mean it's an hex
|
||||
if (input.length() >= 7) { // at least hex, and 7 because we count the "x"
|
||||
return ChatColor.of("#" + input.substring(1, 7)); // get first hex color code
|
||||
} else
|
||||
@@ -57,18 +94,16 @@ public class ColorManager {
|
||||
if (args == 'x' && !colorCode.isEmpty()) {
|
||||
text += ColorManager.getColorString(colorCode);
|
||||
colorCode = "x";
|
||||
} else
|
||||
} else if(Character.digit(Character.toLowerCase(args), 16) != -1)
|
||||
colorCode += args; // a color by itself
|
||||
} else {
|
||||
waiting = false;
|
||||
if (!colorCode.isEmpty()) {
|
||||
if (colorCode.startsWith("x") && colorCode.length() >= 7) {
|
||||
if (isHexColor(colorCode) && colorCode.length() >= 7) {
|
||||
if (colorCode.length() == 7)
|
||||
text += ColorManager.getColor(colorCode);
|
||||
else {
|
||||
text += 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
|
||||
|
||||
@@ -7,6 +7,7 @@ import java.util.stream.Collectors;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.Storage;
|
||||
|
||||
public class Messages {
|
||||
|
||||
@@ -18,7 +19,6 @@ public class Messages {
|
||||
return colorAndPlaceholders(ChatItem.getInstance().getConfig().getString("messages." + key, key), placeholders);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static List<String> getMessageList(String key, Object... placeholders) {
|
||||
Object obj = ChatItem.getInstance().getConfig().get("messages." + key);
|
||||
if(obj == null)
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
|
||||
|
||||
public class PacketUtils {
|
||||
|
||||
@@ -14,88 +18,93 @@ public class PacketUtils {
|
||||
public static final String NMS_PREFIX;
|
||||
public static final String OBC_PREFIX;
|
||||
public static final boolean IS_THERMOS;
|
||||
public static final Class<?> CRAFT_PLAYER_CLASS, CRAFT_SERVER_CLASS, CHAT_SERIALIZER, COMPONENT_CLASS;
|
||||
public static final Class<?> CHAT_SERIALIZER, COMPONENT_CLASS;
|
||||
public static final Method ICB_FROM_JSON;
|
||||
|
||||
/**
|
||||
* This Map is to reduce Reflection action which take more resources than just RAM action
|
||||
* This Map is to reduce Reflection action which take more resources than just
|
||||
* RAM action
|
||||
*/
|
||||
private static final Map<String, Class<?>> ALL_CLASS = Collections.synchronizedMap(new HashMap<String, Class<?>>());
|
||||
|
||||
|
||||
static {
|
||||
IS_THERMOS = isClassExist("thermos.Thermos");
|
||||
NMS_PREFIX = Version.getVersion().isNewerOrEquals(Version.V1_17) || IS_THERMOS ? "net.minecraft." : "net.minecraft.server." + VERSION + ".";
|
||||
NMS_PREFIX = Version.getVersion().isNewerOrEquals(Version.V1_17) || IS_THERMOS ? "net.minecraft."
|
||||
: "net.minecraft.server." + VERSION + ".";
|
||||
OBC_PREFIX = "org.bukkit.craftbukkit." + VERSION + ".";
|
||||
CRAFT_PLAYER_CLASS = getObcClass("entity.CraftPlayer");
|
||||
CHAT_SERIALIZER = getNmsClass("IChatBaseComponent$ChatSerializer", "network.chat.", "ChatSerializer");
|
||||
COMPONENT_CLASS = getNmsClass("IChatBaseComponent", "network.chat.");
|
||||
CRAFT_SERVER_CLASS = getObcClass("CraftServer");
|
||||
ICB_FROM_JSON = getMethod("a", CHAT_SERIALIZER, String.class);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the Class in NMS, with a processing reducer
|
||||
*
|
||||
* @param name of the NMS class (in net.minecraft.server package ONLY, because it's NMS)
|
||||
* @param name of the NMS class (in net.minecraft.server package ONLY, because
|
||||
* it's NMS)
|
||||
* @return clazz the searched class
|
||||
*/
|
||||
public static Class<?> getNmsClass(String name, String packagePrefix, String... alias){
|
||||
public static Class<?> getNmsClass(String name, String packagePrefix, String... alias) {
|
||||
return ALL_CLASS.computeIfAbsent(name, (a) -> {
|
||||
String fullPrefix = NMS_PREFIX + (Version.getVersion().isNewerOrEquals(Version.V1_17) || IS_THERMOS ? packagePrefix : "");
|
||||
String fullPrefix = NMS_PREFIX
|
||||
+ (Version.getVersion().isNewerOrEquals(Version.V1_17) || IS_THERMOS ? packagePrefix : "");
|
||||
try {
|
||||
Class<?> clazz = Class.forName(fullPrefix + name);
|
||||
if(clazz != null)
|
||||
if (clazz != null)
|
||||
return clazz;
|
||||
} catch (ClassNotFoundException e) {
|
||||
if(alias.length == 0)
|
||||
if (alias.length == 0)
|
||||
e.printStackTrace(); // no alias, print error
|
||||
// else ignore and go check for alias
|
||||
}
|
||||
|
||||
for(String className : alias) {
|
||||
|
||||
for (String className : alias) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(fullPrefix + className);
|
||||
if(clazz != null)
|
||||
if (clazz != null)
|
||||
return clazz;
|
||||
} catch (ClassNotFoundException e) {
|
||||
if(className == alias[alias.length - 1]) // if it's last alias, print error
|
||||
if (className == alias[alias.length - 1]) // if it's last alias, print error
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the Class in NMS, with a processing reducer
|
||||
*
|
||||
* @param name of the NMS class (in net.minecraft.server package ONLY, because it's NMS)
|
||||
* @param name of the NMS class (in net.minecraft.server package ONLY, because
|
||||
* it's NMS)
|
||||
* @return clazz the searched class
|
||||
*/
|
||||
public static Class<?> getObcClass(String name, String... alias){
|
||||
public static Class<?> getObcClass(String name, String... alias) {
|
||||
return ALL_CLASS.computeIfAbsent(name, (a) -> {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(OBC_PREFIX + name);
|
||||
if(clazz != null)
|
||||
if (clazz != null)
|
||||
return clazz;
|
||||
} catch (ClassNotFoundException e) {
|
||||
if(alias.length == 0)
|
||||
if (alias.length == 0)
|
||||
e.printStackTrace(); // no alias, print error
|
||||
// else ignore and go check for alias
|
||||
}
|
||||
|
||||
for(String className : alias) {
|
||||
|
||||
for (String className : alias) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(OBC_PREFIX + className);
|
||||
if(clazz != null)
|
||||
if (clazz != null)
|
||||
return clazz;
|
||||
} catch (ClassNotFoundException e) {
|
||||
if(className == alias[alias.length - 1]) // if it's last alias, print error
|
||||
if (className == alias[alias.length - 1]) // if it's last alias, print error
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get NMS entity player of specified one
|
||||
*
|
||||
@@ -104,14 +113,13 @@ public class PacketUtils {
|
||||
*/
|
||||
public static Object getEntityPlayer(Player p) {
|
||||
try {
|
||||
Object craftPlayer = CRAFT_PLAYER_CLASS.cast(p);
|
||||
return craftPlayer.getClass().getMethod("getHandle").invoke(craftPlayer);
|
||||
return getObcClass("entity.CraftPlayer").getMethod("getHandle").invoke(p);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static boolean isClassExist(String name) {
|
||||
try {
|
||||
Class.forName(name);
|
||||
@@ -130,16 +138,13 @@ public class PacketUtils {
|
||||
public static Object getPlayerConnection(Player p) {
|
||||
try {
|
||||
Object entityPlayer = getEntityPlayer(p);
|
||||
if(Version.getVersion().isNewerOrEquals(Version.V1_17))
|
||||
return entityPlayer.getClass().getField("b").get(entityPlayer);
|
||||
else
|
||||
return entityPlayer.getClass().getField("playerConnection").get(entityPlayer);
|
||||
return ReflectionUtils.getFirstWith(entityPlayer, entityPlayer.getClass(), getNmsClass("PlayerConnection", "server.network."));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get NMS entity player of specified one
|
||||
*
|
||||
@@ -148,8 +153,7 @@ public class PacketUtils {
|
||||
*/
|
||||
public static Object getCraftServer() {
|
||||
try {
|
||||
Object craftServer = CRAFT_SERVER_CLASS.cast(Bukkit.getServer());
|
||||
return craftServer.getClass().getMethod("getHandle").invoke(craftServer);
|
||||
return getObcClass("CraftServer").getMethod("getHandle").invoke(Bukkit.getServer());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
@@ -159,15 +163,60 @@ public class PacketUtils {
|
||||
/**
|
||||
* Send the packet to the specified player
|
||||
*
|
||||
* @param p which will receive the packet
|
||||
* @param p which will receive the packet
|
||||
* @param packet the packet to sent
|
||||
*/
|
||||
public static void sendPacket(Player p, Object packet) {
|
||||
try {
|
||||
Object playerConnection = getPlayerConnection(p);
|
||||
playerConnection.getClass().getMethod(Version.getVersion().isNewerOrEquals(Version.V1_18) ? "a" : "sendPacket", getNmsClass("Packet", "network.protocol.")).invoke(playerConnection, packet);
|
||||
playerConnection.getClass()
|
||||
.getMethod(Version.getVersion().isNewerOrEquals(Version.V1_18) ? "a" : "sendPacket",
|
||||
getNmsClass("Packet", "network.protocol."))
|
||||
.invoke(playerConnection, packet);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static Method getNbtMethod;
|
||||
|
||||
/**
|
||||
* Converts an {@link org.bukkit.inventory.ItemStack} to a Json string for
|
||||
* sending with {@link net.md_5.bungee.api.chat.BaseComponent}'s.
|
||||
*
|
||||
* @param item the item to convert
|
||||
* @return the Json string representation of the item
|
||||
*/
|
||||
public static String getNbtTag(ItemStack item) {
|
||||
try {
|
||||
if(getNbtMethod == null) {
|
||||
Class<?> itemClass = getNmsClass("ItemStack", "world.item.");
|
||||
Version v = Version.getVersion();
|
||||
if(v.isNewerOrEquals(Version.V1_20))
|
||||
getNbtMethod = itemClass.getDeclaredMethod("w");
|
||||
else if(v.equals(Version.V1_19))
|
||||
getNbtMethod = itemClass.getDeclaredMethod("u");
|
||||
else if(v.equals(Version.V1_18))
|
||||
getNbtMethod = itemClass.getDeclaredMethod("t");
|
||||
else
|
||||
getNbtMethod = itemClass.getDeclaredMethod("getTag");
|
||||
|
||||
getNbtMethod.setAccessible(true);
|
||||
}
|
||||
Object tag = getNbtMethod.invoke(JSONManipulator.AS_NMS_COPY.invoke(null, item));
|
||||
return tag == null ? "{}" : tag.toString();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "{}";
|
||||
}
|
||||
|
||||
private static Method getMethod(String name, Class<?> clazz, Class<?>... params) {
|
||||
try {
|
||||
return clazz.getDeclaredMethod(name, params);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
|
||||
public class Reflect {
|
||||
|
||||
public static Method getMethod(Class<?> clazz, String methodName, Class<?>... params) {
|
||||
try {
|
||||
return clazz.getMethod(methodName, params);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static Method getMethod(Class<?> clazz, Class<?> returned, Class<?>... params) {
|
||||
try {
|
||||
for(Method m : clazz.getDeclaredMethods()) {
|
||||
if(returned.equals(m.getReturnType()) && areParamsEquals(m.getParameterTypes(), params))
|
||||
return m;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean areParamsEquals(Class<?>[] p1, Class<?>[] p2) {
|
||||
if(p1.length != p2.length)
|
||||
return false;
|
||||
for(int i = 0; i < p1.length; i++) {
|
||||
if(!p1[i].equals(p2[i]))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static Field getField(Class<?> clazz, String... fieldNames){
|
||||
for(String field : fieldNames) {
|
||||
try{
|
||||
Field f = clazz.getDeclaredField(field);
|
||||
f.setAccessible(true);
|
||||
return f;
|
||||
} catch (NoSuchFieldException e) {
|
||||
// go to next
|
||||
}
|
||||
}
|
||||
ChatItem.getInstance().getLogger().severe("Failed to find field: " + Arrays.asList(fieldNames) + " in class: " + clazz.getCanonicalName());
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,11 +1,58 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Arrays;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
|
||||
public class ReflectionUtils {
|
||||
|
||||
public static Method getMethod(Class<?> clazz, String methodName, Class<?>... params) {
|
||||
try {
|
||||
return clazz.getMethod(methodName, params);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static Method getMethod(Class<?> clazz, Class<?> returned, Class<?>... params) {
|
||||
try {
|
||||
for(Method m : clazz.getDeclaredMethods()) {
|
||||
if(returned.equals(m.getReturnType()) && areParamsEquals(m.getParameterTypes(), params))
|
||||
return m;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean areParamsEquals(Class<?>[] p1, Class<?>[] p2) {
|
||||
if(p1.length != p2.length)
|
||||
return false;
|
||||
for(int i = 0; i < p1.length; i++) {
|
||||
if(!p1[i].equals(p2[i]))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static Field getField(Class<?> clazz, String... fieldNames){
|
||||
for(String field : fieldNames) {
|
||||
try{
|
||||
Field f = clazz.getDeclaredField(field);
|
||||
f.setAccessible(true);
|
||||
return f;
|
||||
} catch (NoSuchFieldException e) {
|
||||
// go to next
|
||||
}
|
||||
}
|
||||
ChatItem.getInstance().getLogger().severe("Failed to find field: " + Arrays.asList(fieldNames) + " in class: " + clazz.getCanonicalName());
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Object getPrivateField(Object object, String field)
|
||||
throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
|
||||
@@ -92,7 +139,6 @@ public class ReflectionUtils {
|
||||
* @return the field (or null if not found)
|
||||
* @throws Exception if something gone wrong
|
||||
*/
|
||||
@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) && !Modifier.isStatic(f.getModifiers())) {
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
package me.dadus33.chatitem.utils;
|
||||
|
||||
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 java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class Storage {
|
||||
|
||||
public final HashMap<String, HashMap<Short, String>> TRANSLATIONS = new HashMap<>();
|
||||
public final String HAND_NAME, NAME_FORMAT, AMOUNT_FORMAT, COMMAND_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))));
|
||||
}
|
||||
|
||||
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}"));
|
||||
COMMAND_FORMAT = color(conf.getString("general.command-format", "&6%name%'s item is %item%"));
|
||||
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);
|
||||
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").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);
|
||||
|
||||
}
|
||||
|
||||
public static String color(String s) {
|
||||
return s == null || s.isEmpty() ? s : ChatColor.translateAlternateColorCodes('&', s);
|
||||
}
|
||||
|
||||
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,19 +1,37 @@
|
||||
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.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.*;
|
||||
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.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.dadus33.chatitem.ChatItem;
|
||||
import me.dadus33.chatitem.chatmanager.v1.json.JSONManipulator;
|
||||
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.ItemTag;
|
||||
import net.md_5.bungee.api.chat.hover.content.Item;
|
||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
||||
|
||||
public class Utils {
|
||||
|
||||
private final static TreeMap<Integer, String> ROMAN_KEYS = new TreeMap<>();
|
||||
@@ -54,7 +72,7 @@ public class Utils {
|
||||
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_ENVIRONMENTAL", "Protection");
|
||||
ENCHANTS_NAMES.put("PROTECTION_EXPLOSIONS", "Blast Protection");
|
||||
ENCHANTS_NAMES.put("PROTECTION_FALL", "Feather Falling");
|
||||
ENCHANTS_NAMES.put("PROTECTION_FIRE", "Fire Protection");
|
||||
@@ -82,7 +100,6 @@ public class Utils {
|
||||
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.");
|
||||
}
|
||||
@@ -139,6 +156,28 @@ public class Utils {
|
||||
return b;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static HoverEvent createItemHover(ItemStack item) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
public static HoverEvent createTextHover(String text) {
|
||||
return createTextHover(new ComponentBuilder(text).create());
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static HoverEvent createTextHover(BaseComponent[] comps) {
|
||||
if(Version.getVersion().isNewerOrEquals(Version.V1_13)) {
|
||||
return new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(comps));
|
||||
} else {
|
||||
return new HoverEvent(HoverEvent.Action.SHOW_TEXT, comps);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isInteger(String s) {
|
||||
try {
|
||||
Integer.parseInt(s);
|
||||
@@ -174,4 +213,19 @@ public class Utils {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static YamlConfiguration copyLoadFile(File folder, String filename, String baseFile) {
|
||||
File legacyConfig = new File(folder, filename);
|
||||
if(!legacyConfig.exists())
|
||||
Utils.copyFile(baseFile, legacyConfig);
|
||||
return YamlConfiguration.loadConfiguration(legacyConfig);
|
||||
}
|
||||
|
||||
public static void copyFile(String fileName, File dir) {
|
||||
try (InputStream stream = ChatItem.getInstance().getResource(fileName)) {
|
||||
Files.copy(stream, dir.toPath());
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,19 +9,20 @@ import me.dadus33.chatitem.ChatItem;
|
||||
public enum Version {
|
||||
|
||||
// http://wiki.vg/Protocol_version_numbers
|
||||
V1_7(0, 5, 0),
|
||||
V1_8(6, 47, 1),
|
||||
V1_9(49, 110, 2), // 1.9.X - Starts with 49 as 48 was an april fools update
|
||||
V1_10(201, 210, 3), // 1.10.X - Starts with 201 because why not.
|
||||
V1_11(301, 316, 4),
|
||||
V1_12(317, 340, 5),
|
||||
V1_13(341, 440, 6),
|
||||
V1_14(100, 441, 500),
|
||||
V1_15(100, 550, 578),
|
||||
V1_16(100, 700, 754),
|
||||
V1_17(100, 755, 756),
|
||||
V1_18(100, 757, 758),
|
||||
V1_19(100, 759, 1000),
|
||||
V1_7(0, 5, 7),
|
||||
V1_8(6, 47, 8),
|
||||
V1_9(49, 110, 9), // 1.9.X - Starts with 49 as 48 was an april fools update
|
||||
V1_10(201, 210, 10), // 1.10.X - Starts with 201 because why not.
|
||||
V1_11(301, 316, 11),
|
||||
V1_12(317, 340, 12),
|
||||
V1_13(341, 440, 13),
|
||||
V1_14(441, 500, 14),
|
||||
V1_15(550, 578, 15),
|
||||
V1_16(700, 754, 16),
|
||||
V1_17(755, 756, 17),
|
||||
V1_18(757, 758, 18),
|
||||
V1_19(759, 762, 19),
|
||||
V1_20(763, 1000, 20),
|
||||
HIGHER(Integer.MAX_VALUE, -1, Integer.MAX_VALUE);
|
||||
|
||||
// Latest version should always have the upper limit set to Integer.MAX_VALUE so
|
||||
@@ -84,6 +85,8 @@ public enum Version {
|
||||
}
|
||||
|
||||
public static String stringifyAdress(InetSocketAddress address) {
|
||||
if(address == null)
|
||||
return "0.0.0.0:0";
|
||||
String port = String.valueOf(address.getPort());
|
||||
String ip = address.getAddress().getHostAddress();
|
||||
return ip + ":" + port;
|
||||
|
||||
+19
-1129
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Bruin Terracotta","block.minecraft.lapis_ore":"Lasuurerts","item.minecraft.gray_dye":"Grys Kleurstof","block.minecraft.banner.base.yellow":"Ten volle geel veld","block.minecraft.terracotta":"Terracotta","item.minecraft.stray_spawn_egg":"Nagelaate Kuit Eier","block.minecraft.banner.base.pink":"Ten volle pienk veld","item.minecraft.potion.effect.weakness":"Swakheid Doepa","block.minecraft.dark_prismarine_slab":"Donker Prismaryn blad","item.minecraft.splash_potion.effect.thick":"Dik Spatdoepa","item.minecraft.cooked_cod":"Gaar Kabeljou","block.minecraft.red_nether_brick_slab":"Rooi Laer Baksteen Blad","block.minecraft.yellow_terracotta":"Geel Terracotta","block.minecraft.observer":"Waarnemer","block.minecraft.banner.stripe_bottom.cyan":"Siaan Basis","block.minecraft.banner.creeper.purple":"Pers Creeper Gelaai","block.minecraft.banner.straight_cross.cyan":"Siaan Kruis","block.minecraft.banner.half_horizontal_bottom.brown":"Omgekeerde Bruin Dwarsstreep","item.minecraft.firework_star.shape.large_ball":"Groot Bal","block.minecraft.prismarine_brick_slab":"Prismaryn Baksteen Blad","block.minecraft.jungle_trapdoor":"Oerwoudhout Valdeur","block.minecraft.sculk_sensor":"Sculk Sensor","block.minecraft.banner.creeper.orange":"Oranje Creeper Gelaai","block.minecraft.banner.triangles_top.lime":"Lemmetjie Groen Ingekeepde Hoof","item.minecraft.charcoal":"Houtskool","item.minecraft.tipped_arrow.effect.night_vision":"Pyl van Nagsig","block.minecraft.stone_brick_slab":"Klipsteenblad","block.minecraft.banner.mojang.cyan":"Siaan Ding","block.minecraft.white_stained_glass":"Wit Glas","item.minecraft.bowl":"Hout Bak","block.minecraft.banner.diagonal_up_left.magenta":"Magenta Per draai omgekeerde","block.minecraft.banner.square_top_right.light_gray":"Ligte Grys Hoof Sinistere Kanton","block.minecraft.dead_brain_coral_fan":"Dooie Gespreide Breinkoraal","block.minecraft.banner.flower.white":"Wit Blom Lading","item.minecraft.bone_meal":"Beenmeel","block.minecraft.banner.triangle_bottom.red":"Rooi Chevron","block.minecraft.cyan_carpet":"Siaan Mat","block.minecraft.oak_door":"Eikehout Deur","block.minecraft.flowering_azalea_leaves":"Blomdraende Azalea Blare","item.minecraft.prismarine_crystals":"Prismaryn Kristalle","block.minecraft.banner.diagonal_left.cyan":"Siaan Per draai Sinister","block.minecraft.banner.stripe_bottom.light_blue":"Ligte Blou Basis","item.minecraft.tipped_arrow.effect.slow_falling":"Pyl van Stadig Val","block.minecraft.end_stone":"Endsteen","block.minecraft.potted_white_tulip":"Gopotte Wit Tulp","block.minecraft.warped_door":"Vreemde Deur","block.minecraft.banner.square_top_left.light_gray":"Ligte Grys Hoof Dexter Kanton","item.minecraft.splash_potion.effect.fire_resistance":"Brandbestandheid Spatdoepa","block.minecraft.banner.half_vertical_right.pink":"Omgekeerde Paars Per Bleek","item.minecraft.furnace_minecart":"Koekepan Enjin","block.minecraft.banner.triangles_bottom.light_gray":"Ligte Grys Ingekeepde Basis","item.minecraft.shield.red":"Rooi Skild","block.minecraft.quartz_pillar":"Kwarts Pilaar","block.minecraft.prismarine_slab":"Prismaryn Blad","block.minecraft.nether_portal":"Laer Ingang","item.minecraft.diamond_sword":"Diamant Swaard","block.minecraft.oak_planks":"Eikehout Planke","item.minecraft.amethyst_shard":"Ametis Skerf","block.minecraft.purple_banner":"Pers Vlag","block.minecraft.structure_void":"Struktuur Leemte","block.minecraft.purple_shulker_box":"Pers Shulker Boks","block.minecraft.potatoes":"Aartappels","block.minecraft.light_blue_bed":"Ligte blou Bed","block.minecraft.yellow_banner":"Geel Banier","item.modifiers.head":"Wanneer dit op die kop is:","item.minecraft.potion.effect.swiftness":"Snelheid Doepa","block.minecraft.glass_pane":"Glaspaneel","block.minecraft.clay":"Klei","block.minecraft.banner.diagonal_right.cyan":"Cyan Per draai","block.minecraft.cut_copper_slab":"Gesnyde Koper Blad","block.minecraft.polished_diorite_slab":"Gepoleerde Dioriet Blad","block.minecraft.banner.piglin.green":"Groen Snoet","item.minecraft.splash_potion.effect.slow_falling":"Spat Doepa van Stadig Val","item.minecraft.book":"Boek","block.minecraft.banner.gradient.brown":"Bruin Gradiënt","block.minecraft.banner.cross.magenta":"Magenta Skuinskruis","block.minecraft.cobblestone_slab":"Steengruisblad","block.minecraft.banner.diagonal_right.purple":"Pers Per draai","block.minecraft.banner.curly_border.gray":"Grys Ingekeepde Borduur","block.minecraft.big_dripleaf":"Groot Drupblaar","block.minecraft.black_shulker_box":"Swart Shulker Boks","block.minecraft.banner.straight_cross.purple":"Pers Kruis","block.minecraft.blackstone_stairs":"Swartsteentrappe","block.minecraft.banner.triangles_top.blue":"Blou Ingekeepde Hoof","block.minecraft.deepslate_tile_slab":"Leisteenteëlblad","block.minecraft.banner.square_top_left.blue":"Blou Hoof Dexter Kanton","block.minecraft.banner.stripe_center.yellow":"Geen Paal","item.minecraft.piglin_banner_pattern.desc":"Snoet","item.minecraft.firework_star.cyLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"طين النضيج البني","block.minecraft.lapis_ore":"خام اللازورد","item.minecraft.gray_dye":"صبغة رمادية","block.minecraft.banner.base.yellow":"حقل أصفر كامل","block.minecraft.terracotta":"طين النضيج","item.minecraft.stray_spawn_egg":"بيضة الضال","block.minecraft.banner.base.pink":"حقل وردي كامل","item.minecraft.potion.effect.weakness":"جرعة الضعف","block.minecraft.dark_prismarine_slab":"بلاطة البريسمارين الداكن","item.minecraft.splash_potion.effect.thick":"رشة الجرعة الكثيفة","item.minecraft.cooked_cod":"سمك قد مطبوخ","block.minecraft.red_nether_brick_slab":"بلاطة طوب النذر الأحمر","block.minecraft.yellow_terracotta":"طين النضيج الأصفر","block.minecraft.observer":"المراقب","block.minecraft.banner.stripe_bottom.cyan":"شريط سفلي سماوي","block.minecraft.banner.creeper.purple":"شعار كريبر بنفسجي","block.minecraft.banner.straight_cross.cyan":"صليب سماوي","block.minecraft.banner.half_horizontal_bottom.brown":"النصف الأسفل ملون بني","item.minecraft.firework_star.shape.large_ball":"كرة كبيرة","block.minecraft.prismarine_brick_slab":"بلاطة طوب البريسمارين","block.minecraft.jungle_trapdoor":"باب أرضي من خشب الأدغال","block.minecraft.sculk_sensor":"مستشعر السكالك","block.minecraft.banner.creeper.orange":"شعار كريبر برتقالي","block.minecraft.banner.triangles_top.lime":"مثلثات علوية ليمونية","item.minecraft.charcoal":"فحم نباتي","item.minecraft.tipped_arrow.effect.night_vision":"سهم الرؤية الليلية","block.minecraft.stone_brick_slab":"بلاطة طوب حجري","block.minecraft.banner.mojang.cyan":"شيء سماوي","block.minecraft.white_stained_glass":"زجاج ابيض","item.minecraft.bowl":"زبدية","block.minecraft.banner.diagonal_up_left.magenta":"النصف السفلي الأيسر أرجواني","block.minecraft.banner.square_top_right.light_gray":"مربع رأسي أيمن رمادي فاتح","block.minecraft.dead_brain_coral_fan":"شعاب مرجان عقلي ميت","block.minecraft.banner.flower.white":"شعار زهرة أبيض","item.minecraft.bone_meal":"مسحوق العظام","block.minecraft.banner.triangle_bottom.red":"مثلث أحمر","block.minecraft.cyan_carpet":"سجاد سماوي","block.minecraft.oak_door":"باب البلوط","block.minecraft.flowering_azalea_leaves":"أوراق الأزاليا المزهرة","item.minecraft.prismarine_crystals":"بلورات البرسمارين","block.minecraft.banner.diagonal_left.cyan":"النصف العلوي الأيسر سماوي","block.minecraft.banner.stripe_bottom.light_blue":"شريط سفلي أزرق فاتح","item.minecraft.tipped_arrow.effect.slow_falling":"سهم السقوط البطيء","block.minecraft.end_stone":"حجر الاند","block.minecraft.potted_white_tulip":"توليب أبيض في وعاء","block.minecraft.warped_door":"باب عجيب","block.minecraft.banner.square_top_left.light_gray":"مربع رأسي أيسر رمادي فاتح","item.minecraft.splash_potion.effect.fire_resistance":"رشة جرعة مقاومة النار","block.minecraft.banner.half_vertical_right.pink":"النصف اليميني ملون وردي","item.minecraft.furnace_minecart":"عربة منجم بفرن","block.minecraft.banner.triangles_bottom.light_gray":"مثلثات سفلية رمادية فاتحة","item.minecraft.shield.red":"درس أحمر","block.minecraft.quartz_pillar":"عمود كوارتز","block.minecraft.prismarine_slab":"بلاطة بريسمارين","block.minecraft.nether_portal":"بوابة النذر","item.minecraft.diamond_sword":"سيف ألماسي","block.minecraft.oak_planks":"ألواح خشب البلوط","item.minecraft.amethyst_shard":"شظية جمشت","block.minecraft.purple_banner":"راية بنفسجية","block.minecraft.structure_void":"فراغ الهيكل","block.minecraft.purple_shulker_box":"صندوق شلكر بنفسجي","block.minecraft.potatoes":"بطاطا","block.minecraft.light_blue_bed":"سرير أزرق فاتح","block.minecraft.yellow_banner":"راية صفراء","item.modifiers.head":"عندما يكون على الرأس:","item.minecraft.potion.effect.swiftness":"جرعة السرعة","block.minecraft.glass_pane":"لوح زجاجي","block.minecraft.clay":"صلصال","block.minecraft.banner.diagonal_right.cyan":"النصف العلوي الأيمن سماوي","block.minecraft.cut_copper_slab":"بلاطة نحاس مقطع","block.minecraft.polished_diorite_slab":"بلاطة ديوريت مصقول","block.minecraft.banner.piglin.green":"أنف أخضر","item.minecraft.splash_potion.effect.slow_falling":"رشة جرعة السقوط البطيء","item.minecraft.book":"كتاب","blockLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota marrón","block.minecraft.lapis_ore":"Veta de llapislázuli","item.minecraft.gray_dye":"Tiñe buxu","block.minecraft.banner.base.yellow":"Estandarte en mariello","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Güevu qu'apruz a un vagamundu","block.minecraft.banner.base.pink":"Estandarte en rosa","item.minecraft.potion.effect.weakness":"Brebaxe de badea","block.minecraft.dark_prismarine_slab":"Llábana de prismarín escuro","item.minecraft.splash_potion.effect.thick":"Brebaxe espesu refundizu","item.minecraft.cooked_cod":"Bacalláu cocináu","block.minecraft.red_nether_brick_slab":"Llábana de lladriyos coloraos del Nether","block.minecraft.yellow_terracotta":"Terracota mariello","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Base ciana","block.minecraft.banner.creeper.purple":"Dibuxu moráu de Creeper","block.minecraft.banner.straight_cross.cyan":"Cruz ciana","block.minecraft.banner.half_horizontal_bottom.brown":"Metá baxera en marrón","item.minecraft.firework_star.shape.large_ball":"Bola grande","block.minecraft.prismarine_brick_slab":"Llábana de lladriyos de prismarín","block.minecraft.jungle_trapdoor":"Trapiella de madera de la xungla","block.minecraft.sculk_sensor":"Sensor Sculk","block.minecraft.banner.creeper.orange":"Dibuxu naranxa de Creeper","block.minecraft.banner.triangles_top.lime":"Dentáu llima cimeru","item.minecraft.charcoal":"Carbón vexetal","item.minecraft.tipped_arrow.effect.night_vision":"Flecha de visión nocherniego","block.minecraft.stone_brick_slab":"Llábana de lladriyos de piedra","block.minecraft.banner.mojang.cyan":"Llogotipu cianu","block.minecraft.white_stained_glass":"Vidru tintao en blanco","item.minecraft.bowl":"Escudiella","block.minecraft.banner.diagonal_up_left.magenta":"Triángulu baxeru a mandrecha en maxenta","block.minecraft.banner.square_top_right.light_gray":"Cuadráu cimeru a manzorga en buxo claro","block.minecraft.dead_brain_coral_fan":"Gorgonia de cerebru muerto","block.minecraft.banner.flower.white":"Flor blanca","item.minecraft.bone_meal":"Fariña óseo","block.minecraft.banner.triangle_bottom.red":"Chebrón coloráu","block.minecraft.cyan_carpet":"Moqueta ciana","block.minecraft.oak_door":"Puerta de carbayu","block.minecraft.flowering_azalea_leaves":"Fueyes de rododentru florecío","item.minecraft.prismarine_crystals":"Cristales de prismarín","block.minecraft.banner.diagonal_left.cyan":"Triángulu cimeru a manzorga en ciano","block.minecraft.banner.stripe_bottom.light_blue":"Base azul claro","item.minecraft.tipped_arrow.effect.slow_falling":"Flecha de cayida lenta","block.minecraft.end_stone":"Piedra del End","block.minecraft.potted_white_tulip":"Tiestu con un tulipán blancu","block.minecraft.warped_door":"Puerta distorsionada","block.minecraft.banner.square_top_left.light_gray":"Cuadráu cimeru a mandrecha en buxo claro","item.minecraft.splash_potion.effect.fire_resistance":"Brebaxe refundizu de resistencia al fueu","block.minecraft.banner.half_vertical_right.pink":"Metá a mandrecha en rosa","item.minecraft.furnace_minecart":"Vagoneta con un fornu","block.minecraft.banner.triangles_bottom.light_gray":"Dentáu buxu claru baxeru","item.minecraft.shield.red":"Escudu coloráu","block.minecraft.quartz_pillar":"Pilar de cuarzu","block.minecraft.prismarine_slab":"Llábana de prismarín","block.minecraft.nether_portal":"Portal al Nether","item.minecraft.diamond_sword":"Espada de diamante","block.minecraft.oak_planks":"Tables de carbayu","item.minecraft.amethyst_shard":"Cachu d'amatista","block.minecraft.purple_banner":"Estandarte moráu","block.minecraft.structure_void":"Vacíu de cadarma","block.minecraft.purple_shulker_box":"Caxa morada de shulker","block.minecraft.potatoes":"Pataques","block.minecraft.light_blue_bed":"Cama azul claro","block.minecraft.yellow_banner":"Estandarte mariellu","item.minecraft.potion.effect.swiftness":"Brebaxe de rapidez","block.minecraft.glass_pane":"Panel de vidru","block.minecraft.clay":"Barru santo","block.minecraft.banner.diagonal_right.cyan":"Triángulu cimeru a mandrecha en ciano","block.minecraft.cut_copper_slab":"Llábana de cobre cortao","block.minecraft.polished_diorite_slab":"Llábana de diorita pulío","block.minecraft.banner.piglin.green":"Focicu verde","item.minecraft.splash_potion.effect.slow_falling":"Brebaxe refundizu de cayida lenta","item.minecraft.book":"Llibru","block.minecraft.banner.gradient.brown":"Dilíu marrón dende lo cimero","block.minecraft.banner.cross.magenta":"Nasa maxenta","block.minecraft.cobblestone_slab":"Llábana de llastra","block.minecraft.banner.diagonal_right.purple":"Triángulu cimeru a mandrecha en morao","block.minecraft.banner.curly_border.gray":"Berbesu dentáu en buxo","block.minecraft.big_dripleaf":"Plantaforma grande","block.minecraft.black_shulker_box":"Caxa prieta de shulker","block.minecraft.banner.straight_cross.purple":"Cruz morada","block.minecraft.blackstone_sLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Qəhvəyi Terrakotta","block.minecraft.lapis_ore":"Lapis Lazuli Filizi","item.minecraft.gray_dye":"Boz Boya","block.minecraft.banner.base.yellow":"Tam sarı sahə","block.minecraft.terracotta":"Terrakotta","item.minecraft.stray_spawn_egg":"Strey çağırma yumurtası","block.minecraft.banner.base.pink":"Tam çəhrayı sahə","item.minecraft.potion.effect.weakness":"Zəiflik Eliksiri","block.minecraft.dark_prismarine_slab":"Qara prizmarin pillə","item.minecraft.splash_potion.effect.thick":"Atıla Bilən Sıx Eliksir","item.minecraft.cooked_cod":"Bişmiş Treska","block.minecraft.red_nether_brick_slab":"Qırmızı Nezer kərpici pilləsi","block.minecraft.yellow_terracotta":"Sarı terrakotta","block.minecraft.observer":"Gözləmçi","block.minecraft.banner.stripe_bottom.cyan":"Altdan Mavi Sətir","block.minecraft.banner.creeper.purple":"Bənövşəyi Creeper Şəkli","block.minecraft.banner.straight_cross.cyan":"Mavi Xaç","block.minecraft.banner.half_horizontal_bottom.brown":"Qəhvəyi Alt Yarı","item.minecraft.firework_star.shape.large_ball":"Böyük top","block.minecraft.prismarine_brick_slab":"Prizmarin kərpici pillə","block.minecraft.jungle_trapdoor":"Cəngəllik Ağacı Tələ Qapısı","block.minecraft.sculk_sensor":"Skalk sensoru","block.minecraft.banner.creeper.orange":"Narıncı Creeper Şəkli","block.minecraft.banner.triangles_top.lime":"Üstdən Açıq Yaşıl Mişar Dişi","item.minecraft.charcoal":"Odun Kömürü","item.minecraft.tipped_arrow.effect.night_vision":"Gecə Görüşü Oxu","block.minecraft.stone_brick_slab":"Daş Kərpic Pillə","block.minecraft.banner.mojang.cyan":"Mavi Şey","block.minecraft.white_stained_glass":"Ağ Rəngli Şüşə","item.minecraft.bowl":"Qab","block.minecraft.banner.diagonal_up_left.magenta":"Magenta Sol Alt Üçbucaq","block.minecraft.banner.square_top_right.light_gray":"Açıq Boz Sağ Üst Dördbucaq","block.minecraft.dead_brain_coral_fan":"Ölü beyin mərcan fanatı","block.minecraft.banner.flower.white":"Ağ Çiçək Şəkli","item.minecraft.bone_meal":"Sümük Tozu","block.minecraft.banner.triangle_bottom.red":"Altdan Qırmızı Üçbucaq","block.minecraft.cyan_carpet":"Mavi Xalça","block.minecraft.oak_door":"Palıd Qapı","block.minecraft.flowering_azalea_leaves":"Çiçəkləyən azaliya yarpaqları","item.minecraft.prismarine_crystals":"Prizmarin Kristalı","block.minecraft.banner.diagonal_left.cyan":"Mavi Sol Üst Üçbucaq","block.minecraft.banner.stripe_bottom.light_blue":"Altdan Açıq Göy Sətir","item.minecraft.tipped_arrow.effect.slow_falling":"Yavaş Eniş Oxu","block.minecraft.end_stone":"End Daşı","block.minecraft.potted_white_tulip":"Dibçəkli Ağ Lalə","block.minecraft.warped_door":"Əyri qapı","block.minecraft.banner.square_top_left.light_gray":"Açıq Boz Sol Üst Dördbucaq","item.minecraft.splash_potion.effect.fire_resistance":"Atıla Bilən Alov Müqaviməti Eliksiri","block.minecraft.banner.half_vertical_right.pink":"Çəhrayı Sağ Yarı","item.minecraft.furnace_minecart":"Sobalı Vaqon","block.minecraft.banner.triangles_bottom.light_gray":"Altdan Açıq Boz Mişar Dişi","item.minecraft.shield.red":"Qırmızı Qalxan","block.minecraft.quartz_pillar":"Kvars sütun","block.minecraft.prismarine_slab":"Prizmarin pillə","block.minecraft.nether_portal":"Nezer portalı","item.minecraft.diamond_sword":"Almaz Qılınc","block.minecraft.oak_planks":"Palıd Taxta","item.minecraft.amethyst_shard":"Ametist parçası","block.minecraft.purple_banner":"Bənövşəyi Bayraq","block.minecraft.structure_void":"Struktur Boşluğu","block.minecraft.purple_shulker_box":"Bənövşəyi Shulker Qutusu","block.minecraft.potatoes":"Kartoflar","block.minecraft.light_blue_bed":"Açıq göy çarpayı","block.minecraft.yellow_banner":"Sarı Bayraq","item.modifiers.head":"Başda ikən:","item.minecraft.potion.effect.swiftness":"Çeviklik Eliksiri","block.minecraft.glass_pane":"İncə Şüşə","block.minecraft.clay":"Gil","block.minecraft.banner.diagonal_right.cyan":"Mavi Sağ Üst Üçbucaq","block.minecraft.cut_copper_slab":"Kəsilmiş mis pillə","block.minecraft.polished_diorite_slab":"Cilalanmış Diorit Pillə","block.minecraft.banner.piglin.green":"Yaşıl burun","item.minecraft.splash_potion.effect.slow_falling":"Atıla Bilən Yavaş Eniş Eliksiri","item.minecraft.book":"Kitab","block.minecraft.banner.gradient.brown":"Yuxarıdan Aşağı Qəhvəyi Keçiş","block.minecraft.banner.cross.magenta":"Magenta Çarpı","block.minecraft.cobblestone_slab":"Qırıq Daş Pillə","block.minecraft.banner.diagonal_right.purple":"Bənövşəyi Sağ Üst Üçbucaq","block.minecraft.banner.curly_border.gray":"Boz Mişar Dişi Çərçivə","block.minecraft.big_dripleaf":"Böyük damcıyarpaq","block.minecraft.black_shulker_box":"Qara Shulker Qutusu","block.minecraft.banner.straight_cross.purple":"Bənövşəyi Xaç","block.minecraft.blackstone_stairs":"Qaradaş pilləkən","block.minecraft.banner.triangles_top.blue":"ÜstdLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Көрән яндырығашы","block.minecraft.lapis_ore":"Рәжүәрт мәғдәне","item.minecraft.gray_dye":"Һоро буяу","block.minecraft.banner.base.yellow":"Тулыһынса һары","block.minecraft.terracotta":"Терракота","item.minecraft.stray_spawn_egg":"Сырғыя саҡырыу йомортҡаһы","block.minecraft.banner.base.pink":"Тулыһынса алһыу","item.minecraft.potion.effect.weakness":"Көсһеҙлек эсемлеге","block.minecraft.dark_prismarine_slab":"Ҡара призмарин плитаһы","item.minecraft.splash_potion.effect.thick":"Шарлай торған ҡуйы эсемлеге","item.minecraft.cooked_cod":"Ҡурылған тәрәс","block.minecraft.red_nether_brick_slab":"Ҡыҙыл неҙер кирбес плитаһы","block.minecraft.yellow_terracotta":"Һары яндырығашы","block.minecraft.observer":"Күҙәтеүсе","block.minecraft.banner.stripe_bottom.cyan":"Фирүзә нигеҙ","block.minecraft.banner.creeper.purple":"Шәмәхә крипер","block.minecraft.banner.straight_cross.cyan":"Фирүзә тәре","block.minecraft.banner.half_horizontal_bottom.brown":"Көрән аҫҡы яҡ","item.minecraft.firework_star.shape.large_ball":"Оло йомғаҡ","block.minecraft.prismarine_brick_slab":"Призмарин кирбес плитаһы","block.minecraft.jungle_trapdoor":"Тропик ағас люгы","block.minecraft.sculk_sensor":"Скалк сенсор","block.minecraft.banner.creeper.orange":"Ҡыҙғылт һары крипер","block.minecraft.banner.triangles_top.lime":"Йәшкелт тешле баш","item.minecraft.charcoal":"Ағас күмере","item.minecraft.tipped_arrow.effect.night_vision":"Төн күреү уғы","block.minecraft.stone_brick_slab":"Таш кирбес плитаһы","block.minecraft.banner.mojang.cyan":"Фирүзә бер нәмә","block.minecraft.white_stained_glass":"Аҡ быяла","item.minecraft.bowl":"Туҫтаҡ","block.minecraft.banner.diagonal_up_left.magenta":"Ҡуйы ҡыҙыл ауҙарылған киҫелеше","block.minecraft.banner.square_top_right.light_gray":"Аҡһыл һоро өҫкө һул мөйөш","block.minecraft.dead_brain_coral_fan":"Үле елпеүесле мейе мәрйен","block.minecraft.banner.flower.white":"Аҡ сәскә","item.minecraft.bone_meal":"Һөйәк оно","block.minecraft.banner.triangle_bottom.red":"Ҡыҙыл осо","block.minecraft.cyan_carpet":"Фирүзә келәм","block.minecraft.oak_door":"Имән ишеге","block.minecraft.flowering_azalea_leaves":"Гөлләгән азалия япраҡтары","item.minecraft.prismarine_crystals":"Призмарин кристалы","block.minecraft.banner.diagonal_left.cyan":"Фирүзә һулға киселеш","block.minecraft.banner.stripe_bottom.light_blue":"Зәңгәр нигеҙ","item.minecraft.tipped_arrow.effect.slow_falling":"Талғын йығылыу уғы","block.minecraft.end_stone":"Эндерташ","block.minecraft.potted_white_tulip":"Ултыртылған аҡ ләлә","block.minecraft.warped_door":"Боҙолған ишек","block.minecraft.banner.square_top_left.light_gray":"Аҡһыл һоро өҫкө уң мөйөш","item.minecraft.splash_potion.effect.fire_resistance":"Шарлай торған утҡа сыҙамлылыҡ эсемлеге","block.minecraft.banner.half_vertical_right.pink":"Алһыу уң яҡ","item.minecraft.furnace_minecart":"Вагонетка мейес менән","block.minecraft.banner.triangles_bottom.light_gray":"Аҡһыл һоро тешле нигеҙ","item.minecraft.shield.red":"Ҡыҙыл ҡалҡан","block.minecraft.quartz_pillar":"Кварц бағанаһы","block.minecraft.prismarine_slab":"Призмарин плитаһы","block.minecraft.nether_portal":"Неҙер порталы","item.minecraft.diamond_sword":"Алмас ҡылыс","block.minecraft.oak_planks":"Имән таҡталары","item.minecraft.amethyst_shard":"Аметист ярсығы","block.minecraft.purple_banner":"Шәмәхә байраҡ","block.minecraft.structure_void":"Буш ҡорамаһы","block.minecraft.purple_shulker_box":"Шәмәхә шалкер тартмаһы","block.minecraft.potatoes":"Бәрәңге","block.minecraft.light_blue_bed":"Зәңгәр карауат","block.minecraft.yellow_banner":"Һары байраҡ","item.modifiers.head":"Башта:","item.minecraft.potion.effect.swiftness":"Тиҙлек эсемлеге","block.minecraft.glass_pane":"Биҙәкле быяла","block.minecraft.clay":"Балсыҡ","block.minecraft.banner.diagonal_right.cyan":"Фирүзә киҫелеше","block.minecraft.cut_copper_slab":"Һырлы баҡыр плитаһы","block.minecraft.polished_diorite_slab":"Шымартылған диорит плитаһы","block.minecraft.banner.piglin.green":"Йәшел томшоLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brauns Keramik","block.minecraft.lapis_ore":"Lapislazulierz","item.minecraft.gray_dye":"Graua Foabstoff","block.minecraft.banner.base.yellow":"Voiständig gejbs Feld","block.minecraft.terracotta":"Keramik","item.minecraft.stray_spawn_egg":"Eiswondera-Spawn-Oa","block.minecraft.banner.base.pink":"Voiständig rosa Feld","item.minecraft.potion.effect.weakness":"Trank da Schwäche","block.minecraft.dark_prismarine_slab":"Dunkle Prismarinstufe","item.minecraft.splash_potion.effect.thick":"Dickflüssiga Wurftrank","item.minecraft.cooked_cod":"Gebranter Kabeljau","block.minecraft.red_nether_brick_slab":"Rode Netherzieglschdiang","block.minecraft.yellow_terracotta":"Gejbs Keramik","block.minecraft.observer":"Beobachta","block.minecraft.banner.stripe_bottom.cyan":"Türkisa Bannerfuaß","block.minecraft.banner.creeper.purple":"Violetta Creeper","block.minecraft.banner.straight_cross.cyan":"Türkis' Kreiz","block.minecraft.banner.half_horizontal_bottom.brown":"Unten braun g'teilt","item.minecraft.firework_star.shape.large_ball":"Große Kugl","block.minecraft.prismarine_brick_slab":"Prismarinzieglstufe","block.minecraft.jungle_trapdoor":"Tropnhoizklappdierl","block.minecraft.sculk_sensor":"Sculk-Sensor","block.minecraft.banner.creeper.orange":"Oranga Creeper","block.minecraft.banner.triangles_top.lime":"Giftgreans gspickelta Bannerhaupt","item.minecraft.charcoal":"Hoizkuin","item.minecraft.tipped_arrow.effect.night_vision":"Nachtsichtpfeil","block.minecraft.stone_brick_slab":"Stoaziegelstufe","block.minecraft.banner.mojang.cyan":"Türkis' Mojang-Logo","block.minecraft.white_stained_glass":"Weißes Glas","item.minecraft.bowl":"Schüssl","block.minecraft.banner.diagonal_up_left.magenta":"Magenta schrägrechts geteilt (Invertiert)","block.minecraft.banner.square_top_right.light_gray":"Höigraues linkes Obaeck","block.minecraft.dead_brain_coral_fan":"Dooda Hirnkorallnfächa","block.minecraft.banner.flower.white":"Weiße Bleame","item.minecraft.bone_meal":"Boanenmej","block.minecraft.banner.triangle_bottom.red":"Roude hoibe Spitze","block.minecraft.cyan_carpet":"Türkisa Teppich","block.minecraft.oak_door":"Oachenhoiztia","block.minecraft.flowering_azalea_leaves":"Blühende Azaleenbladl","item.minecraft.prismarine_crystals":"Prismarinkristalle","block.minecraft.banner.diagonal_left.cyan":"Türkis schräglinks geteilt","block.minecraft.banner.stripe_bottom.light_blue":"Höiblaua Bannerfuaß","item.minecraft.tipped_arrow.effect.slow_falling":"Pfeil des sanften Falls","block.minecraft.end_stone":"Endstoa","block.minecraft.potted_white_tulip":"Eidopfte weiße Tulpe","block.minecraft.warped_door":"Wirrtia","block.minecraft.banner.square_top_left.light_gray":"Höigraues rechtes Obaeck","item.minecraft.splash_potion.effect.fire_resistance":"Wurftrank da Feiaresistenz","block.minecraft.banner.half_vertical_right.pink":"Links rosa g'spaltn","item.minecraft.furnace_minecart":"Ontriebslore","block.minecraft.banner.triangles_bottom.light_gray":"Höigraua gspickelta Bannerfuaß","item.minecraft.shield.red":"Roude Schuidl","block.minecraft.quartz_pillar":"Quarzsäule","block.minecraft.prismarine_slab":"Prismarinstufe","block.minecraft.nether_portal":"Netherportal","item.minecraft.diamond_sword":"Diamantschwert","block.minecraft.oak_planks":"Oachenhoizbretta","item.minecraft.amethyst_shard":"Amethystscherbe","block.minecraft.purple_banner":"Lila Banner","block.minecraft.structure_void":"Konstruktionsleere","block.minecraft.purple_shulker_box":"Violette Shulker-Kiste","block.minecraft.potatoes":"Eadäpfe","block.minecraft.light_blue_bed":"Höiblaues Bett","block.minecraft.yellow_banner":"Gelba Banner","item.modifiers.head":"Af dem Schädl:","item.minecraft.potion.effect.swiftness":"Trank da Schnelligkeit","block.minecraft.glass_pane":"Glasscheibe","block.minecraft.clay":"Ton","block.minecraft.banner.diagonal_right.cyan":"Türkis schrägrechts geteilt","block.minecraft.cut_copper_slab":"Geschnittene Kupfastufe","block.minecraft.polished_diorite_slab":"Polierte Dioritstufe","block.minecraft.banner.piglin.green":"Greane Schnauze","item.minecraft.splash_potion.effect.slow_falling":"Wurftrank des sanftn Fois","item.minecraft.book":"Buach","block.minecraft.banner.gradient.brown":"Brauna Foabverlaff","block.minecraft.banner.cross.magenta":"Magenta Andreaskreiz","block.minecraft.cobblestone_slab":"Bruchstoastufe","block.minecraft.banner.diagonal_right.purple":"Violett schrägrechts geteilt","block.minecraft.banner.curly_border.gray":"Graua Spicklbord","block.minecraft.big_dripleaf":"Groußes Dropfbladl","block.minecraft.black_shulker_box":"Schwoaze Shulker-Kiste","block.minecraft.banner.straight_cross.purple":"Violetts Kreiz","block.minecraft.blackstone_stairs":"Schwoazstoaschdiang","block.minecraft.banner.triangles_top.blue":"Blaus gspickelta Bannerhaupt","block.minecraft.deepslate_tile_slab":"Diafnschiefafliesnstufe","block.minecraft.banner.square_top_left.blue":"Blaus rechtes Obaeck","block.minecraft.bannerLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Карычневая кераміка","block.minecraft.lapis_ore":"Лазурытавая руда","item.minecraft.gray_dye":"Шэры фарбавальнік","block.minecraft.banner.base.yellow":"Цалкам жоўтае поле","block.minecraft.terracotta":"Кераміка","item.minecraft.stray_spawn_egg":"Яйка прызыву - Бадзяга","block.minecraft.banner.base.pink":"Цалкам ружовае поле","item.minecraft.potion.effect.weakness":"Зелле кволасці","block.minecraft.dark_prismarine_slab":"Пліта з цёмнага прызмарыну","item.minecraft.splash_potion.effect.thick":"Густое выбухное зелле","item.minecraft.cooked_cod":"Смажаная траска","block.minecraft.red_nether_brick_slab":"Пліта з чырвонай нэдарскай цэглы","block.minecraft.yellow_terracotta":"Жоўтая кераміка","block.minecraft.observer":"Назіральнік","block.minecraft.banner.stripe_bottom.cyan":"Бірузовы падножак","block.minecraft.banner.creeper.purple":"Фіялетавая фігура крыпера","block.minecraft.banner.straight_cross.cyan":"Бірузовы крыж","block.minecraft.banner.half_horizontal_bottom.brown":"Карычневая ніжняя палова","item.minecraft.firework_star.shape.large_ball":"Вялікі шар","block.minecraft.prismarine_brick_slab":"Пліта з прызмарынавай цэглы","block.minecraft.jungle_trapdoor":"Люк з трапічнай драўніны","block.minecraft.sculk_sensor":"Скалкавы сэнсар","block.minecraft.banner.creeper.orange":"Аранжавая фігура крыпера","block.minecraft.banner.triangles_top.lime":"Лаймавая зубчастая вяршыня","item.minecraft.charcoal":"Драўняны вугаль","item.minecraft.tipped_arrow.effect.night_vision":"Страла начнога зроку","block.minecraft.stone_brick_slab":"Пліта з каменнай цэглы","block.minecraft.banner.mojang.cyan":"Бірузовы лагатып Mojang","block.minecraft.white_stained_glass":"Белае шкло","item.minecraft.bowl":"Міска","block.minecraft.banner.diagonal_up_left.magenta":"Пурпурная ніжняя левая палова","block.minecraft.banner.square_top_right.light_gray":"Светла-шэры верхні кут справа","block.minecraft.dead_brain_coral_fan":"Мёртвы веерны мазгавы карал","block.minecraft.banner.flower.white":"Белая фігура кветкі","item.minecraft.bone_meal":"Касцявая мука","block.minecraft.banner.triangle_bottom.red":"Чырвонае скарочанае вастрыё","block.minecraft.cyan_carpet":"Бірузовы дыван","block.minecraft.oak_door":"Дубовыя дзверы","block.minecraft.flowering_azalea_leaves":"Лісце квітнеючай азаліі","item.minecraft.prismarine_crystals":"Крышталі прызмарыну","block.minecraft.banner.diagonal_left.cyan":"Бірузовая верхняя левая палова","block.minecraft.banner.stripe_bottom.light_blue":"Блакітны падножак","item.minecraft.tipped_arrow.effect.slow_falling":"Страла павольнага падзення","block.minecraft.end_stone":"Камень Энда","block.minecraft.potted_white_tulip":"Белы цюльпан у гаршку","block.minecraft.warped_door":"Скажоныя дзверы","block.minecraft.banner.square_top_left.light_gray":"Светла-шэры верхні кут злева","item.minecraft.splash_potion.effect.fire_resistance":"Выбухное зелле вогнеўстойлівасці","block.minecraft.banner.half_vertical_right.pink":"Ружовая правая палова","item.minecraft.furnace_minecart":"Ваганетка з печкай","block.minecraft.banner.triangles_bottom.light_gray":"Светла-шэры зубчасты падножак","item.minecraft.shield.red":"Чырвоны шчыт","block.minecraft.quartz_pillar":"Кварцавая калона","block.minecraft.prismarine_slab":"Пліта з прызмарыну","block.minecraft.nether_portal":"Партал у Нэдар","item.minecraft.diamond_sword":"Дыяментавы меч","block.minecraft.oak_planks":"Дубовыя дошкі","item.minecraft.amethyst_shard":"Асколак аметысту","block.minecraft.purple_banner":"Фіялетавы сцяг","block.minecraft.structure_void":"Пустата","block.minecraft.purple_shulker_box":"Фіялетавая шалкеравая скрыня","block.minecraft.potatoes":"Бульба","block.minecraft.light_blue_bed":"Блакітны ложак","block.minecraft.yellow_banner":"Жоўты сцяг","item.modifiers.head":"Калі апранута на галаву:","item.minecraft.potion.effect.swiftness":"Зелле хуткасці"Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Кафява теракота","block.minecraft.lapis_ore":"Лазуритна руда","item.minecraft.gray_dye":"Сива боя","block.minecraft.banner.base.yellow":"Напълно жълт плат","block.minecraft.terracotta":"Теракота","item.minecraft.stray_spawn_egg":"Яйце на скелет скитник","block.minecraft.banner.base.pink":"Напълно розов плат","item.minecraft.potion.effect.weakness":"Отвара на слабостта","block.minecraft.dark_prismarine_slab":"Плоча от тъмен призмарин","item.minecraft.splash_potion.effect.thick":"Гъста разплискваща се отвара","item.minecraft.cooked_cod":"Печена треска","block.minecraft.red_nether_brick_slab":"Плоча от червени тухли от Недъра","block.minecraft.yellow_terracotta":"Жълта теракота","block.minecraft.observer":"Наблюдател","block.minecraft.banner.stripe_bottom.cyan":"Синьозелена хоризонтална лента","block.minecraft.banner.creeper.purple":"Лилава фигура на крийпър","block.minecraft.banner.straight_cross.cyan":"Синьозелен кръст","block.minecraft.banner.half_horizontal_bottom.brown":"Кафяво долно пресичане","item.minecraft.firework_star.shape.large_ball":"Голяма топка","block.minecraft.prismarine_brick_slab":"Плоча от призмаринови тухли","block.minecraft.jungle_trapdoor":"Джунглов люк","block.minecraft.sculk_sensor":"Скълк сензор","block.minecraft.banner.creeper.orange":"Оранжева фигура на крийпър","block.minecraft.banner.triangles_top.lime":"Жълтозелени горни зъбци","item.minecraft.charcoal":"Дървени въглища","item.minecraft.tipped_arrow.effect.night_vision":"Стрела на нощното виждане","block.minecraft.stone_brick_slab":"Плоча от каменни тухли","block.minecraft.banner.mojang.cyan":"Синьозелено нещо","block.minecraft.white_stained_glass":"Бяло стъкло","item.minecraft.bowl":"Купа","block.minecraft.banner.diagonal_up_left.magenta":"Пурпурно обърнато скосяване","block.minecraft.banner.square_top_right.light_gray":"Светлосив ляв горен кантон","block.minecraft.dead_brain_coral_fan":"Мъртъв мозъчен мек корал","block.minecraft.banner.flower.white":"Бяла фигура на цвете","item.minecraft.bone_meal":"Стрити кости","block.minecraft.banner.triangle_bottom.red":"Червен шеврон","block.minecraft.cyan_carpet":"Синьозелен килим","block.minecraft.oak_door":"Дъбова врата","block.minecraft.flowering_azalea_leaves":"Цъфтящи азалиеви листа","item.minecraft.prismarine_crystals":"Призмаринови кристали","block.minecraft.banner.diagonal_left.cyan":"Синьозелено скосяване наляво","block.minecraft.banner.stripe_bottom.light_blue":"Светлосиня хоризонтална лента","item.minecraft.tipped_arrow.effect.slow_falling":"Стрела на бавното падане","block.minecraft.end_stone":"Камък от Края","block.minecraft.potted_white_tulip":"Саксия с бяло лале","block.minecraft.warped_door":"Шантава врата","block.minecraft.banner.square_top_left.light_gray":"Светлосив десен горен кантон","item.minecraft.splash_potion.effect.fire_resistance":"Разплискваща се отвара на огнената устойчивост","block.minecraft.banner.half_vertical_right.pink":"Розово ляво разсичане","item.minecraft.furnace_minecart":"Вагонетка с пещ","block.minecraft.banner.triangles_bottom.light_gray":"Светлосиви долни зъбци","item.minecraft.shield.red":"Червен щит","block.minecraft.quartz_pillar":"Кварцова колона","block.minecraft.prismarine_slab":"Призмаринова плоча","block.minecraft.nether_portal":"Портал към Недъра","item.minecraft.diamond_sword":"Диамантен меч","block.minecraft.oak_planks":"Дъбови дъски","item.minecraft.amethyst_shard":"Късче аметист","block.minecraft.purple_banner":"Лилаво знаме","block.minecraft.structure_void":"Конструкционна празнота","block.minecraft.purple_shulker_box":"Лилава шулкърова кутия","block.minecraft.potatoes":"Картофи","block.minecraft.light_blue_bed":"Светлосиньо легло","block.minecraft.yellow_banner":"Жълто знаме","item.modifiers.head":"Когато на Главата:","item.minecraft.potion.effect.swiftness":"Отвара на скоростта","block.minecraft.glass_pane":"СтLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Pri poazh gell","block.minecraft.lapis_ore":"Kailh Lapis Lazuli","item.minecraft.gray_dye":"Livadur griz","block.minecraft.terracotta":"Pri poazh","item.minecraft.stray_spawn_egg":"Vi ganerez kantreerien","item.minecraft.potion.effect.weakness":"Braou gwander","block.minecraft.dark_prismarine_slab":"Dar prismarine teñval","item.minecraft.splash_potion.effect.thick":"Braou tev taoladus","item.minecraft.cooked_cod":"Moru poazh","block.minecraft.red_nether_brick_slab":"Dar brikenn ruz an nether","block.minecraft.yellow_terracotta":"Pri poazh melen","block.minecraft.observer":"Arvester","block.minecraft.banner.stripe_bottom.cyan":"Tostal sian","block.minecraft.banner.creeper.purple":"Penn Creeper mouk","block.minecraft.banner.straight_cross.cyan":"Kroaz sian","block.minecraft.banner.half_horizontal_bottom.brown":"Troc'het, gell da eil","item.minecraft.firework_star.shape.large_ball":"Bolotenn vras","block.minecraft.prismarine_brick_slab":"Dar brikenn Prismarine","block.minecraft.jungle_trapdoor":"Trap koad janglenn","block.minecraft.banner.creeper.orange":"Penn Creeper aouraval","block.minecraft.banner.triangles_top.lime":"Milginoù geoted sklaer ouzh kab","item.minecraft.charcoal":"Glaou koad","item.minecraft.tipped_arrow.effect.night_vision":"Bir gwelet en noz","block.minecraft.stone_brick_slab":"Dar brikenn vaen","block.minecraft.banner.mojang.cyan":"Arouez sian","block.minecraft.white_stained_glass":"Gwer tarchet gwenn","item.minecraft.bowl":"Bolenn","block.minecraft.banner.diagonal_up_left.magenta":"Benet, limestra da eil","block.minecraft.banner.square_top_right.light_gray":"Konk arc'hant griz ouzh kab kleiz","block.minecraft.dead_brain_coral_fan":"Aveler koural empenn marv","block.minecraft.banner.flower.white":"Bleunienn ac'hant","item.minecraft.bone_meal":"Poultr eskern","block.minecraft.banner.triangle_bottom.red":"Mantellet en gul","block.minecraft.cyan_carpet":"Pallenn sian","block.minecraft.oak_door":"Dor zerv","item.minecraft.prismarine_crystals":"Strink Prismarine","block.minecraft.banner.diagonal_left.cyan":"Skejet, sian e kentañ","block.minecraft.banner.stripe_bottom.light_blue":"Tostal glazur sklaer","item.minecraft.tipped_arrow.effect.slow_falling":"Bir kouezhañ gorrek","block.minecraft.end_stone":"Roc'h an End","block.minecraft.potted_white_tulip":"Podad tulipezenn wenn","block.minecraft.banner.square_top_left.light_gray":"Konk arc'hant griz ouzh kab dehoù","item.minecraft.splash_potion.effect.fire_resistance":"Braou dalc'husted d'an tan taoladus","block.minecraft.banner.half_vertical_right.pink":"Rannet, en-gwirion da eil","item.minecraft.furnace_minecart":"Bagon vengleuz gant ur forn","block.minecraft.banner.triangles_bottom.light_gray":"Milginoù arc'hant griz ouzh beg","item.minecraft.shield.red":"Skoed ruz","block.minecraft.quartz_pillar":"Peul kouarz","block.minecraft.prismarine_slab":"Dar prismarine","block.minecraft.nether_portal":"Dor-dal an Nether","item.minecraft.diamond_sword":"Kleze diamant","block.minecraft.oak_planks":"Plankennoù derv","block.minecraft.purple_banner":"Banniel mouk","block.minecraft.structure_void":"Goullonder frammad","block.minecraft.purple_shulker_box":"Boest Shulker Limestra","block.minecraft.potatoes":"Avaloù-douar","block.minecraft.light_blue_bed":"Gwele glas sklaer","block.minecraft.yellow_banner":"Banniel melen","item.minecraft.potion.effect.swiftness":"Braou primder","block.minecraft.glass_pane":"Gwerenn","block.minecraft.clay":"Pri","block.minecraft.banner.diagonal_right.cyan":"Benet, sian e kentañ","block.minecraft.polished_diorite_slab":"Dar diorit lufret","item.minecraft.splash_potion.effect.slow_falling":"Braou strink kouezhañ gorrek","item.minecraft.book":"Levr","block.minecraft.banner.gradient.brown":"Ilrezenn gell","block.minecraft.banner.cross.magenta":"Lammell limestra","block.minecraft.cobblestone_slab":"Dar maen","block.minecraft.banner.diagonal_right.purple":"Benet, mouk e kentañ","block.minecraft.banner.curly_border.gray":"Bevenn korzennek griz","block.minecraft.black_shulker_box":"Boest Shulker Du","block.minecraft.banner.straight_cross.purple":"Kroaz mouk","block.minecraft.banner.triangles_top.blue":"Milginoù glazur ouzh kab","block.minecraft.banner.square_top_left.blue":"Konk glazur ouzh kab dehoù","block.minecraft.banner.stripe_center.yellow":"Peul aour","item.minecraft.firework_star.cyan":"Sian","block.minecraft.brick_slab":"Dar brikenn","block.minecraft.banner.triangle_top.lime":"Mantellet geoted sklaer c'hweniet","block.minecraft.potted_dead_bush":"Podad bochad gwez marv","block.minecraft.banner.half_horizontal.brown":"Troc'het, gell da gentañ","item.minecraft.apple":"Aval","block.minecraft.brown_wool":"Gloan gell","item.minecraft.splash_potion.effect.water":"Boutailhad dour taoladus","block.minecraft.banner.diagonal_right.red":"Benet, en gul e kentañ","item.minecraft.bone":"Askorn","block.minecraft.polished_andesite":"Andezit lufret","block.minecraft.banner.straight_cross.orange":Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brèùn terracotta","block.minecraft.lapis_ore":"Lapis lazuli-erts","item.minecraft.gray_dye":"Grèèze koleurstobber","block.minecraft.banner.base.yellow":"Gèèl veld","block.minecraft.terracotta":"Terracotta","item.minecraft.stray_spawn_egg":"Verdwaoldespawnei","block.minecraft.banner.base.pink":"Raaze veld","item.minecraft.potion.effect.weakness":"Draank der zwakhèèd","block.minecraft.dark_prismarine_slab":"Doenkerprismarienplôat","item.minecraft.splash_potion.effect.thick":"Spattende stroperège draank","item.minecraft.cooked_cod":"Gebakken kabeljauw","block.minecraft.red_nether_brick_slab":"Rooie Netherbakstienen plôat","block.minecraft.yellow_terracotta":"Gèèl terracotta","block.minecraft.observer":"Observeerder","block.minecraft.banner.stripe_bottom.cyan":"Cyaan Basis","block.minecraft.banner.creeper.purple":"Péérs Creeperwapen","block.minecraft.banner.straight_cross.cyan":"Cyaan kruis","block.minecraft.banner.half_horizontal_bottom.brown":"Bruin omgekeerd gebalkt","item.minecraft.firework_star.shape.large_ball":"Groewte bal","block.minecraft.prismarine_brick_slab":"Prismarienblokstiene plôat","block.minecraft.jungle_trapdoor":"Oerwoudhoutere vaalluuk","block.minecraft.sculk_sensor":"Sculksensor","block.minecraft.banner.creeper.orange":"Oranje Creeper symbool","block.minecraft.banner.triangles_top.lime":"Lichtgroen-gegolfd hoofd","item.minecraft.charcoal":"Houtskôol","item.minecraft.tipped_arrow.effect.night_vision":"Pèèl der nachtzicht","block.minecraft.stone_brick_slab":"Blokstiene plôat","block.minecraft.banner.mojang.cyan":"Cyaan ding","block.minecraft.white_stained_glass":"Wietgekleurd glaos","item.minecraft.bowl":"Kom","block.minecraft.banner.diagonal_up_left.magenta":"Magenta omgekeerd schuin-rechts verdeeld","block.minecraft.banner.square_top_right.light_gray":"Lichtgrijs hoofd sinister kanton","block.minecraft.dead_brain_coral_fan":"Dooie hersenkoraalwaojer","block.minecraft.banner.flower.white":"Witte bloem","item.minecraft.bone_meal":"Beendermeel","block.minecraft.banner.triangle_bottom.red":"Rode keper","block.minecraft.cyan_carpet":"Turquoise tapijt","block.minecraft.oak_door":"Èèkehoutere deur","block.minecraft.flowering_azalea_leaves":"Bloeiende azaleabloajer","item.minecraft.prismarine_crystals":"Prismarienkristalle","block.minecraft.banner.diagonal_left.cyan":"Cyaan schuin-links verdeeld","block.minecraft.banner.stripe_bottom.light_blue":"Lichtblauwe basis","item.minecraft.tipped_arrow.effect.slow_falling":"Pèèl der valvertraoging","block.minecraft.end_stone":"Endstien","block.minecraft.potted_white_tulip":"Opgepotte wiete tullep","block.minecraft.warped_door":"Spoèkaetige houtere deure","block.minecraft.banner.square_top_left.light_gray":"Lichtgrijs hoofd dexter kanton","item.minecraft.splash_potion.effect.fire_resistance":"Spattende draank der vuurbestendeghèèd","block.minecraft.banner.half_vertical_right.pink":"Roze omgekeerd gebalkt","item.minecraft.furnace_minecart":"Mijnkar meej oove","block.minecraft.banner.triangles_bottom.light_gray":"Lichtgrijs-gegolfde basis","item.minecraft.shield.red":"Rooi schild","block.minecraft.quartz_pillar":"Kwertspeleer","block.minecraft.prismarine_slab":"Prismarienplôat","block.minecraft.nether_portal":"Netherpertaol","item.minecraft.diamond_sword":"Diamanten zwaord","block.minecraft.oak_planks":"Èèkehoutere plaank","item.minecraft.amethyst_shard":"Amethistscherf","block.minecraft.purple_banner":"Péérse banier","block.minecraft.structure_void":"Konstruksieleegte","block.minecraft.purple_shulker_box":"Péérse shulkerdoâs","block.minecraft.potatoes":"Aerpels","block.minecraft.light_blue_bed":"Liechtblaaw bed","block.minecraft.yellow_banner":"Gele banier","item.modifiers.head":"Hoeneer op ut hoofd:","item.minecraft.potion.effect.swiftness":"Draank der vlothèèd","block.minecraft.glass_pane":"Glaoze rute","block.minecraft.clay":"Klaai","block.minecraft.banner.diagonal_right.cyan":"Cyaan schuin-rechts verdeeld","block.minecraft.cut_copper_slab":"Gesneje kopere plôat","block.minecraft.polished_diorite_slab":"Gepolèèste diorietplôat","block.minecraft.banner.piglin.green":"Grijze snuit","item.minecraft.splash_potion.effect.slow_falling":"Spattende draank der valvertraoging","item.minecraft.book":"Buuk","block.minecraft.banner.gradient.brown":"Bruin gradiënt","block.minecraft.banner.cross.magenta":"Magenta andreaskruis","block.minecraft.cobblestone_slab":"Keistienen plôat","block.minecraft.banner.diagonal_right.purple":"Péérse per band","block.minecraft.banner.curly_border.gray":"Grijs ingesprongen borduursel","block.minecraft.big_dripleaf":"Groewt drèùpblad","block.minecraft.black_shulker_box":"Zwerte shulkerdoâs","block.minecraft.banner.straight_cross.purple":"Péérs kruis","block.minecraft.blackstone_stairs":"Zwertstienen trep","block.minecraft.banner.triangles_top.blue":"Blauw-gegolfd hoofd","block.minecraft.deepslate_tile_slab":"Wrevelstienen tegelplôat","block.minecraft.Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Braon Terakota","block.minecraft.lapis_ore":"Ruda Lapiza","item.minecraft.gray_dye":"Sivi pigment","block.minecraft.banner.base.yellow":"Potpuno žuto polje","block.minecraft.terracotta":"Terakota","item.minecraft.stray_spawn_egg":"Jaje lutalice","block.minecraft.banner.base.pink":"Potpuno ružičasto polje","item.minecraft.potion.effect.weakness":"Napitak slabosti","block.minecraft.dark_prismarine_slab":"Ploča od tamnog prizmarina","item.minecraft.splash_potion.effect.thick":"Gusti rasprskujući napitak","item.minecraft.cooked_cod":"Isprženi bakalar","block.minecraft.red_nether_brick_slab":"Crvena Ploča Od Neder Cigle","block.minecraft.yellow_terracotta":"Žuta Terakota","block.minecraft.observer":"Posmatrač","block.minecraft.banner.stripe_bottom.cyan":"Cijan donji dio","block.minecraft.banner.creeper.purple":"Ljubičasti kriper","block.minecraft.banner.straight_cross.cyan":"Cijan krst","block.minecraft.banner.half_horizontal_bottom.brown":"Braon obrnuta puna pruga","item.minecraft.firework_star.shape.large_ball":"Velika lopta","block.minecraft.prismarine_brick_slab":"Prizmarinsko Ciglasta Ploča","block.minecraft.jungle_trapdoor":"Poklopac od džungle","block.minecraft.sculk_sensor":"Sculk senzor","block.minecraft.banner.creeper.orange":"Narandžasti kriper","block.minecraft.banner.triangles_top.lime":"Svijetlo zeleni uvučeni vrh","item.minecraft.charcoal":"Drveni ugalj","item.minecraft.tipped_arrow.effect.night_vision":"Strelica noćnog vida","block.minecraft.stone_brick_slab":"Ploča od kamene cigle","block.minecraft.banner.mojang.cyan":"Cijan stvar","block.minecraft.white_stained_glass":"Bijelo staklo","item.minecraft.bowl":"Posuda","block.minecraft.banner.diagonal_up_left.magenta":"Purpurnocrvena obrnuta puna dijagonala","block.minecraft.banner.square_top_right.light_gray":"Svijetlo sivi gornji lijevi kanton","block.minecraft.dead_brain_coral_fan":"Lepeza od mrtvog mozgastog korala","block.minecraft.banner.flower.white":"Bijeli cvijet","item.minecraft.bone_meal":"Koštano brašno","block.minecraft.banner.triangle_bottom.red":"Crveni trougao","block.minecraft.cyan_carpet":"Cijan tepih","block.minecraft.oak_door":"Vrata od hrasta","block.minecraft.flowering_azalea_leaves":"Cvatući azaleja listovi","item.minecraft.prismarine_crystals":"Kristal prizmarina","block.minecraft.banner.diagonal_left.cyan":"Cijan lijeva puna dijagonala","block.minecraft.banner.stripe_bottom.light_blue":"Svijetlo plavi donji dio","item.minecraft.tipped_arrow.effect.slow_falling":"Strijela sporog padanja","block.minecraft.end_stone":"Enderski Kamen","block.minecraft.potted_white_tulip":"Bijeli tulipan u saksiji","block.minecraft.warped_door":"Izopačena vrata","block.minecraft.banner.square_top_left.light_gray":"Svijetlo sivi gornji desni kanton","item.minecraft.splash_potion.effect.fire_resistance":"Rasprskujući napitak otpornosti na vatru","block.minecraft.banner.half_vertical_right.pink":"Roza obrnuta puna traka","item.minecraft.furnace_minecart":"Vagon sa Peći","block.minecraft.banner.triangles_bottom.light_gray":"Svijetlo siva uvučena osnova","item.minecraft.shield.red":"Crveni štit","block.minecraft.quartz_pillar":"Kvarcni stub","block.minecraft.prismarine_slab":"Ploča od prizmarina","block.minecraft.nether_portal":"Pakleni Portal","item.minecraft.diamond_sword":"Dijamantski Mač","block.minecraft.oak_planks":"Daska od hrasta","item.minecraft.amethyst_shard":"Krhotina ametista","block.minecraft.purple_banner":"Ljubičasta zastava","block.minecraft.structure_void":"Strukturna praznina","block.minecraft.purple_shulker_box":"Ljubičasta kutija shulkera","block.minecraft.potatoes":"Krompiri","block.minecraft.light_blue_bed":"Svijetlo plavi krevet","block.minecraft.yellow_banner":"Žuta zastava","item.modifiers.head":"Kada je na glavi:","item.minecraft.potion.effect.swiftness":"Napitak brzine","block.minecraft.glass_pane":"Staklena ploča","block.minecraft.clay":"Glina","block.minecraft.banner.diagonal_right.cyan":"Cijan puna dijagonala","block.minecraft.cut_copper_slab":"Ploča od rezanog bakra","block.minecraft.polished_diorite_slab":"Glatka ploča od diorita","block.minecraft.banner.piglin.green":"Zelena njuška","item.minecraft.splash_potion.effect.slow_falling":"Rasprskujući napitak sporog padanja","item.minecraft.book":"Knjiga","block.minecraft.banner.gradient.brown":"Braon gradijent","block.minecraft.banner.cross.magenta":"Purpurnocrvena saltira","block.minecraft.cobblestone_slab":"Kamena ploča","block.minecraft.banner.diagonal_right.purple":"Ljubičasta puna dijagonala","block.minecraft.banner.curly_border.gray":"Sivi uvučeni okvir","block.minecraft.big_dripleaf":"Veliki kaplist","block.minecraft.black_shulker_box":"Crna Kutija Shulkera","block.minecraft.banner.straight_cross.purple":"Ljubičasti krst","block.minecraft.blackstone_stairs":"Stepenice od crnog kamena","block.minecraft.banner.triangles_top.blue":"Plavi uvučeni vrh","block.minecraft.deepslate_tile_slab":"PlLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota marró","block.minecraft.lapis_ore":"Mena de lapislàtzuli","item.minecraft.gray_dye":"Tint gris","block.minecraft.banner.base.yellow":"Camp d'or","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Generar esquelet extraviat","block.minecraft.banner.base.pink":"Camp rosa","item.minecraft.potion.effect.weakness":"Poció debilitant","block.minecraft.dark_prismarine_slab":"Llosa de prismarina fosca","item.minecraft.splash_potion.effect.thick":"Poció densa llancívola","item.minecraft.cooked_cod":"Bacallà cuit","block.minecraft.red_nether_brick_slab":"Llosa de maons del Nether vermells","block.minecraft.yellow_terracotta":"Terracota groga","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Peu cian","block.minecraft.banner.creeper.purple":"Cara de creeper porpra","block.minecraft.banner.straight_cross.cyan":"Creu cian","block.minecraft.banner.half_horizontal_bottom.brown":"Truncat, 2n marró","item.minecraft.firework_star.shape.large_ball":"Esfera gran","block.minecraft.prismarine_brick_slab":"Llosa de maons de prismarina","block.minecraft.jungle_trapdoor":"Trapa de jungla","block.minecraft.sculk_sensor":"Sensor sculk","block.minecraft.banner.creeper.orange":"Cara de creeper ataronjada","block.minecraft.banner.triangles_top.lime":"Cap dentat llima","item.minecraft.charcoal":"Carbó vegetal","item.minecraft.tipped_arrow.effect.night_vision":"Fletxa de visió nocturna","block.minecraft.stone_brick_slab":"Llosa de maons de roca","block.minecraft.banner.mojang.cyan":"Emblema cian","block.minecraft.white_stained_glass":"Vidre tenyit de blanc","item.minecraft.bowl":"Bol","block.minecraft.banner.diagonal_up_left.magenta":"Trinxat, 2n magenta","block.minecraft.banner.square_top_right.light_gray":"Cantó sinistre del cap d'argent","block.minecraft.dead_brain_coral_fan":"Gorgònia de cervell morta","block.minecraft.banner.flower.white":"Flor blanca","item.minecraft.bone_meal":"Farina d'ossos","block.minecraft.banner.triangle_bottom.red":"Gaiat a la punta de gules","block.minecraft.cyan_carpet":"Catifa cian","block.minecraft.oak_door":"Porta de pomer","block.minecraft.flowering_azalea_leaves":"Fulles d'azalea florida","item.minecraft.prismarine_crystals":"Cristalls de prismarina","block.minecraft.banner.diagonal_left.cyan":"Tallat, 1r cian","block.minecraft.banner.stripe_bottom.light_blue":"Peu blau cel","item.minecraft.tipped_arrow.effect.slow_falling":"Fletxa de caiguda lenta","block.minecraft.end_stone":"Roca de l'End","block.minecraft.potted_white_tulip":"Test amb tulipà blanc","block.minecraft.warped_door":"Porta guerxa","block.minecraft.banner.square_top_left.light_gray":"Cantó destre del cap d'argent","item.minecraft.splash_potion.effect.fire_resistance":"Poció de resistència ígnia llancívola","block.minecraft.banner.half_vertical_right.pink":"Partit, 2n rosa","item.minecraft.furnace_minecart":"Vagoneta amb forn","block.minecraft.banner.triangles_bottom.light_gray":"Peu dentat d'argent","item.minecraft.shield.red":"Escut vermell","block.minecraft.quartz_pillar":"Pilar de quars","block.minecraft.prismarine_slab":"Llosa de prismarina","block.minecraft.nether_portal":"Portal del Nether","item.minecraft.diamond_sword":"Espasa de diamant","block.minecraft.oak_planks":"Fusta de pomer","item.minecraft.amethyst_shard":"Fragment d\u2019ametista","block.minecraft.purple_banner":"Estendard de porpra","block.minecraft.structure_void":"Buit estructural","block.minecraft.purple_shulker_box":"Caixa de shulker lila","block.minecraft.potatoes":"Patates","block.minecraft.light_blue_bed":"Llit blau cel","block.minecraft.yellow_banner":"Estendard d'or","item.modifiers.head":"Al cap:","item.minecraft.potion.effect.swiftness":"Poció de velocitat","block.minecraft.glass_pane":"Panell de vidre","block.minecraft.clay":"Argila","block.minecraft.banner.diagonal_right.cyan":"Trinxat, 1r cian","block.minecraft.cut_copper_slab":"Llosa de coure tallat","block.minecraft.polished_diorite_slab":"Llosa de diorita polida","block.minecraft.banner.piglin.green":"Morro de sinople","item.minecraft.splash_potion.effect.slow_falling":"Poció llancívola de caiguda lenta","item.minecraft.book":"Llibre","block.minecraft.banner.gradient.brown":"Degradat marró","block.minecraft.banner.cross.magenta":"Sautor magenta","block.minecraft.cobblestone_slab":"Llosa de pedra","block.minecraft.banner.diagonal_right.purple":"Trinxat, 1r de porpra","block.minecraft.banner.curly_border.gray":"Bordura dentada grisa","block.minecraft.big_dripleaf":"Degotadora gran","block.minecraft.black_shulker_box":"Caixa de shulker negra","block.minecraft.banner.straight_cross.purple":"Creu de porpra","block.minecraft.blackstone_stairs":"Escales de roca negra","block.minecraft.banner.triangles_top.blue":"Cap dentat d'atzur","block.minecraft.deepslate_tile_slab":"Llosa de rajoles de pissarra","block.minecraft.banner.square_top_left.blue":"Cantó destre del cap d'atzur","blockLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Hnědá terakota","block.minecraft.lapis_ore":"Ložisko lazuritu","item.minecraft.gray_dye":"Šedé barvivo","block.minecraft.banner.base.yellow":"Žlutý list","block.minecraft.terracotta":"Terakota","item.minecraft.stray_spawn_egg":"Vajíčko s tulákem","block.minecraft.banner.base.pink":"Růžový list","item.minecraft.potion.effect.weakness":"Lektvar oslabení","block.minecraft.dark_prismarine_slab":"Půlblok z tmavého prismarínu","item.minecraft.splash_potion.effect.thick":"Vrhací hustý lektvar","item.minecraft.cooked_cod":"Pečená treska","block.minecraft.red_nether_brick_slab":"Půlblok z rudých netherových cihel","block.minecraft.yellow_terracotta":"Žlutá terakota","block.minecraft.observer":"Detektor změn","block.minecraft.banner.stripe_bottom.cyan":"Azurová pata","block.minecraft.banner.creeper.purple":"Fialová tvář creepera","block.minecraft.banner.straight_cross.cyan":"Azurový kříž","block.minecraft.banner.half_horizontal_bottom.brown":"Hnědé dolní dělení","item.minecraft.firework_star.shape.large_ball":"Velká koule","block.minecraft.prismarine_brick_slab":"Půlblok z prismarínových cihel","block.minecraft.jungle_trapdoor":"Poklop z tropického dřeva","block.minecraft.sculk_sensor":"Sculkové čidlo","block.minecraft.banner.creeper.orange":"Oranžová tvář creepera","block.minecraft.banner.triangles_top.lime":"Světle zelený horní obloučkový lem","item.minecraft.charcoal":"Dřevěné uhlí","item.minecraft.tipped_arrow.effect.night_vision":"Šíp vidění ve tmě","block.minecraft.stone_brick_slab":"Půlblok z kamenných cihel","block.minecraft.banner.mojang.cyan":"Azurový znak","block.minecraft.white_stained_glass":"Bílé sklo","item.minecraft.bowl":"Miska","block.minecraft.banner.diagonal_up_left.magenta":"Purpurové dolní kosmé dělení","block.minecraft.banner.square_top_right.light_gray":"Světle šedá horní levá čtvrť","block.minecraft.dead_brain_coral_fan":"Blok mrtvého mozkového korálu","block.minecraft.banner.flower.white":"Bílý květ","item.minecraft.bone_meal":"Kostní moučka","block.minecraft.banner.triangle_bottom.red":"Červený hrot snížený do poloviny","block.minecraft.cyan_carpet":"Azurový koberec","block.minecraft.oak_door":"Dubové dveře","block.minecraft.flowering_azalea_leaves":"Azalkové listí s květy","item.minecraft.prismarine_crystals":"Prismarínový krystal","block.minecraft.banner.diagonal_left.cyan":"Azurové horní šikmé dělení","block.minecraft.banner.stripe_bottom.light_blue":"Světle modrá pata","item.minecraft.tipped_arrow.effect.slow_falling":"Šíp snášení se","block.minecraft.end_stone":"Enderit","block.minecraft.potted_white_tulip":"Bílý tulipán v květináči","block.minecraft.warped_door":"Přízračné dveře","block.minecraft.banner.square_top_left.light_gray":"Světle šedá horní pravá čtvrť","item.minecraft.splash_potion.effect.fire_resistance":"Vrhací lektvar ohnivzdornosti","block.minecraft.banner.half_vertical_right.pink":"Růžové levé půlení","item.minecraft.furnace_minecart":"Parní vozík","block.minecraft.banner.triangles_bottom.light_gray":"Světle šedý dolní obloučkový lem","item.minecraft.shield.red":"Červený štít","block.minecraft.quartz_pillar":"Křemenný pilíř","block.minecraft.prismarine_slab":"Prismarínový půlblok","block.minecraft.nether_portal":"Portál do Netheru","item.minecraft.diamond_sword":"Diamantový meč","block.minecraft.oak_planks":"Dubová prkna","item.minecraft.amethyst_shard":"Ametystový střep","block.minecraft.purple_banner":"Fialový prapor","block.minecraft.structure_void":"Konstrukční void","block.minecraft.purple_shulker_box":"Fialová shulkerova schránka","block.minecraft.potatoes":"Brambory","block.minecraft.light_blue_bed":"Světle modrá postel","block.minecraft.yellow_banner":"Žlutý prapor","item.modifiers.head":"Když na hlavě:","item.minecraft.potion.effect.swiftness":"Lektvar svižnosti","block.minecraft.glass_pane":"Tabulka skla","block.minecraft.clay":"Blok jílu","block.minecraft.banner.diagonal_right.cyan":"Azurové horní kosmé dělení","block.minecraft.cut_copper_slab":"Půlblok z tepané mědi","block.minecraft.polished_diorite_slab":"Půlblok z leštěného dioritu","block.minecraft.banner.piglin.green":"Zelený rypák","item.minecraft.splash_potion.effect.slow_falling":"Vrhací lektvar pomalého padání","item.minecraft.book":"Kniha","block.minecraft.banner.gradient.brown":"Hnědý gradient shora dolů","block.minecraft.banner.cross.magenta":"Purpurový ondřejský kříž","block.minecraft.cobblestone_slab":"Půlblok z kamení","block.minecraft.banner.diagonal_right.purple":"Fialové horní kosmé dělení","block.minecraft.banner.curly_border.gray":"Šedá bordura","block.minecraft.big_dripleaf":"Velká krápenka","block.minecraft.black_shulker_box":"Černá shulkerova schránka","block.minecraft.banner.straight_cross.purple":"Fialový kříž","block.minecraLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracotta Brown","block.minecraft.lapis_ore":"Mwyn Lapis-Laswli","item.minecraft.gray_dye":"Llifyn Llwyd","block.minecraft.banner.base.yellow":"Maes Cwbwl Felyn","block.minecraft.terracotta":"Terracotta","item.minecraft.stray_spawn_egg":"Wy Geni Crwydryn","block.minecraft.banner.base.pink":"Maes Cwbwl Binc","item.minecraft.potion.effect.weakness":"Diod o Wendid","block.minecraft.dark_prismarine_slab":"Slab Prismarin Tywyll","item.minecraft.splash_potion.effect.thick":"Diod Tasgu Trwchus","item.minecraft.cooked_cod":"Penfras Rhost","block.minecraft.red_nether_brick_slab":"Slab Bricsen Nether Coch","block.minecraft.yellow_terracotta":"Terracotta Melyn","block.minecraft.observer":"Gwyliwr","block.minecraft.banner.stripe_bottom.cyan":"Sylfaen Gwyrddlas","block.minecraft.banner.creeper.purple":"Luws Creeper Porffor","block.minecraft.banner.straight_cross.cyan":"Croes Wyrddlas","block.minecraft.banner.half_horizontal_bottom.brown":"Bar Per Brown Gwrthdroëdig","item.minecraft.firework_star.shape.large_ball":"Pelen Fawr","block.minecraft.prismarine_brick_slab":"Slab Bricsen Prismarin","block.minecraft.jungle_trapdoor":"Drws Cudd Jyngl","block.minecraft.sculk_sensor":"Synhwyrydd Sculk","block.minecraft.banner.creeper.orange":"Luws Creeper Oren","block.minecraft.banner.triangles_top.lime":"Siff Rasyd Leim","item.minecraft.charcoal":"Golosg","item.minecraft.tipped_arrow.effect.night_vision":"Saeth Golwg Nos","block.minecraft.stone_brick_slab":"Slab Bricsen Carreg","block.minecraft.banner.mojang.cyan":"Logo Mojang Gwyrddlas","block.minecraft.white_stained_glass":"Gwydr Lliw Gwyn","item.minecraft.bowl":"Powlen","block.minecraft.banner.diagonal_up_left.magenta":"Majenta'n Groeslinol Traphen","block.minecraft.banner.square_top_right.light_gray":"Canton Siff Llwyd Golau o Chwith","block.minecraft.dead_brain_coral_fan":"Ffan Cwrel Ymennydd Wedi Marw","block.minecraft.banner.flower.white":"Luws Blodyn Gwyn","item.minecraft.bone_meal":"Blawd Esgyrn","block.minecraft.banner.triangle_bottom.red":"Sieffrwn Coch","block.minecraft.cyan_carpet":"Carped Gwyrddlas","block.minecraft.oak_door":"Drws Derw","block.minecraft.flowering_azalea_leaves":"Dail Asalea Blodeuog","item.minecraft.prismarine_crystals":"Crisialau Prismarin","block.minecraft.banner.diagonal_left.cyan":"Gwyrddlas Yn Groeslinol Wrthdro","block.minecraft.banner.stripe_bottom.light_blue":"Sylfaen Glas Golau","item.minecraft.tipped_arrow.effect.slow_falling":"Saeth Syrthio Araf","block.minecraft.end_stone":"Carreg End","block.minecraft.potted_white_tulip":"Tiwlip Gwyn Mewn Pot","block.minecraft.warped_door":"Drws Annaearol","block.minecraft.banner.square_top_left.light_gray":"Canton Prif Ddehau Llwyd Golau","item.minecraft.splash_potion.effect.fire_resistance":"Diod Tasgu Gwrthsefyll Tân","block.minecraft.banner.half_vertical_right.pink":"Pâl Per Pinc Gwrthdroëdig","item.minecraft.furnace_minecart":"Cart Pwll gyda Ffwrnais","block.minecraft.banner.triangles_bottom.light_gray":"Sail Rasyd Llwyd Golau","item.minecraft.shield.red":"Tarian Goch","block.minecraft.quartz_pillar":"Colofn Cwarts","block.minecraft.prismarine_slab":"Slab Prismarin","block.minecraft.nether_portal":"Porth Nether","item.minecraft.diamond_sword":"Cleddyf Diemwnt","block.minecraft.oak_planks":"Planciau Derw","item.minecraft.amethyst_shard":"Telchyn Amethyst","block.minecraft.purple_banner":"Baner Borffor","block.minecraft.structure_void":"Gwagle Strwythur","block.minecraft.purple_shulker_box":"Blwch Shulker Porffor","block.minecraft.potatoes":"Tatws","block.minecraft.light_blue_bed":"Gwely Glas Golau","block.minecraft.yellow_banner":"Baner Felen","item.modifiers.head":"Pan ar y Pen:","item.minecraft.potion.effect.swiftness":"Diod o Gyflymiad","block.minecraft.glass_pane":"Paen Gwydr","block.minecraft.clay":"Clai","block.minecraft.banner.diagonal_right.cyan":"Gwyrddlas Yn Groeslinol","block.minecraft.cut_copper_slab":"Slab Copr Toredig","block.minecraft.polished_diorite_slab":"Slab Diorit Caboledig","block.minecraft.banner.piglin.green":"Trwyn Gwyrdd","item.minecraft.splash_potion.effect.slow_falling":"Diod Tasgu Syrthio Araf","item.minecraft.book":"Llyfr","block.minecraft.banner.gradient.brown":"Graddiant Brown","block.minecraft.banner.cross.magenta":"Sawtyr Majenta","block.minecraft.cobblestone_slab":"Slab Crynion","block.minecraft.banner.diagonal_right.purple":"Porffor Yn Groeslinol","block.minecraft.banner.curly_border.gray":"Bordor Llwyd Rasyd","block.minecraft.big_dripleaf":"Diferddeilen Fawr","block.minecraft.black_shulker_box":"Blwch Shulker Du","block.minecraft.banner.straight_cross.purple":"Croes Porffor","block.minecraft.blackstone_stairs":"Grisiau Carregddu","block.minecraft.banner.triangles_top.blue":"Siff Rasyd Glas","block.minecraft.deepslate_tile_slab":"Slab Teils Dwfnlech","block.minecraft.banner.square_top_left.blue":"Canton Prif Ddehau Glas","block.minecraft.banner.stripe_center.yellow":"Cledr Felyn","item.minecraft.piglin_banner_pattern.desc"Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brun terrakotta","block.minecraft.lapis_ore":"Lapis Lazuli-malm","item.minecraft.gray_dye":"Gråt farvestof","block.minecraft.banner.base.yellow":"Helt gult felt","block.minecraft.terracotta":"Terrakotta","item.minecraft.stray_spawn_egg":"Omstrejfer fremkaldningsæg","block.minecraft.banner.base.pink":"Helt lyserødt felt","item.minecraft.potion.effect.weakness":"Svaghedseliksir","block.minecraft.dark_prismarine_slab":"Mørk prismarine-flise","item.minecraft.splash_potion.effect.thick":"Tyk sprøjtende eliksir","item.minecraft.cooked_cod":"Kogt torsk","block.minecraft.red_nether_brick_slab":"Rød nether-murstensflise","block.minecraft.yellow_terracotta":"Gul terrakotta","block.minecraft.observer":"Observatør","block.minecraft.banner.stripe_bottom.cyan":"Turkis base","block.minecraft.banner.creeper.purple":"Lilla creeper symbol","block.minecraft.banner.straight_cross.cyan":"Turkis kors","block.minecraft.banner.half_horizontal_bottom.brown":"Brun nedre halvdel","item.minecraft.firework_star.shape.large_ball":"Stor kugle","block.minecraft.prismarine_brick_slab":"Prismarine-murstensflise","block.minecraft.jungle_trapdoor":"Junglelem","block.minecraft.sculk_sensor":"Sculk-sensor","block.minecraft.banner.creeper.orange":"Orange creeper symbol","block.minecraft.banner.triangles_top.lime":"Limegrønne toppigge","item.minecraft.charcoal":"Trækul","item.minecraft.tipped_arrow.effect.night_vision":"Pil af nattesyn","block.minecraft.stone_brick_slab":"Stenmurstensflise","block.minecraft.banner.mojang.cyan":"Turkis ting","block.minecraft.white_stained_glass":"Hvidt farvet glas","item.minecraft.bowl":"Skål","block.minecraft.banner.diagonal_up_left.magenta":"Lyslilla nedre venstrebåndshalvdel","block.minecraft.banner.square_top_right.light_gray":"Lysegrå firkant oppe til højre","block.minecraft.dead_brain_coral_fan":"Død hjernekoralvifte","block.minecraft.banner.flower.white":"Hvidt blomster symbol","item.minecraft.bone_meal":"Benmel","block.minecraft.banner.triangle_bottom.red":"Rød nedre trekant","block.minecraft.cyan_carpet":"Turkis tæppe","block.minecraft.oak_door":"Egetræsdør","block.minecraft.flowering_azalea_leaves":"Blomstrende azalealøv","item.minecraft.prismarine_crystals":"Prismarinekrystaller","block.minecraft.banner.diagonal_left.cyan":"Turkis øvre højrebåndshalvdel","block.minecraft.banner.stripe_bottom.light_blue":"Lyseblå base","item.minecraft.tipped_arrow.effect.slow_falling":"Pil af langsom fald","block.minecraft.end_stone":"End-sten","block.minecraft.potted_white_tulip":"Hvid tulipan potteplante","block.minecraft.warped_door":"Forskruet dør","block.minecraft.banner.square_top_left.light_gray":"Lysegrå firkant oppe til venstre","item.minecraft.splash_potion.effect.fire_resistance":"Sprøjtende ildmodstandseliksir","block.minecraft.banner.half_vertical_right.pink":"Lyserød højre halvdel","item.minecraft.furnace_minecart":"Minevogn med ovn","block.minecraft.banner.triangles_bottom.light_gray":"Lysegrå bundpigge","item.minecraft.shield.red":"Rødt skjold","block.minecraft.quartz_pillar":"Kvartssøjle","block.minecraft.prismarine_slab":"Prismarine-flise","block.minecraft.nether_portal":"Netherportal","item.minecraft.diamond_sword":"Diamantsværd","block.minecraft.oak_planks":"Egeplanker","item.minecraft.amethyst_shard":"Ametyst skår","block.minecraft.purple_banner":"Lilla Banner","block.minecraft.structure_void":"Struktur-tomrum","block.minecraft.purple_shulker_box":"Lilla shulker boks","block.minecraft.potatoes":"Kartofler","block.minecraft.light_blue_bed":"Lyseblå seng","block.minecraft.yellow_banner":"Gult Banner","item.modifiers.head":"Når på hovedet:","item.minecraft.potion.effect.swiftness":"Hurtighedseliksir","block.minecraft.glass_pane":"Glaspanel","block.minecraft.clay":"Ler","block.minecraft.banner.diagonal_right.cyan":"Turkis øvre venstrebåndshalvdel","block.minecraft.cut_copper_slab":"Skåret kobberplade","block.minecraft.polished_diorite_slab":"Poleret dioritflise","block.minecraft.banner.piglin.green":"Grøn snude","item.minecraft.splash_potion.effect.slow_falling":"Sprøjtene langsom fald eliksir","item.minecraft.book":"Bog","block.minecraft.banner.gradient.brown":"Øvre faldne brun","block.minecraft.banner.cross.magenta":"Lyselilla kryds","block.minecraft.cobblestone_slab":"Brostensflise","block.minecraft.banner.diagonal_right.purple":"Lilla øvre venstrebåndshalvdel","block.minecraft.banner.curly_border.gray":"Grå takket ramme","block.minecraft.big_dripleaf":"Stort dryppeblad","block.minecraft.black_shulker_box":"Sort shulker boks","block.minecraft.banner.straight_cross.purple":"Lilla kors","block.minecraft.blackstone_stairs":"Sortstenstrappe","block.minecraft.banner.triangles_top.blue":"Blå toppigge","block.minecraft.deepslate_tile_slab":"Dybskifer-klinkeflise","block.minecraft.banner.square_top_left.blue":"Blå firkant oppe til venstre","block.minecraft.banner.stripe_center.yellow":"Gul pæl","item.minecraft.piglin_banner_Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Braune Keramik","block.minecraft.lapis_ore":"Lapislazulierz","item.minecraft.gray_dye":"Graue Forb","block.minecraft.banner.base.yellow":"Komplett gelbs Föd","block.minecraft.terracotta":"Keramik","item.minecraft.stray_spawn_egg":"Eiswondara-Spawn-Ei","block.minecraft.banner.base.pink":"Komplett rosas Föd","item.minecraft.potion.effect.weakness":"Tronk der Schwäche","block.minecraft.dark_prismarine_slab":"Dunkle Prismarinstufn","item.minecraft.splash_potion.effect.thick":"Dickflüssiga Wurftronk","item.minecraft.cooked_cod":"Brotna Kabeljau","block.minecraft.red_nether_brick_slab":"Rote Netherziaglstufn","block.minecraft.yellow_terracotta":"Gelbe Keramik","block.minecraft.observer":"Beobochta","block.minecraft.banner.stripe_bottom.cyan":"Türkisa Bannafuaß","block.minecraft.banner.creeper.purple":"Lilana Creeper","block.minecraft.banner.straight_cross.cyan":"Türkises Kreiz","block.minecraft.banner.half_horizontal_bottom.brown":"Untn braun teilt","item.minecraft.firework_star.shape.large_ball":"Große Kugl","block.minecraft.prismarine_brick_slab":"Prismarinziaglstufn","block.minecraft.jungle_trapdoor":"Tropnhoizfoitir","block.minecraft.sculk_sensor":"Sculk-Sensor","block.minecraft.banner.creeper.orange":"Oranga Creeper","block.minecraft.banner.triangles_top.lime":"Hellgrüns gspicklta Bannakopf","item.minecraft.charcoal":"Hoizkohle","item.minecraft.tipped_arrow.effect.night_vision":"Pfeil der Nochtsicht","block.minecraft.stone_brick_slab":"Stoaziaglstufn","block.minecraft.banner.mojang.cyan":"Türkises Mojang-Logo","block.minecraft.white_stained_glass":"Weißs Glos","item.minecraft.bowl":"Schissl","block.minecraft.banner.diagonal_up_left.magenta":"Magenta schrägrechts teilt (Invertiert)","block.minecraft.banner.square_top_right.light_gray":"Hellgraus links Obaegg","block.minecraft.dead_brain_coral_fan":"Obgstorbena Hiankorallnfächa","block.minecraft.banner.flower.white":"Weiße Blume","item.minecraft.bone_meal":"Knochnmöh","block.minecraft.banner.triangle_bottom.red":"Rote hoibe Spitzn","block.minecraft.cyan_carpet":"Türkisa Teppich","block.minecraft.oak_door":"Oachnhoiztir","block.minecraft.flowering_azalea_leaves":"Bliahends Azaleenlaub","item.minecraft.prismarine_crystals":"Prismarinkristoi","block.minecraft.banner.diagonal_left.cyan":"Türkis schräglinks teilt","block.minecraft.banner.stripe_bottom.light_blue":"Hellblaua Bannafuaß","item.minecraft.tipped_arrow.effect.slow_falling":"Pfeil des sonftn Fois","block.minecraft.end_stone":"Endstoa","block.minecraft.potted_white_tulip":"Eingsetzte weiße Tulpn","block.minecraft.warped_door":"Wirrtir","block.minecraft.banner.square_top_left.light_gray":"Hellgraus rechts Obaegg","item.minecraft.splash_potion.effect.fire_resistance":"Wurftronk der Feiaresistenz","block.minecraft.banner.half_vertical_right.pink":"Links rosa gspoitn","item.minecraft.furnace_minecart":"Wagon mit Ofn","block.minecraft.banner.triangles_bottom.light_gray":"Hellgraua gspicklta Bannafuaß","item.minecraft.shield.red":"Rots Schüd","block.minecraft.quartz_pillar":"Quarzsäule","block.minecraft.prismarine_slab":"Prismarinstufn","block.minecraft.nether_portal":"Netherportal","item.minecraft.diamond_sword":"Diamantschwert","block.minecraft.oak_planks":"Oachnhoizbrettl","item.minecraft.amethyst_shard":"Amethystscherbn","block.minecraft.purple_banner":"Lilas Banna","block.minecraft.structure_void":"Konstruktionsleere","block.minecraft.purple_shulker_box":"Lilane Shulkerkistn","block.minecraft.potatoes":"Kartoffe","block.minecraft.light_blue_bed":"Hellblaus Bett","block.minecraft.yellow_banner":"Gelbs Banna","item.modifiers.head":"Am Kopf:","item.minecraft.potion.effect.swiftness":"Tronk der Schnöigkeit","block.minecraft.glass_pane":"Glosscheibn","block.minecraft.clay":"Ton","block.minecraft.banner.diagonal_right.cyan":"Türkis schrägrechts teilt","block.minecraft.cut_copper_slab":"Gschnittene Kupfastufn","block.minecraft.polished_diorite_slab":"Poliate Dioritstufn","block.minecraft.banner.piglin.green":"Grüne Schnauzn","item.minecraft.splash_potion.effect.slow_falling":"Wurftronk des sonftn Fois","item.minecraft.book":"Buach","block.minecraft.banner.gradient.brown":"Brauna Forbvalauf","block.minecraft.banner.cross.magenta":"Magentas Andreaskreiz","block.minecraft.cobblestone_slab":"Bruchstoastufn","block.minecraft.banner.diagonal_right.purple":"Lila schrägrechts teilt","block.minecraft.banner.curly_border.gray":"Graua Spicklbord","block.minecraft.big_dripleaf":"Großes Tropfblatt","block.minecraft.black_shulker_box":"Schworze Shulkerkistn","block.minecraft.banner.straight_cross.purple":"Lilas Kreiz","block.minecraft.blackstone_stairs":"Schworzstoatreppn","block.minecraft.banner.triangles_top.blue":"Blaus gspicklta Bannakopf","block.minecraft.deepslate_tile_slab":"Tiafnschiefafliesnstufn","block.minecraft.banner.square_top_left.blue":"Blaus rechts Obaegg","block.minecraft.banner.stripe_center.yellow":"Gelba Pfoi","item.minecraft.piglin_banner_pLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brune Keramik","block.minecraft.lapis_ore":"Lapislazulierz","item.minecraft.gray_dye":"Graue Farbstoff","block.minecraft.banner.base.yellow":"Vollständig gelbs Feld","block.minecraft.terracotta":"Keramik","item.minecraft.stray_spawn_egg":"Iiswanderer-Spawn-Ei","block.minecraft.banner.base.pink":"Vollständig rosa Feld","item.minecraft.potion.effect.weakness":"Trank vode Schwächi","block.minecraft.dark_prismarine_slab":"Dunkli Prismarinstufe","item.minecraft.splash_potion.effect.thick":"Dickflüssige Wurftank","item.minecraft.cooked_cod":"Brotene Kabeljau","block.minecraft.red_nether_brick_slab":"Roti Netherziegelstufe","block.minecraft.yellow_terracotta":"Gelbe Keramik","block.minecraft.observer":"Beobachter","block.minecraft.banner.stripe_bottom.cyan":"Türkise Bannerfuess","block.minecraft.banner.creeper.purple":"Violette Creeper","block.minecraft.banner.straight_cross.cyan":"Türkises Chrüüz","block.minecraft.banner.half_horizontal_bottom.brown":"Brun une teilt","item.minecraft.firework_star.shape.large_ball":"Grossi Chugle","block.minecraft.prismarine_brick_slab":"Prismarinziegelstufe","block.minecraft.jungle_trapdoor":"Dschungelholzfalltür","block.minecraft.sculk_sensor":"Sculk-Sensor","block.minecraft.banner.creeper.orange":"Orange Creeper","block.minecraft.banner.triangles_top.lime":"Hellgrüens gspickeltes Bannerhaupt","item.minecraft.charcoal":"Holzchole","item.minecraft.tipped_arrow.effect.night_vision":"Pfil vode Nachtsicht","block.minecraft.stone_brick_slab":"Steiziegelstufe","block.minecraft.banner.mojang.cyan":"Türkises Mojang-Logo","block.minecraft.white_stained_glass":"Wisses Glas","item.minecraft.bowl":"Schüssle","block.minecraft.banner.diagonal_up_left.magenta":"Magenta schrägrechts teilt (Invertiert)","block.minecraft.banner.square_top_right.light_gray":"Hellgraus links Oberegg","block.minecraft.dead_brain_coral_fan":"Abgstorbeni Hirnkorallefächer","block.minecraft.banner.flower.white":"Wissi Blueme","item.minecraft.bone_meal":"Chnochemehl","block.minecraft.banner.triangle_bottom.red":"Roti halbi Spitze","block.minecraft.cyan_carpet":"Türkise Teppich","block.minecraft.oak_door":"Eicheholztür","block.minecraft.flowering_azalea_leaves":"Blühendes Azaleelaub","item.minecraft.prismarine_crystals":"Prismarinkristall","block.minecraft.banner.diagonal_left.cyan":"Türkis schräglinks teilt","block.minecraft.banner.stripe_bottom.light_blue":"Hellblaue Bannerfuess","item.minecraft.tipped_arrow.effect.slow_falling":"Pfil vom sanfte Fall","block.minecraft.end_stone":"Endstei","block.minecraft.potted_white_tulip":"Itopfti wissi Tulpe","block.minecraft.warped_door":"Wirrholztür","block.minecraft.banner.square_top_left.light_gray":"Hellgraus rechts Oberegg","item.minecraft.splash_potion.effect.fire_resistance":"Wurftrank vode Füürresistenz","block.minecraft.banner.half_vertical_right.pink":"Rosa links gspalte","item.minecraft.furnace_minecart":"Ofelore","block.minecraft.banner.triangles_bottom.light_gray":"Hellgraue gspickelte Bannerfuess","item.minecraft.shield.red":"Rots Schild","block.minecraft.quartz_pillar":"Quarzsüüle","block.minecraft.prismarine_slab":"Prismarinstufe","block.minecraft.nether_portal":"Netherportal","item.minecraft.diamond_sword":"Diamantschwert","block.minecraft.oak_planks":"Eicheholzbretter","item.minecraft.amethyst_shard":"Amethystscherbe","block.minecraft.purple_banner":"Violetts Banner","block.minecraft.structure_void":"Konstruktionsleeri","block.minecraft.purple_shulker_box":"Violetti Shulker-Chiste","block.minecraft.potatoes":"Härdöpfel","block.minecraft.light_blue_bed":"Hellblaus Bett","block.minecraft.yellow_banner":"Gelbes Banner","item.modifiers.head":"Ufem Chopf:","item.minecraft.potion.effect.swiftness":"Trank vode Schnelligkeit","block.minecraft.glass_pane":"Glasschiibe","block.minecraft.clay":"Ton","block.minecraft.banner.diagonal_right.cyan":"Türkis schrägrechts teilt","block.minecraft.cut_copper_slab":"Gschnitteni Chupferstufe","block.minecraft.polished_diorite_slab":"Polierti Dioritstufe","block.minecraft.banner.piglin.green":"Grüeni Schnauze","item.minecraft.splash_potion.effect.slow_falling":"Wurftrank vom sanfte Fall","item.minecraft.book":"Buech","block.minecraft.banner.gradient.brown":"Brune Farbverlauf","block.minecraft.banner.cross.magenta":"Magenta Andreaschrüüz","block.minecraft.cobblestone_slab":"Bruchsteistufe","block.minecraft.banner.diagonal_right.purple":"Violett schrägrechts teilt","block.minecraft.banner.curly_border.gray":"Graus Spickelbord","block.minecraft.big_dripleaf":"Grosses Tropfblatt","block.minecraft.black_shulker_box":"Schwarzi Shulker-Chiste","block.minecraft.banner.straight_cross.purple":"Violetts Chrüüz","block.minecraft.blackstone_stairs":"Schwarzsteistäge","block.minecraft.banner.triangles_top.blue":"Blaus gspickeltes Bannerhaupt","block.minecraft.deepslate_tile_slab":"Tüfschieferfliesestufe","block.minecraft.banner.square_top_left.blue":"Blaus rechts Oberegg","blocLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Braune Keramik","block.minecraft.lapis_ore":"Lapislazulierz","item.minecraft.gray_dye":"Grauer Farbstoff","block.minecraft.banner.base.yellow":"Vollständig gelbes Feld","block.minecraft.terracotta":"Keramik","item.minecraft.stray_spawn_egg":"Eiswanderer-Spawn-Ei","block.minecraft.banner.base.pink":"Vollständig rosa Feld","item.minecraft.potion.effect.weakness":"Trank der Schwäche","block.minecraft.dark_prismarine_slab":"Dunkle Prismarinstufe","item.minecraft.splash_potion.effect.thick":"Dickflüssiger Wurftrank","item.minecraft.cooked_cod":"Gebratener Kabeljau","block.minecraft.red_nether_brick_slab":"Rote Netherziegelstufe","block.minecraft.yellow_terracotta":"Gelbe Keramik","block.minecraft.observer":"Beobachter","block.minecraft.banner.stripe_bottom.cyan":"Türkiser Bannerfuß","block.minecraft.banner.creeper.purple":"Violetter Creeper","block.minecraft.banner.straight_cross.cyan":"Türkises Kreuz","block.minecraft.banner.half_horizontal_bottom.brown":"Unten braun geteilt","item.minecraft.firework_star.shape.large_ball":"Große Kugel","block.minecraft.prismarine_brick_slab":"Prismarinziegelstufe","block.minecraft.jungle_trapdoor":"Tropenholzfalltür","block.minecraft.sculk_sensor":"Sculk-Sensor","block.minecraft.banner.creeper.orange":"Oranger Creeper","block.minecraft.banner.triangles_top.lime":"Hellgrünes gespickeltes Bannerhaupt","item.minecraft.charcoal":"Holzkohle","item.minecraft.tipped_arrow.effect.night_vision":"Pfeil der Nachtsicht","block.minecraft.stone_brick_slab":"Steinziegelstufe","block.minecraft.banner.mojang.cyan":"Türkises Mojang-Logo","block.minecraft.white_stained_glass":"Weißes Glas","item.minecraft.bowl":"Schüssel","block.minecraft.banner.diagonal_up_left.magenta":"Magenta schrägrechts geteilt (Invertiert)","block.minecraft.banner.square_top_right.light_gray":"Hellgraues linkes Obereck","block.minecraft.dead_brain_coral_fan":"Abgestorbener Hirnkorallenfächer","block.minecraft.banner.flower.white":"Weiße Blume","item.minecraft.bone_meal":"Knochenmehl","block.minecraft.banner.triangle_bottom.red":"Rote halbe Spitze","block.minecraft.cyan_carpet":"Türkiser Teppich","block.minecraft.oak_door":"Eichenholztür","block.minecraft.flowering_azalea_leaves":"Blühendes Azaleenlaub","item.minecraft.prismarine_crystals":"Prismarinkristalle","block.minecraft.banner.diagonal_left.cyan":"Türkis schräglinks geteilt","block.minecraft.banner.stripe_bottom.light_blue":"Hellblauer Bannerfuß","item.minecraft.tipped_arrow.effect.slow_falling":"Pfeil des sanften Falls","block.minecraft.end_stone":"Endstein","block.minecraft.potted_white_tulip":"Eingetopfte weiße Tulpe","block.minecraft.warped_door":"Wirrtür","block.minecraft.banner.square_top_left.light_gray":"Hellgraues rechtes Obereck","item.minecraft.splash_potion.effect.fire_resistance":"Wurftrank der Feuerresistenz","block.minecraft.banner.half_vertical_right.pink":"Links rosa gespalten","item.minecraft.furnace_minecart":"Ofenlore","block.minecraft.banner.triangles_bottom.light_gray":"Hellgrauer gespickelter Bannerfuß","item.minecraft.shield.red":"Roter Schild","block.minecraft.quartz_pillar":"Quarzsäule","block.minecraft.prismarine_slab":"Prismarinstufe","block.minecraft.nether_portal":"Netherportal","item.minecraft.diamond_sword":"Diamantschwert","block.minecraft.oak_planks":"Eichenholzbretter","item.minecraft.amethyst_shard":"Amethystscherbe","block.minecraft.purple_banner":"Violettes Banner","block.minecraft.structure_void":"Konstruktionsleere","block.minecraft.purple_shulker_box":"Violette Shulker-Kiste","block.minecraft.potatoes":"Kartoffeln","block.minecraft.light_blue_bed":"Hellblaues Bett","block.minecraft.yellow_banner":"Gelbes Banner","item.modifiers.head":"Auf dem Kopf:","item.minecraft.potion.effect.swiftness":"Trank der Schnelligkeit","block.minecraft.glass_pane":"Glasscheibe","block.minecraft.clay":"Ton","block.minecraft.banner.diagonal_right.cyan":"Türkis schrägrechts geteilt","block.minecraft.cut_copper_slab":"Geschnittene Kupferstufe","block.minecraft.polished_diorite_slab":"Polierte Dioritstufe","block.minecraft.banner.piglin.green":"Grüne Schnauze","item.minecraft.splash_potion.effect.slow_falling":"Wurftrank des sanften Falls","item.minecraft.book":"Buch","block.minecraft.banner.gradient.brown":"Brauner Farbverlauf","block.minecraft.banner.cross.magenta":"Magenta Andreaskreuz","block.minecraft.cobblestone_slab":"Bruchsteinstufe","block.minecraft.banner.diagonal_right.purple":"Violett schrägrechts geteilt","block.minecraft.banner.curly_border.gray":"Grauer Spickelbord","block.minecraft.big_dripleaf":"Großes Tropfblatt","block.minecraft.black_shulker_box":"Schwarze Shulker-Kiste","block.minecraft.banner.straight_cross.purple":"Violettes Kreuz","block.minecraft.blackstone_stairs":"Schwarzsteintreppe","block.minecraft.banner.triangles_top.blue":"Blaues gespickeltes Bannerhaupt","block.minecraft.deepslate_tile_slab":"Tiefenschieferfliesenstufe","block.minecraft.banner.square_Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Καφέ Τερακότα","block.minecraft.lapis_ore":"Μετάλλευμα Λάπις Λάζουλι","item.minecraft.gray_dye":"Γκρίζα Βαφή","block.minecraft.banner.base.yellow":"Πλήρως Κίτρινο Φόντο","block.minecraft.terracotta":"Τερακότα","item.minecraft.stray_spawn_egg":"Αβγό Γέννησης Περιπλανώμενου","block.minecraft.banner.base.pink":"Πλήρως Ροζ Φόντο","item.minecraft.potion.effect.weakness":"Φίλτρο Αδυναμίας","block.minecraft.dark_prismarine_slab":"Πλάκα Σκούρας Πρισμαρίνης","item.minecraft.splash_potion.effect.thick":"Πηχτό Φίλτρο Πιτσιλιάς","item.minecraft.cooked_cod":"Μαγειρεμένος Μπακαλιάρος","block.minecraft.red_nether_brick_slab":"Πλάκα Κόκκινων Τούβλων Νέδερ","block.minecraft.yellow_terracotta":"Κίτρινη Τερακότα","block.minecraft.observer":"Παρατηρητής","block.minecraft.banner.stripe_bottom.cyan":"Κυανή Βάση","block.minecraft.banner.creeper.purple":"Μοβ Σήμα Κρίπερ","block.minecraft.banner.straight_cross.cyan":"Κυανός Σταυρός","block.minecraft.banner.half_horizontal_bottom.brown":"Καφέ Οριζόντιο Μισό Τμήμα Βάσης","item.minecraft.firework_star.shape.large_ball":"Μεγάλη Μπάλα","block.minecraft.prismarine_brick_slab":"Πλάκα Τούβλων Πρισμαρίνης","block.minecraft.jungle_trapdoor":"Καταπακτή Ζούγκλας","block.minecraft.sculk_sensor":"Αισθητήρας Σκαλκ","block.minecraft.banner.creeper.orange":"Πορτοκαλί Σήμα Κρίπερ","block.minecraft.banner.triangles_top.lime":"Λαχανί Οδοντωτή Κορυφή","item.minecraft.charcoal":"Ξυλοκάρβουνο","item.minecraft.tipped_arrow.effect.night_vision":"Βέλος Νυχτερινής Όρασης","block.minecraft.stone_brick_slab":"Πλάκα Τούβλων Πέτρας","block.minecraft.banner.mojang.cyan":"Κυανό Πράγμα","block.minecraft.white_stained_glass":"Λευκό Χρωματισμένο Γυαλί","item.minecraft.bowl":"Μπολ","block.minecraft.banner.diagonal_up_left.magenta":"Φούξια Ανεστραμμένο Αριστερό Διαγώνιο Μισό Τμήμα","block.minecraft.banner.square_top_right.light_gray":"Ανοιχτό Γκρίζο Αριστερό Καντόνι Κορυφής","block.minecraft.dead_brain_coral_fan":"Νεκρό Ροζ Αλκυονοειδές Κοράλλι","block.minecraft.banner.flower.white":"Λευκό Σήμα Άνθους","item.minecraft.bone_meal":"Οστεάλευρο","block.minecraft.banner.triangle_bottom.red":"Κόκκινο Σιρίτι","block.minecraft.cyan_carpet":"Κυανό Χαλί","block.minecraft.oak_door":"Πόρτα Βελανιδιάς","block.minecraft.flowering_azalea_leaves":"Φύλλα Ανθισμένης Αζαλέας","item.minecraft.prismarine_crystals":"Κρύσταλλοι Πρισμαρίνης","block.minecraft.banner.diagonal_left.cyan":"Κυανό Δεξί Διαγώνιο Μισό Τμήμα","block.minecraft.banner.stripe_bottom.light_blue":"Γαλάζια Βάση","item.minecraft.tipped_arrow.effect.slow_falling":"Βέλος Αργής Πτώσης","block.minecraft.end_stone":"Πέτρα Εντ","block.minecraft.potted_white_tulip":"Λευκή Τουλίπα σε Γλάστρα","block.minecraft.warped_door":"Διαστρεβλωμένη Πόρτα","block.minecraft.banner.square_top_left.light_gray":"Ανοιχτό Γκρίζο Δεξί Καντόνι Κορυφής","item.minecraft.splash_potion.effect.fire_resistance":"Φίλτρο Πιτσιλιάς Αντίστασης Φωτιάς","block.minecraft.banner.half_vertical_right.pink":"Ροζ Κάθετο Αριστερό Μισό Τμήμα","item.minecraft.furnace_minecart":"Βαγονέτο με Φούρνο","block.minecraft.banner.triangles_bottom.light_gray":"Ανοιχτή Γκρίζα Οδοντωτή Βάση","item.minecraft.shield.red":"Κόκκινη Ασπίδα","block.minecraft.quartz_pillar":"Στήλη Χαλαζία","block.minecraft.prismarine_slab":"Πλάκα Πρισμαρίνης","block.minecraft.nether_portal":"Πύλη Νέδερ","item.minecraft.diamond_sword":"Διαμαντένιο Σπαθί","block.minecraft.oak_planks":"Σανίδες Βελανιδιάς","item.minecraft.amethyst_shard":"Θραύσμα Αμέθυστου","block.minecraft.purple_banner":"Μοβ Λάβαρο","block.minecraft.structure_void":"Κενό Δομής","block.minecraft.purple_shulker_box":"Μοβ Κουτί Σάλκερ","block.minecraft.potatoes":"Πατάτες","block.minecraft.light_blue_bed":"Γαλάζιο Κρεβάτι","block.minecraft.yellow_banner":"Κίτρινο Λάβαρο","item.modifiers.head":"Όταν είναι στο Κεφάλι:","item.minecraft.potion.effect.swiftness":"ΦLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brown Terracotta","block.minecraft.lapis_ore":"Lapis Lazuli Ore","item.minecraft.gray_dye":"Grey Dye","block.minecraft.banner.base.yellow":"Fully Yellow Field","block.minecraft.terracotta":"Terracotta","item.minecraft.stray_spawn_egg":"Stray Spawn Egg","block.minecraft.banner.base.pink":"Fully Pink Field","item.minecraft.potion.effect.weakness":"Potion of Weakness","block.minecraft.dark_prismarine_slab":"Dark Prismarine Slab","item.minecraft.splash_potion.effect.thick":"Thick Splash Potion","item.minecraft.cooked_cod":"Cooked Cod","block.minecraft.red_nether_brick_slab":"Red Nether Brick Slab","block.minecraft.yellow_terracotta":"Yellow Terracotta","block.minecraft.observer":"Observer","block.minecraft.banner.stripe_bottom.cyan":"Cyan Base","block.minecraft.banner.creeper.purple":"Purple Creeper Charge","block.minecraft.banner.straight_cross.cyan":"Cyan Cross","block.minecraft.banner.half_horizontal_bottom.brown":"Brown Per Fess Inverted","item.minecraft.firework_star.shape.large_ball":"Large Ball","block.minecraft.prismarine_brick_slab":"Prismarine Brick Slab","block.minecraft.jungle_trapdoor":"Jungle Trapdoor","block.minecraft.sculk_sensor":"Sculk Sensor","block.minecraft.banner.creeper.orange":"Orange Creeper Charge","block.minecraft.banner.triangles_top.lime":"Lime Chief Indented","item.minecraft.charcoal":"Charcoal","item.minecraft.tipped_arrow.effect.night_vision":"Arrow of Night Vision","block.minecraft.stone_brick_slab":"Stone Brick Slab","block.minecraft.banner.mojang.cyan":"Cyan Thing","block.minecraft.white_stained_glass":"White Stained Glass","item.minecraft.bowl":"Bowl","block.minecraft.banner.diagonal_up_left.magenta":"Magenta Per Bend Inverted","block.minecraft.banner.square_top_right.light_gray":"Light Grey Chief Sinister Canton","block.minecraft.dead_brain_coral_fan":"Dead Brain Coral Fan","block.minecraft.banner.flower.white":"White Flower Charge","item.minecraft.bone_meal":"Bone Meal","block.minecraft.banner.triangle_bottom.red":"Red Chevron","block.minecraft.cyan_carpet":"Cyan Carpet","block.minecraft.oak_door":"Oak Door","block.minecraft.flowering_azalea_leaves":"Flowering Azalea Leaves","item.minecraft.prismarine_crystals":"Prismarine Crystals","block.minecraft.banner.diagonal_left.cyan":"Cyan Per Bend Sinister","block.minecraft.banner.stripe_bottom.light_blue":"Light Blue Base","item.minecraft.tipped_arrow.effect.slow_falling":"Arrow of Slow Falling","block.minecraft.end_stone":"End Stone","block.minecraft.potted_white_tulip":"Potted White Tulip","block.minecraft.warped_door":"Warped Door","block.minecraft.banner.square_top_left.light_gray":"Light Grey Chief Dexter Canton","item.minecraft.splash_potion.effect.fire_resistance":"Splash Potion of Fire Resistance","block.minecraft.banner.half_vertical_right.pink":"Pink Per Pale Inverted","item.minecraft.furnace_minecart":"Minecart with Furnace","block.minecraft.banner.triangles_bottom.light_gray":"Light Grey Base Indented","item.minecraft.shield.red":"Red Shield","block.minecraft.quartz_pillar":"Quartz Pillar","block.minecraft.prismarine_slab":"Prismarine Slab","block.minecraft.nether_portal":"Nether Portal","item.minecraft.diamond_sword":"Diamond Sword","block.minecraft.oak_planks":"Oak Planks","item.minecraft.amethyst_shard":"Amethyst Shard","block.minecraft.purple_banner":"Purple Banner","block.minecraft.structure_void":"Structure Void","block.minecraft.purple_shulker_box":"Purple Shulker Box","block.minecraft.potatoes":"Potatoes","block.minecraft.light_blue_bed":"Light Blue Bed","block.minecraft.yellow_banner":"Yellow Banner","item.modifiers.head":"When on Head:","item.minecraft.potion.effect.swiftness":"Potion of Swiftness","block.minecraft.glass_pane":"Glass Pane","block.minecraft.clay":"Clay","block.minecraft.banner.diagonal_right.cyan":"Cyan Per Bend","block.minecraft.cut_copper_slab":"Cut Copper Slab","block.minecraft.polished_diorite_slab":"Polished Diorite Slab","block.minecraft.banner.piglin.green":"Green Snout","item.minecraft.splash_potion.effect.slow_falling":"Splash Potion of Slow Falling","item.minecraft.book":"Book","block.minecraft.banner.gradient.brown":"Brown Gradient","block.minecraft.banner.cross.magenta":"Magenta Saltire","block.minecraft.cobblestone_slab":"Cobblestone Slab","block.minecraft.banner.diagonal_right.purple":"Purple Per Bend","block.minecraft.banner.curly_border.gray":"Grey Bordure Indented","block.minecraft.big_dripleaf":"Big Dripleaf","block.minecraft.black_shulker_box":"Black Shulker Box","block.minecraft.banner.straight_cross.purple":"Purple Cross","block.minecraft.blackstone_stairs":"Blackstone Stairs","block.minecraft.banner.triangles_top.blue":"Blue Chief Indented","block.minecraft.deepslate_tile_slab":"Deepslate Tile Slab","block.minecraft.banner.square_top_left.blue":"Blue Chief Dexter Canton","block.minecraft.banner.stripe_center.yellow":"Yellow Pale","item.minecraft.piglin_banner_pattern.desc":"Snout","item.minecraft.firework_star.cyan":"Cyan","block.minLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brown Terracotta","block.minecraft.lapis_ore":"Lapis Lazuli Ore","item.minecraft.gray_dye":"Grey Dye","block.minecraft.banner.base.yellow":"Fully Yellow Field","block.minecraft.terracotta":"Terracotta","item.minecraft.stray_spawn_egg":"Stray Spawn Egg","block.minecraft.banner.base.pink":"Fully Pink Field","item.minecraft.potion.effect.weakness":"Potion of Weakness","block.minecraft.dark_prismarine_slab":"Dark Prismarine Slab","item.minecraft.splash_potion.effect.thick":"Thick Splash Potion","item.minecraft.cooked_cod":"Cooked Cod","block.minecraft.red_nether_brick_slab":"Red Nether Brick Slab","block.minecraft.yellow_terracotta":"Yellow Terracotta","block.minecraft.observer":"Observer","block.minecraft.banner.stripe_bottom.cyan":"Cyan Base","block.minecraft.banner.creeper.purple":"Purple Creeper Charge","block.minecraft.banner.straight_cross.cyan":"Cyan Cross","block.minecraft.banner.half_horizontal_bottom.brown":"Brown Per Fess Inverted","item.minecraft.firework_star.shape.large_ball":"Large Ball","block.minecraft.prismarine_brick_slab":"Prismarine Brick Slab","block.minecraft.jungle_trapdoor":"Jungle Trapdoor","block.minecraft.sculk_sensor":"Sculk Sensor","block.minecraft.banner.creeper.orange":"Orange Creeper Charge","block.minecraft.banner.triangles_top.lime":"Lime Chief Indented","item.minecraft.charcoal":"Charcoal","item.minecraft.tipped_arrow.effect.night_vision":"Arrow of Night Vision","block.minecraft.stone_brick_slab":"Stone Brick Slab","block.minecraft.banner.mojang.cyan":"Cyan Thing","block.minecraft.white_stained_glass":"White Stained Glass","item.minecraft.bowl":"Bowl","block.minecraft.banner.diagonal_up_left.magenta":"Magenta Per Bend Inverted","block.minecraft.banner.square_top_right.light_gray":"Light Grey Chief Sinister Canton","block.minecraft.dead_brain_coral_fan":"Dead Brain Coral Fan","block.minecraft.banner.flower.white":"White Flower Charge","item.minecraft.bone_meal":"Bone Meal","block.minecraft.banner.triangle_bottom.red":"Red Chevron","block.minecraft.cyan_carpet":"Cyan Carpet","block.minecraft.oak_door":"Oak Door","block.minecraft.flowering_azalea_leaves":"Flowering Azalea Leaves","item.minecraft.prismarine_crystals":"Prismarine Crystals","block.minecraft.banner.diagonal_left.cyan":"Cyan Per Bend Sinister","block.minecraft.banner.stripe_bottom.light_blue":"Light Blue Base","item.minecraft.tipped_arrow.effect.slow_falling":"Arrow of Slow Falling","block.minecraft.end_stone":"End Stone","block.minecraft.potted_white_tulip":"Potted White Tulip","block.minecraft.warped_door":"Warped Door","block.minecraft.banner.square_top_left.light_gray":"Light Grey Chief Dexter Canton","item.minecraft.splash_potion.effect.fire_resistance":"Splash Potion of Fire Resistance","block.minecraft.banner.half_vertical_right.pink":"Pink Per Pale Inverted","item.minecraft.furnace_minecart":"Minecart with Furnace","block.minecraft.banner.triangles_bottom.light_gray":"Light Grey Base Indented","item.minecraft.shield.red":"Red Shield","block.minecraft.quartz_pillar":"Quartz Pillar","block.minecraft.prismarine_slab":"Prismarine Slab","block.minecraft.nether_portal":"Nether Portal","item.minecraft.diamond_sword":"Diamond Sword","block.minecraft.oak_planks":"Oak Planks","item.minecraft.amethyst_shard":"Amethyst Shard","block.minecraft.purple_banner":"Purple Banner","block.minecraft.structure_void":"Structure Void","block.minecraft.purple_shulker_box":"Purple Shulker Box","block.minecraft.potatoes":"Potatoes","block.minecraft.light_blue_bed":"Light Blue Bed","block.minecraft.yellow_banner":"Yellow Banner","item.modifiers.head":"When on Head:","item.minecraft.potion.effect.swiftness":"Potion of Swiftness","block.minecraft.glass_pane":"Glass Pane","block.minecraft.clay":"Clay","block.minecraft.banner.diagonal_right.cyan":"Cyan Per Bend","block.minecraft.cut_copper_slab":"Cut Copper Slab","block.minecraft.polished_diorite_slab":"Polished Diorite Slab","block.minecraft.banner.piglin.green":"Green Snout","item.minecraft.splash_potion.effect.slow_falling":"Splash Potion of Slow Falling","item.minecraft.book":"Book","block.minecraft.banner.gradient.brown":"Brown Gradient","block.minecraft.banner.cross.magenta":"Magenta Saltire","block.minecraft.cobblestone_slab":"Cobblestone Slab","block.minecraft.banner.diagonal_right.purple":"Purple Per Bend","block.minecraft.banner.curly_border.gray":"Grey Bordure Indented","block.minecraft.big_dripleaf":"Big Dripleaf","block.minecraft.black_shulker_box":"Black Shulker Box","block.minecraft.banner.straight_cross.purple":"Purple Cross","block.minecraft.blackstone_stairs":"Blackstone Stairs","block.minecraft.banner.triangles_top.blue":"Blue Chief Indented","block.minecraft.deepslate_tile_slab":"Deepslate Tile Slab","block.minecraft.banner.square_top_left.blue":"Blue Chief Dexter Canton","block.minecraft.banner.stripe_center.yellow":"Yellow Pale","item.minecraft.piglin_banner_pattern.desc":"Snout","item.minecraft.firework_star.cyan":"Cyan","block.minLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brown Terracotta","block.minecraft.lapis_ore":"Lapis Lazuli Ore","item.minecraft.gray_dye":"Grey Dye","block.minecraft.banner.base.yellow":"Fully Yellow Field","block.minecraft.terracotta":"Terracotta","item.minecraft.stray_spawn_egg":"Stray Spawn Egg","block.minecraft.banner.base.pink":"Fully Pink Field","item.minecraft.potion.effect.weakness":"Potion of Weakness","block.minecraft.dark_prismarine_slab":"Dark Prismarine Slab","item.minecraft.splash_potion.effect.thick":"Thick Splash Potion","item.minecraft.cooked_cod":"Cooked Cod","block.minecraft.red_nether_brick_slab":"Red Nether Brick Slab","block.minecraft.yellow_terracotta":"Yellow Terracotta","block.minecraft.observer":"Observer","block.minecraft.banner.stripe_bottom.cyan":"Cyan Base","block.minecraft.banner.creeper.purple":"Purple Creeper Charge","block.minecraft.banner.straight_cross.cyan":"Cyan Cross","block.minecraft.banner.half_horizontal_bottom.brown":"Brown Per Fess Inverted","item.minecraft.firework_star.shape.large_ball":"Large Ball","block.minecraft.prismarine_brick_slab":"Prismarine Brick Slab","block.minecraft.jungle_trapdoor":"Jungle Trapdoor","block.minecraft.sculk_sensor":"Sculk Sensor","block.minecraft.banner.creeper.orange":"Orange Creeper Charge","block.minecraft.banner.triangles_top.lime":"Lime Chief Indented","item.minecraft.charcoal":"Charcoal","item.minecraft.tipped_arrow.effect.night_vision":"Arrow of Night Vision","block.minecraft.stone_brick_slab":"Stone Brick Slab","block.minecraft.banner.mojang.cyan":"Cyan Thing","block.minecraft.white_stained_glass":"White Stained Glass","item.minecraft.bowl":"Bowl","block.minecraft.banner.diagonal_up_left.magenta":"Magenta Per Bend Inverted","block.minecraft.banner.square_top_right.light_gray":"Light Grey Chief Sinister Canton","block.minecraft.dead_brain_coral_fan":"Dead Brain Coral Fan","block.minecraft.banner.flower.white":"White Flower Charge","item.minecraft.bone_meal":"Bone Meal","block.minecraft.banner.triangle_bottom.red":"Red Chevron","block.minecraft.cyan_carpet":"Cyan Carpet","block.minecraft.oak_door":"Oak Door","block.minecraft.flowering_azalea_leaves":"Flowering Azalea Leaves","item.minecraft.prismarine_crystals":"Prismarine Crystals","block.minecraft.banner.diagonal_left.cyan":"Cyan Per Bend Sinister","block.minecraft.banner.stripe_bottom.light_blue":"Light Blue Base","item.minecraft.tipped_arrow.effect.slow_falling":"Arrow of Slow Falling","block.minecraft.end_stone":"End Stone","block.minecraft.potted_white_tulip":"Potted White Tulip","block.minecraft.warped_door":"Warped Door","block.minecraft.banner.square_top_left.light_gray":"Light Grey Chief Dexter Canton","item.minecraft.splash_potion.effect.fire_resistance":"Splash Potion of Fire Resistance","block.minecraft.banner.half_vertical_right.pink":"Pink Per Pale Inverted","item.minecraft.furnace_minecart":"Minecart with Furnace","block.minecraft.banner.triangles_bottom.light_gray":"Light Grey Base Indented","item.minecraft.shield.red":"Red Shield","block.minecraft.quartz_pillar":"Quartz Pillar","block.minecraft.prismarine_slab":"Prismarine Slab","block.minecraft.nether_portal":"Nether Portal","item.minecraft.diamond_sword":"Diamond Sword","block.minecraft.oak_planks":"Oak Planks","item.minecraft.amethyst_shard":"Amethyst Shard","block.minecraft.purple_banner":"Purple Banner","block.minecraft.structure_void":"Structure Void","block.minecraft.purple_shulker_box":"Purple Shulker Box","block.minecraft.potatoes":"Potatoes","block.minecraft.light_blue_bed":"Light Blue Bed","block.minecraft.yellow_banner":"Yellow Banner","item.modifiers.head":"When on Head:","item.minecraft.potion.effect.swiftness":"Potion of Swiftness","block.minecraft.glass_pane":"Glass Pane","block.minecraft.clay":"Clay","block.minecraft.banner.diagonal_right.cyan":"Cyan Per Bend","block.minecraft.cut_copper_slab":"Cut Copper Slab","block.minecraft.polished_diorite_slab":"Polished Diorite Slab","block.minecraft.banner.piglin.green":"Green Snout","item.minecraft.splash_potion.effect.slow_falling":"Splash Potion of Slow Falling","item.minecraft.book":"Book","block.minecraft.banner.gradient.brown":"Brown Gradient","block.minecraft.banner.cross.magenta":"Magenta Saltire","block.minecraft.cobblestone_slab":"Cobblestone Slab","block.minecraft.banner.diagonal_right.purple":"Purple Per Bend","block.minecraft.banner.curly_border.gray":"Grey Bordure Indented","block.minecraft.big_dripleaf":"Big Dripleaf","block.minecraft.black_shulker_box":"Black Shulker Box","block.minecraft.banner.straight_cross.purple":"Purple Cross","block.minecraft.blackstone_stairs":"Blackstone Stairs","block.minecraft.banner.triangles_top.blue":"Blue Chief Indented","block.minecraft.deepslate_tile_slab":"Deepslate Tile Slab","block.minecraft.banner.square_top_left.blue":"Blue Chief Dexter Canton","block.minecraft.banner.stripe_center.yellow":"Yellow Pale","item.minecraft.piglin_banner_pattern.desc":"Snout","item.minecraft.firework_star.cyan":"Cyan","block.minLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brown Terracotta","block.minecraft.lapis_ore":"Lapis Lazuli Ore","item.minecraft.gray_dye":"Grey Dye","block.minecraft.banner.base.yellow":"Fully Yellow Field","block.minecraft.terracotta":"Terracotta","item.minecraft.stray_spawn_egg":"Stray Spawn Egg","block.minecraft.banner.base.pink":"Fully Pink Field","item.minecraft.potion.effect.weakness":"Potion of Weakness","block.minecraft.dark_prismarine_slab":"Dark Prismarine Slab","item.minecraft.splash_potion.effect.thick":"Thick Splash Potion","item.minecraft.cooked_cod":"Cooked Cod","block.minecraft.red_nether_brick_slab":"Red Nether Brick Slab","block.minecraft.yellow_terracotta":"Yellow Terracotta","block.minecraft.observer":"Observer","block.minecraft.banner.stripe_bottom.cyan":"Cyan Base","block.minecraft.banner.creeper.purple":"Purple Creeper Charge","block.minecraft.banner.straight_cross.cyan":"Cyan Cross","block.minecraft.banner.half_horizontal_bottom.brown":"Brown Per Fess Inverted","item.minecraft.firework_star.shape.large_ball":"Large Ball","block.minecraft.prismarine_brick_slab":"Prismarine Brick Slab","block.minecraft.jungle_trapdoor":"Jungle Trapdoor","block.minecraft.sculk_sensor":"Sculk Sensor","block.minecraft.banner.creeper.orange":"Orange Creeper Charge","block.minecraft.banner.triangles_top.lime":"Lime Chief Indented","item.minecraft.charcoal":"Charcoal","item.minecraft.tipped_arrow.effect.night_vision":"Arrow of Night Vision","block.minecraft.stone_brick_slab":"Stone Brick Slab","block.minecraft.banner.mojang.cyan":"Cyan Thing","block.minecraft.white_stained_glass":"White Stained Glass","item.minecraft.bowl":"Bowl","block.minecraft.banner.diagonal_up_left.magenta":"Magenta Per Bend Inverted","block.minecraft.banner.square_top_right.light_gray":"Light Grey Chief Sinister Canton","block.minecraft.dead_brain_coral_fan":"Dead Brain Coral Fan","block.minecraft.banner.flower.white":"White Flower Charge","item.minecraft.bone_meal":"Bone Meal","block.minecraft.banner.triangle_bottom.red":"Red Chevron","block.minecraft.cyan_carpet":"Cyan Carpet","block.minecraft.oak_door":"Oak Door","block.minecraft.flowering_azalea_leaves":"Flowering Azalea Leaves","item.minecraft.prismarine_crystals":"Prismarine Crystals","block.minecraft.banner.diagonal_left.cyan":"Cyan Per Bend Sinister","block.minecraft.banner.stripe_bottom.light_blue":"Light Blue Base","item.minecraft.tipped_arrow.effect.slow_falling":"Arrow of Slow Falling","block.minecraft.end_stone":"End Stone","block.minecraft.potted_white_tulip":"Potted White Tulip","block.minecraft.warped_door":"Warped Door","block.minecraft.banner.square_top_left.light_gray":"Light Grey Chief Dexter Canton","item.minecraft.splash_potion.effect.fire_resistance":"Splash Potion of Fire Resistance","block.minecraft.banner.half_vertical_right.pink":"Pink Per Pale Inverted","item.minecraft.furnace_minecart":"Minecart with Furnace","block.minecraft.banner.triangles_bottom.light_gray":"Light Grey Base Indented","item.minecraft.shield.red":"Red Shield","block.minecraft.quartz_pillar":"Quartz Pillar","block.minecraft.prismarine_slab":"Prismarine Slab","block.minecraft.nether_portal":"Nether Portal","item.minecraft.diamond_sword":"Diamond Sword","block.minecraft.oak_planks":"Oak Planks","item.minecraft.amethyst_shard":"Amethyst Shard","block.minecraft.purple_banner":"Purple Banner","block.minecraft.structure_void":"Structure Void","block.minecraft.purple_shulker_box":"Purple Shulker Box","block.minecraft.potatoes":"Potatoes","block.minecraft.light_blue_bed":"Light Blue Bed","block.minecraft.yellow_banner":"Yellow Banner","item.modifiers.head":"When on Head:","item.minecraft.potion.effect.swiftness":"Potion of Swiftness","block.minecraft.glass_pane":"Glass Pane","block.minecraft.clay":"Clay","block.minecraft.banner.diagonal_right.cyan":"Cyan Per Bend","block.minecraft.cut_copper_slab":"Cut Copper Slab","block.minecraft.polished_diorite_slab":"Polished Diorite Slab","block.minecraft.banner.piglin.green":"Green Snout","item.minecraft.splash_potion.effect.slow_falling":"Splash Potion of Slow Falling","item.minecraft.book":"Book","block.minecraft.banner.gradient.brown":"Brown Gradient","block.minecraft.banner.cross.magenta":"Magenta Saltire","block.minecraft.cobblestone_slab":"Cobblestone Slab","block.minecraft.banner.diagonal_right.purple":"Purple Per Bend","block.minecraft.banner.curly_border.gray":"Grey Bordure Indented","block.minecraft.big_dripleaf":"Big Dripleaf","block.minecraft.black_shulker_box":"Black Shulker Box","block.minecraft.banner.straight_cross.purple":"Purple Cross","block.minecraft.blackstone_stairs":"Blackstone Stairs","block.minecraft.banner.triangles_top.blue":"Blue Chief Indented","block.minecraft.deepslate_tile_slab":"Deepslate Tile Slab","block.minecraft.banner.square_top_left.blue":"Blue Chief Dexter Canton","block.minecraft.banner.stripe_center.yellow":"Yellow Pale","item.minecraft.piglin_banner_pattern.desc":"Snout","item.minecraft.firework_star.cyan":"Cyan","block.minLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brown ancient clay","block.minecraft.lapis_ore":"Orrre o' lāzhward","item.minecraft.gray_dye":"Dye o' gray","block.minecraft.banner.base.yellow":"Fully yellow field","block.minecraft.terracotta":"Ancient Clay","item.minecraft.stray_spawn_egg":"Wandering Bag o' Bones Cackle Fruit","block.minecraft.banner.base.pink":"Fully pink field","item.minecraft.potion.effect.weakness":"Grog o' laziness","block.minecraft.dark_prismarine_slab":"Slab o' dusky prismarine","item.minecraft.splash_potion.effect.thick":"Rummy grenade","item.minecraft.cooked_cod":"Smoked codfish","block.minecraft.red_nether_brick_slab":"Slab o' Scarlet Bricks o' Nether","block.minecraft.yellow_terracotta":"Yellow ancient clay","block.minecraft.observer":"Snooper","block.minecraft.banner.stripe_bottom.cyan":"Ocean blue base","block.minecraft.banner.creeper.purple":"Purple creeper charge","block.minecraft.banner.straight_cross.cyan":"Ocean blue cross","block.minecraft.banner.half_horizontal_bottom.brown":"Brown per fess inverted","item.minecraft.firework_star.shape.large_ball":"Large Ball","block.minecraft.prismarine_brick_slab":"Brick Slab o' Prismarine","block.minecraft.jungle_trapdoor":"Hatch o' jungle","block.minecraft.sculk_sensor":"Noise finder","block.minecraft.banner.creeper.orange":"Orange creeper charge","block.minecraft.banner.triangles_top.lime":"Light green chief indented","item.minecraft.charcoal":"Burnt Timber","item.minecraft.tipped_arrow.effect.night_vision":"Bolt o' moonlight","block.minecraft.stone_brick_slab":"Slab o' bricks o' rock","block.minecraft.banner.mojang.cyan":"Ocean blue thing","block.minecraft.white_stained_glass":"White crystal","item.minecraft.bowl":"Nipperkin","block.minecraft.banner.diagonal_up_left.magenta":"Light purple per bend inverted","block.minecraft.banner.square_top_right.light_gray":"Light gray chief sinister canton","block.minecraft.dead_brain_coral_fan":"Dead Walnut Coral Waf'r","block.minecraft.banner.flower.white":"White flower charge","item.minecraft.bone_meal":"Mashed bones","block.minecraft.banner.triangle_bottom.red":"Scarlet chevron","block.minecraft.cyan_carpet":"Ocean blue rug","block.minecraft.oak_door":"Door o' oak","block.minecraft.flowering_azalea_leaves":"Leaves o' Flower Bush","item.minecraft.prismarine_crystals":"Crystals o' Prismarine","block.minecraft.banner.diagonal_left.cyan":"Ocean blue per bend sinister","block.minecraft.banner.stripe_bottom.light_blue":"Light blue base","item.minecraft.tipped_arrow.effect.slow_falling":"Bolt o' Mary Poppins' syndrome","block.minecraft.end_stone":"End stone","block.minecraft.potted_white_tulip":"Dirt vase o' white tulip","block.minecraft.warped_door":"Unnatural Gateway o' Hyphae","block.minecraft.banner.square_top_left.light_gray":"Light gray chief dexter canton","item.minecraft.splash_potion.effect.fire_resistance":"Grenade o' flame's bane","block.minecraft.banner.half_vertical_right.pink":"Pink per pale inverted","item.minecraft.furnace_minecart":"Oven in a landlubbers' boat","block.minecraft.banner.triangles_bottom.light_gray":"Light gray base indented","item.minecraft.shield.red":"Scarlet targe","block.minecraft.quartz_pillar":"Post o' white rock","block.minecraft.prismarine_slab":"Slab o' prismarine","block.minecraft.nether_portal":"Porthole to Nether","item.minecraft.diamond_sword":"Cutlass o' diamond","block.minecraft.oak_planks":"Planks o' oak","item.minecraft.amethyst_shard":"Shard o' gem","block.minecraft.purple_banner":"Purple flag","block.minecraft.structure_void":"Nothin' here, lads","block.minecraft.purple_shulker_box":"Purple shulker box","block.minecraft.potatoes":"Taters","block.minecraft.light_blue_bed":"Light blue bunk","block.minecraft.yellow_banner":"Yellow flag","item.modifiers.head":"If on yer noggin':","item.minecraft.potion.effect.swiftness":"Grog o' full sails","block.minecraft.glass_pane":"Porthole","block.minecraft.clay":"Solid Mud","block.minecraft.banner.diagonal_right.cyan":"Ocean blue per bend","block.minecraft.cut_copper_slab":"Slab o' Sliced Copper","block.minecraft.polished_diorite_slab":"Slab o' good lookin' white pebbles","block.minecraft.banner.piglin.green":"Green snout","item.minecraft.splash_potion.effect.slow_falling":"Grenade o' Mary Poppins' syndrome","item.minecraft.book":"Logbook","block.minecraft.banner.gradient.brown":"Brown gradient","block.minecraft.banner.cross.magenta":"Light purple saltire","block.minecraft.cobblestone_slab":"Slab o' pebbles","block.minecraft.banner.diagonal_right.purple":"Purple per bend","block.minecraft.banner.curly_border.gray":"Gray bordure indented","block.minecraft.big_dripleaf":"Huge venus flytrap","block.minecraft.black_shulker_box":"Black shulker box","block.minecraft.banner.straight_cross.purple":"Purple cross","block.minecraft.blackstone_stairs":"Stairs o' Rock o' Black","block.minecraft.banner.triangles_top.blue":"Blue chief indented","block.minecraft.deepslate_tile_slab":"Slab o' tiles o' tough rock","block.minecraft.banner.Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"ɐʇʇoɔɐɹɹǝ⟘ uʍoɹᗺ","block.minecraft.lapis_ore":"ǝɹO ᴉꞁnzɐꞀ sᴉdɐꞀ","item.minecraft.gray_dye":"ǝʎᗡ ʎǝɹ⅁","block.minecraft.banner.base.yellow":"pꞁǝᴉℲ ʍoꞁꞁǝ⅄ ʎꞁꞁnℲ","block.minecraft.terracotta":"ɐʇʇoɔɐɹɹǝ⟘","item.minecraft.stray_spawn_egg":"ᵷᵷƎ uʍɐdS ʎɐɹʇS","block.minecraft.banner.base.pink":"pꞁǝᴉℲ ʞuᴉԀ ʎꞁꞁnℲ","item.minecraft.potion.effect.weakness":"ssǝuʞɐǝM ɟo uoᴉʇoԀ","block.minecraft.dark_prismarine_slab":"qɐꞁS ǝuᴉɹɐɯsᴉɹԀ ʞɹɐᗡ","item.minecraft.splash_potion.effect.thick":"uoᴉʇoԀ ɥsɐꞁdS ʞɔᴉɥ⟘","item.minecraft.cooked_cod":"poƆ pǝʞooƆ","block.minecraft.red_nether_brick_slab":"qɐꞁS ʞɔᴉɹᗺ ɹǝɥʇǝN pǝᴚ","block.minecraft.yellow_terracotta":"ɐʇʇoɔɐɹɹǝ⟘ ʍoꞁꞁǝ⅄","block.minecraft.observer":"ɹǝʌɹǝsqO","block.minecraft.banner.stripe_bottom.cyan":"ǝsɐᗺ uɐʎƆ","block.minecraft.banner.creeper.purple":"ǝᵷɹɐɥƆ ɹǝdǝǝɹƆ ǝꞁdɹnԀ","block.minecraft.banner.straight_cross.cyan":"ssoɹƆ uɐʎƆ","block.minecraft.banner.half_horizontal_bottom.brown":"ssǝℲ ɹǝԀ uʍoɹᗺ","item.minecraft.firework_star.shape.large_ball":"ꞁꞁɐᗺ ǝᵷɹɐꞀ","block.minecraft.prismarine_brick_slab":"qɐꞁS ʞɔᴉɹᗺ ǝuᴉɹɐɯsᴉɹԀ","block.minecraft.jungle_trapdoor":"ɹoopdɐɹ⟘ ǝꞁᵷunՐ","block.minecraft.sculk_sensor":"ɹosuǝS ʞꞁnɔS","block.minecraft.banner.creeper.orange":"ǝᵷɹɐɥƆ ɹǝdǝǝɹƆ ǝᵷuɐɹO","block.minecraft.banner.triangles_top.lime":"pǝʇuǝpuI ǝsɐᗺ ǝɯᴉꞀ","item.minecraft.charcoal":"ꞁɐoɔɹɐɥƆ","item.minecraft.tipped_arrow.effect.night_vision":"uoᴉsᴉɅ ʇɥᵷᴉN ɟo ʍoɹɹⱯ","block.minecraft.stone_brick_slab":"qɐꞁS ʞɔᴉɹᗺ ǝuoʇS","block.minecraft.banner.mojang.cyan":"ᵷuᴉɥ⟘ uɐʎƆ","block.minecraft.white_stained_glass":"ssɐꞁ⅁ pǝuᴉɐʇS ǝʇᴉɥM","item.minecraft.bowl":"ꞁʍoᗺ","block.minecraft.banner.diagonal_up_left.magenta":"pǝʇɹǝʌuI puǝᗺ ɹǝԀ ɐʇuǝᵷɐW","block.minecraft.banner.square_top_right.light_gray":"uoʇuɐƆ ɹǝʇxǝᗡ ǝsɐᗺ ʎǝɹ⅁ ʇɥᵷᴉꞀ","block.minecraft.dead_brain_coral_fan":"uɐℲ ꞁɐɹoƆ uᴉɐɹᗺ pɐǝᗡ","block.minecraft.banner.flower.white":"ǝᵷɹɐɥƆ ɹǝʍoꞁℲ ǝʇᴉɥM","item.minecraft.bone_meal":"ꞁɐǝW ǝuoᗺ","block.minecraft.banner.triangle_bottom.red":"uoɹʌǝɥƆ pǝʇɹǝʌuI pǝᴚ","block.minecraft.cyan_carpet":"ʇǝdɹɐƆ uɐʎƆ","block.minecraft.oak_door":"ɹooᗡ ʞɐO","block.minecraft.flowering_azalea_leaves":"sǝʌɐǝꞀ ɐǝꞁɐzⱯ ᵷuᴉɹǝʍoꞁℲ","item.minecraft.prismarine_crystals":"sꞁɐʇsʎɹƆ ǝuᴉɹɐɯsᴉɹԀ","block.minecraft.banner.diagonal_left.cyan":"ɹǝʇsᴉuᴉS puǝᗺ ɹǝԀ uɐʎƆ","block.minecraft.banner.stripe_bottom.light_blue":"ǝsɐᗺ ǝnꞁᗺ ʇɥᵷᴉꞀ","item.minecraft.tipped_arrow.effect.slow_falling":"ᵷuᴉꞁꞁɐℲ ʍoꞁS ɟo ʍoɹɹⱯ","block.minecraft.end_stone":"ǝuoʇS puƎ","block.minecraft.potted_white_tulip":"dᴉꞁn⟘ ǝʇᴉɥM pǝʇʇoԀ","block.minecraft.warped_door":"ɹooᗡ pǝdɹɐM","block.minecraft.banner.square_top_left.light_gray":"uoʇuɐƆ ɹǝʇsᴉuᴉS ǝsɐᗺ ʎǝɹ⅁ ʇɥᵷᴉꞀ","item.minecraft.splash_potion.effect.fire_resistance":"ǝɔuɐʇsᴉsǝᴚ ǝɹᴉℲ ɟo uoᴉʇoԀ ɥsɐꞁdS","block.minecraft.banner.half_vertical_right.pink":"ǝꞁɐԀ ɹǝԀ ʞuᴉԀ","item.minecraft.furnace_minecart":"ǝɔɐuɹnℲ ɥʇᴉʍ ʇɹɐɔǝuᴉW","block.minecraft.banner.triangles_bottom.light_gray":"pǝʇuǝpuI ɟǝᴉɥƆ ʎǝɹ⅁ ʇɥᵷᴉꞀ","item.minecraft.shield.red":"pꞁǝᴉɥS pǝᴚ","block.minecraft.quartz_pillar":"ɹɐꞁꞁᴉԀ zʇɹɐnꝹ","block.minecraft.prismarine_slab":"qɐꞁS ǝuᴉɹɐɯsᴉɹԀ","block.minecraft.nether_portal":"ꞁɐʇɹoԀ ɹǝɥʇǝN","item.minecraft.diamond_sword":"pɹoʍS puoɯɐᴉᗡ","block.minecraft.oak_planks":"sʞuɐꞁԀ ʞɐO","item.minecraft.amethyst_shard":"pɹɐɥS ʇsʎɥʇǝɯⱯ","block.minecraft.purple_banner":"ɹǝuuɐᗺ ǝꞁdɹnԀ","block.minecraft.structure_void":"pᴉoɅ ǝɹnʇɔnɹʇS","block.minecraft.purple_shulker_box":"xoᗺ ɹǝʞꞁnɥS ǝꞁdɹnԀ","block.minecraft.potatoes":"sǝoʇɐʇoԀ","block.minecraft.light_blue_bed":"pǝᗺ ǝnꞁᗺ ʇɥᵷᴉꞀ","block.minecraft.yellow_banner":"ɹǝuuɐᗺ ʍoꞁꞁǝ⅄","item.modifiers.head":":pɐǝH uo uǝɥM","item.minecraft.potion.effect.swiftness":"ssǝuʇɟᴉʍS ɟo uoᴉʇoԀ","block.minecraft.glass_pane":"ǝuɐԀ ssɐꞁ⅁","block.minecraft.clay":"ʎɐꞁƆ","block.minecraft.banner.diagonal_right.cyan":"puǝᗺ ɹǝԀ uɐʎƆ","block.minecraft.cut_copper_slab":"qɐꞁS ɹǝddoƆ ʇnƆ","block.minecraft.polished_diorite_slab":"qɐꞁS ǝʇᴉɹoᴉᗡ pǝɥsᴉꞁoԀ","block.minecraft.banner.piglin.green":"ʇnouS uǝǝɹ⅁","item.minecraft.splash_potion.effect.slow_falling":"ᵷuᴉꞁꞁɐℲ ʍoꞁS ɟo uoᴉʇLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brown Bakedclay","block.minecraft.lapis_ore":"Hewenstone Ore","item.minecraft.gray_dye":"Gray Dye","block.minecraft.banner.base.yellow":"Fully Yellow Field","block.minecraft.terracotta":"Bakedclay","item.minecraft.stray_spawn_egg":"Drifter Making Ey","block.minecraft.banner.base.pink":"Fully Light Red Field","item.minecraft.potion.effect.weakness":"Lib of Weakness","block.minecraft.dark_prismarine_slab":"Dark Prismarine Slab","item.minecraft.splash_potion.effect.thick":"Thick Splash Lib","item.minecraft.cooked_cod":"Cooked Cod","block.minecraft.red_nether_brick_slab":"Red Nether Bakestone Slab","block.minecraft.yellow_terracotta":"Yellow Bakedclay","block.minecraft.observer":"Umbletend","block.minecraft.banner.stripe_bottom.cyan":"Hewengreen Bottom","block.minecraft.banner.creeper.purple":"Bawse Creeper Shape","block.minecraft.banner.straight_cross.cyan":"Hewengreen Rood","block.minecraft.banner.half_horizontal_bottom.brown":"Brown Bottom Half","item.minecraft.firework_star.shape.large_ball":"Great Ball","block.minecraft.prismarine_brick_slab":"Prismarine Stonestave Slab","block.minecraft.jungle_trapdoor":"Rainwold Trapdoor","block.minecraft.sculk_sensor":"Sculk Feeler","block.minecraft.banner.creeper.orange":"Yellowred Creeper Shape","block.minecraft.banner.triangles_top.lime":"Light Green Sawtoothed Top","item.minecraft.charcoal":"Charcoal","item.minecraft.tipped_arrow.effect.night_vision":"Arrow of Nightsight","block.minecraft.stone_brick_slab":"Stone Tile Slab","block.minecraft.banner.mojang.cyan":"Hewengreen Thing","block.minecraft.white_stained_glass":"White Hued Glass","item.minecraft.bowl":"Bowl","block.minecraft.banner.diagonal_up_left.magenta":"Bawsered Left Leaning Down","block.minecraft.banner.square_top_right.light_gray":"Light Gray Top Left Hirn","block.minecraft.dead_brain_coral_fan":"Dead Brain Limeshaft Fan","block.minecraft.banner.flower.white":"White Bloom Shape","item.minecraft.bone_meal":"Bone Meal","block.minecraft.banner.triangle_bottom.red":"Red Thrihirn","block.minecraft.cyan_carpet":"Hewengreen Tappet","block.minecraft.oak_door":"Oak Door","block.minecraft.flowering_azalea_leaves":"Blooming Drywort Leaves","item.minecraft.prismarine_crystals":"Prismarine Hirsts","block.minecraft.banner.diagonal_left.cyan":"Hewengreen Left Leaning Up","block.minecraft.banner.stripe_bottom.light_blue":"Light Hewen Bottom","item.minecraft.tipped_arrow.effect.slow_falling":"Arrow of Slow Falling","block.minecraft.end_stone":"End Stone","block.minecraft.potted_white_tulip":"Potted White Houvebloom","block.minecraft.warped_door":"Warped Door","block.minecraft.banner.square_top_left.light_gray":"Light Gray Top Right Hirn","item.minecraft.splash_potion.effect.fire_resistance":"Splash Lib of Fire Withstanding","block.minecraft.banner.half_vertical_right.pink":"Light Red Upright Half Right","item.minecraft.furnace_minecart":"Delvewagon with Oven","block.minecraft.banner.triangles_bottom.light_gray":"Light Gray Sawtoothed Bottom","item.minecraft.shield.red":"Red Shield","block.minecraft.quartz_pillar":"Hardstone Staple","block.minecraft.prismarine_slab":"Prismarine Slab","block.minecraft.nether_portal":"Nether Gateway","item.minecraft.diamond_sword":"Hardhirst Sword","block.minecraft.oak_planks":"Oak Boards","item.minecraft.amethyst_shard":"Drunklack Shard","block.minecraft.purple_banner":"Bawse Streamer","block.minecraft.structure_void":"Framework Roomth","block.minecraft.purple_shulker_box":"Bawse Shulker Pack","block.minecraft.potatoes":"Earthpear","block.minecraft.light_blue_bed":"Light Hewen Bed","block.minecraft.yellow_banner":"Yellow Streamer","item.modifiers.head":"When on Head:","item.minecraft.potion.effect.swiftness":"Lib of Swiftness","block.minecraft.glass_pane":"Glass Eyethurl","block.minecraft.clay":"Clay","block.minecraft.banner.diagonal_right.cyan":"Hewengreen Right Leaning Up","block.minecraft.cut_copper_slab":"Cut Are Slab","block.minecraft.polished_diorite_slab":"Smooth Markfieldstone Slab","block.minecraft.banner.piglin.green":"Green Pignose","item.minecraft.splash_potion.effect.slow_falling":"Splash Lib of Slow Falling","item.minecraft.book":"Book","block.minecraft.banner.gradient.brown":"Brown Dimming","block.minecraft.banner.cross.magenta":"Bawsered Leaning Rood","block.minecraft.cobblestone_slab":"Cobblestone Slab","block.minecraft.banner.diagonal_right.purple":"Bawse Right Leaning Up","block.minecraft.banner.curly_border.gray":"Gray Sawtoothed Frame","block.minecraft.big_dripleaf":"Great Dripleaf","block.minecraft.black_shulker_box":"Black Shulker Pack","block.minecraft.banner.straight_cross.purple":"Bawse Rood","block.minecraft.blackstone_stairs":"Blackstone Stairs","block.minecraft.banner.triangles_top.blue":"Hewen Sawtoothed Top","block.minecraft.deepslate_tile_slab":"Deepstone Flatstave Slab","block.minecraft.banner.square_top_left.blue":"Hewen Top Right Hirn","block.minecraft.banner.stripe_center.yellow":"Yellow Thin Streak","item.minecraft.Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Brown Earthen Block","block.minecraft.lapis_ore":"Lapis Ore","item.minecraft.gray_dye":"Grey Dye","block.minecraft.banner.base.yellow":"Entirely Yellow Plain","block.minecraft.terracotta":"Earthen Block","item.minecraft.stray_spawn_egg":"Adder Stone o' Mummy","block.minecraft.banner.base.pink":"Entirely Pink Plain","item.minecraft.potion.effect.weakness":"Potion o' Ague","block.minecraft.dark_prismarine_slab":"Dark Prismarine Slab","item.minecraft.splash_potion.effect.thick":"Thick Throwing Potion","item.minecraft.cooked_cod":"Cooked Cod","block.minecraft.red_nether_brick_slab":"Red Nether Brick Slab","block.minecraft.yellow_terracotta":"Yellow Earthen Block","block.minecraft.observer":"Watcher","block.minecraft.banner.stripe_bottom.cyan":"Turquoise Base","block.minecraft.banner.creeper.purple":"Purple Creeper Charge","block.minecraft.banner.straight_cross.cyan":"Turquoise Cross","block.minecraft.banner.half_horizontal_bottom.brown":"Brown Per Fess Inverted","item.minecraft.firework_star.shape.large_ball":"Large Ball","block.minecraft.prismarine_brick_slab":"Prismarine Brick Slab","block.minecraft.jungle_trapdoor":"Exotic Hatch","block.minecraft.sculk_sensor":"Sculk Detector","block.minecraft.banner.creeper.orange":"Tawny Creeper Charge","block.minecraft.banner.triangles_top.lime":"Lincoln Chief Indented","item.minecraft.charcoal":"Charcoal","item.minecraft.tipped_arrow.effect.night_vision":"Arrow o' Arrant Vision","block.minecraft.stone_brick_slab":"Stone Brick Slab","block.minecraft.banner.mojang.cyan":"Turquoise Emblem","block.minecraft.white_stained_glass":"White-Coloured Glass","item.minecraft.bowl":"Bowl","block.minecraft.banner.diagonal_up_left.magenta":"Mulberry Per Bend Inverted","block.minecraft.banner.square_top_right.light_gray":"Pale Grey Chief Sinister Canton","block.minecraft.dead_brain_coral_fan":"Dead Small Carnation Coral","block.minecraft.banner.flower.white":"White Flower Charge","item.minecraft.bone_meal":"Bone Powder","block.minecraft.banner.triangle_bottom.red":"Red Chevron","block.minecraft.cyan_carpet":"Turquoise Carpet","block.minecraft.oak_door":"Oaken Door","block.minecraft.flowering_azalea_leaves":"Flowering Shrub Leaves","item.minecraft.prismarine_crystals":"Prismarine Crystals","block.minecraft.banner.diagonal_left.cyan":"Turquoise Per Bend Sinister","block.minecraft.banner.stripe_bottom.light_blue":"Whey Base","item.minecraft.tipped_arrow.effect.slow_falling":"Arrow o' Ground's Forbearance","block.minecraft.end_stone":"End Stone","block.minecraft.potted_white_tulip":"Pott'd White Carnation","block.minecraft.warped_door":"Warpwood Door","block.minecraft.banner.square_top_left.light_gray":"Pale Grey Chief Dexter Canton","item.minecraft.splash_potion.effect.fire_resistance":"Throwing Potion o\u2019 Incombustion","block.minecraft.banner.half_vertical_right.pink":"Carnation Per Pale Inverted","item.minecraft.furnace_minecart":"Furnace in a Cart","block.minecraft.banner.triangles_bottom.light_gray":"Pale Grey Base Indented","item.minecraft.shield.red":"Red Shield","block.minecraft.quartz_pillar":"Pillar of Quarz","block.minecraft.prismarine_slab":"Prismarine Slab","block.minecraft.nether_portal":"Nether Portal","item.minecraft.diamond_sword":"Diamond Sword","block.minecraft.oak_planks":"Oaken Timber","item.minecraft.amethyst_shard":"Amethyst Shard","block.minecraft.purple_banner":"Purple Banner","block.minecraft.structure_void":"Structure Void","block.minecraft.purple_shulker_box":"Purple Shulker Case","block.minecraft.potatoes":"Potatoes","block.minecraft.light_blue_bed":"Whey Bed","block.minecraft.yellow_banner":"Yellow Banner","item.modifiers.head":"On the Head:","item.minecraft.potion.effect.swiftness":"Potion o' Hieing","block.minecraft.glass_pane":"Glass Pane","block.minecraft.clay":"Clay","block.minecraft.banner.diagonal_right.cyan":"Turquoise Per Bend","block.minecraft.cut_copper_slab":"Cutteth Copp'r Slab","block.minecraft.polished_diorite_slab":"White Marble Slab","block.minecraft.banner.piglin.green":"Green Snout","item.minecraft.splash_potion.effect.slow_falling":"Throwing Potion o\u2019 Ground's Forbearance","item.minecraft.book":"Book","block.minecraft.banner.gradient.brown":"Brown Gradient","block.minecraft.banner.cross.magenta":"Mulberry Saltire","block.minecraft.cobblestone_slab":"Cobble Slab","block.minecraft.banner.diagonal_right.purple":"Purple Per Bend","block.minecraft.banner.curly_border.gray":"Grey Bordure Indented","block.minecraft.big_dripleaf":"Big Dripleaf","block.minecraft.black_shulker_box":"Black Shulker Case","block.minecraft.banner.straight_cross.purple":"Purple Cross","block.minecraft.blackstone_stairs":"Blackstone Stairs","block.minecraft.banner.triangles_top.blue":"Blue Chief Indented","block.minecraft.deepslate_tile_slab":"Deepethslate Tyle Slab","block.minecraft.banner.square_top_left.blue":"Blue Chief Dexter Canton","block.minecraft.banner.stripe_center.yellow":"Yellow Pale","item.minecraft.piglin_banner_pLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Bruna terakoto","block.minecraft.lapis_ore":"Lazurita erco","item.minecraft.gray_dye":"Griza tinkturo","block.minecraft.banner.base.yellow":"Plene flava surfaco","block.minecraft.terracotta":"Terakoto","item.minecraft.stray_spawn_egg":"Aperigovo de devojiĝanto","block.minecraft.banner.base.pink":"Plene rozkolora surfaco","item.minecraft.potion.effect.weakness":"Eliksiro de malforteco","block.minecraft.dark_prismarine_slab":"Malhelprismarina ŝtupo","item.minecraft.splash_potion.effect.thick":"Densa ŝpruca eliksiro","item.minecraft.cooked_cod":"Kuirita moruo","block.minecraft.red_nether_brick_slab":"Ruĝa Netherbrika ŝtupo","block.minecraft.yellow_terracotta":"Flava terakoto","block.minecraft.observer":"Observilo","block.minecraft.banner.stripe_bottom.cyan":"Turkisa bazo","block.minecraft.banner.creeper.purple":"Violkolora kapo de Creeper","block.minecraft.banner.straight_cross.cyan":"Turkisa kruco","block.minecraft.banner.half_horizontal_bottom.brown":"Bruna suba duono","item.minecraft.firework_star.shape.large_ball":"Granda bulo","block.minecraft.prismarine_brick_slab":"Prismarinbrika ŝtupo","block.minecraft.jungle_trapdoor":"Ĝangalarba klappordo","block.minecraft.sculk_sensor":"Sculka sensoro","block.minecraft.banner.creeper.orange":"Oranĝkolora kapo de Creeper","block.minecraft.banner.triangles_top.lime":"Helverda pinta kapo","item.minecraft.charcoal":"Lignokarbo","item.minecraft.tipped_arrow.effect.night_vision":"Sago de noktvido","block.minecraft.stone_brick_slab":"Ŝtonbrika ŝtupo","block.minecraft.banner.mojang.cyan":"Turkisa simbolo","block.minecraft.white_stained_glass":"Blankigita vitro","item.minecraft.bowl":"Bovlo","block.minecraft.banner.diagonal_up_left.magenta":"Malva dekstra suba duono","block.minecraft.banner.square_top_right.light_gray":"Helgriza supra maldekstra angulo","block.minecraft.dead_brain_coral_fan":"Mortinta ventumilo cerbokorala","block.minecraft.banner.flower.white":"Blanka floro","item.minecraft.bone_meal":"Osta faruno","block.minecraft.banner.triangle_bottom.red":"Ruĝa ĉevrono","block.minecraft.cyan_carpet":"Turkisa tapiŝo","block.minecraft.oak_door":"Kverka pordo","block.minecraft.flowering_azalea_leaves":"Foliaro de floranta azaleo","item.minecraft.prismarine_crystals":"Prismarina kristalo","block.minecraft.banner.diagonal_left.cyan":"Turkisa dekstra supra duono","block.minecraft.banner.stripe_bottom.light_blue":"Helblua bazo","item.minecraft.tipped_arrow.effect.slow_falling":"Sago de malrapida falo","block.minecraft.end_stone":"Endŝtono","block.minecraft.potted_white_tulip":"Blanka tulipo en florpoto","block.minecraft.warped_door":"Torda pordo","block.minecraft.banner.square_top_left.light_gray":"Helgriza supra dekstra angulo","item.minecraft.splash_potion.effect.fire_resistance":"Ŝpruca eliksiro de fajrorezisto","block.minecraft.banner.half_vertical_right.pink":"Rozkolora maldekstra flanko","item.minecraft.furnace_minecart":"Vagoneto kun forno","block.minecraft.banner.triangles_bottom.light_gray":"Helgriza pinta bazo","item.minecraft.shield.red":"Ruĝa ŝildo","block.minecraft.quartz_pillar":"Kvarca kolono","block.minecraft.prismarine_slab":"Prismarina ŝtupo","block.minecraft.nether_portal":"Netherportalo","item.minecraft.diamond_sword":"Diamanta glavo","block.minecraft.oak_planks":"Kverka tabularo","item.minecraft.amethyst_shard":"Fragmento de ametisto","block.minecraft.purple_banner":"Violkolora standardo","block.minecraft.structure_void":"Strukturvakuo","block.minecraft.purple_shulker_box":"Violkolora Shulkerskatolo","block.minecraft.potatoes":"Terpomoj","block.minecraft.light_blue_bed":"Helblua lito","block.minecraft.yellow_banner":"Flava standardo","item.modifiers.head":"Kiam sur kapo:","item.minecraft.potion.effect.swiftness":"Eliksiro de rapideco","block.minecraft.glass_pane":"Glaco","block.minecraft.clay":"Argilbloko","block.minecraft.banner.diagonal_right.cyan":"Turkisa maldekstra supra duono","block.minecraft.cut_copper_slab":"Tranĉita kupra ŝtupo","block.minecraft.polished_diorite_slab":"Polurita diorita ŝtupo","block.minecraft.banner.piglin.green":"Verda muzelo","item.minecraft.splash_potion.effect.slow_falling":"Ŝpruca eliksiro de malrapida falo","item.minecraft.book":"Libro","block.minecraft.banner.gradient.brown":"Bruna gradiento","block.minecraft.banner.cross.magenta":"Malva saltiero","block.minecraft.cobblestone_slab":"Pavimŝtona ŝtupo","block.minecraft.banner.diagonal_right.purple":"Violkolora maldekstra supra duono","block.minecraft.banner.curly_border.gray":"Griza pintbordero","block.minecraft.big_dripleaf":"Gutfoliego","block.minecraft.black_shulker_box":"Nigra Shulkerskatolo","block.minecraft.banner.straight_cross.purple":"Violkolora kruco","block.minecraft.blackstone_stairs":"Nigroŝtona ŝtuparo","block.minecraft.banner.triangles_top.blue":"Blua pinta kapo","block.minecraft.deepslate_tile_slab":"Ardeza briketa ŝtupo","block.minecraft.banner.square_top_left.blue":"Blua supra dekstra angulo",Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota marrón","block.minecraft.lapis_ore":"Mineral de lapislázuli","item.minecraft.gray_dye":"Tinte gris","block.minecraft.banner.base.yellow":"Paño completamente amarillo","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Generar esqueleto glacial (Stray)","block.minecraft.banner.base.pink":"Paño completamente rosado","item.minecraft.potion.effect.weakness":"Poción de debilidad","block.minecraft.dark_prismarine_slab":"Baldosa de prismarina oscura","item.minecraft.splash_potion.effect.thick":"Poción arrojadiza densa","item.minecraft.cooked_cod":"Bacalao cocinado","block.minecraft.red_nether_brick_slab":"Baldosa de ladrillos del Nether rojos","block.minecraft.yellow_terracotta":"Terracota amarilla","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Campaña cian","block.minecraft.banner.creeper.purple":"Figura de creeper violeta","block.minecraft.banner.straight_cross.cyan":"Cruz cian","block.minecraft.banner.half_horizontal_bottom.brown":"Cortado invertido marrón","item.minecraft.firework_star.shape.large_ball":"Bola grande","block.minecraft.prismarine_brick_slab":"Baldosa de ladrillos de prismarina","block.minecraft.jungle_trapdoor":"Escotilla de jungla","block.minecraft.sculk_sensor":"Sensor de sculk","block.minecraft.banner.creeper.orange":"Figura de creeper naranja","block.minecraft.banner.triangles_top.lime":"Jefe dentado verde lima","item.minecraft.charcoal":"Carbón vegetal","item.minecraft.tipped_arrow.effect.night_vision":"Flecha de visión nocturna","block.minecraft.stone_brick_slab":"Baldosa de ladrillos de piedra","block.minecraft.banner.mojang.cyan":"Logotipo cian","block.minecraft.white_stained_glass":"Vidrio blanco","item.minecraft.bowl":"Bol","block.minecraft.banner.diagonal_up_left.magenta":"Tronchado invertido magenta","block.minecraft.banner.square_top_right.light_gray":"Cantón siniestro gris claro en jefe","block.minecraft.dead_brain_coral_fan":"Gorgonia de cerebro muerta","block.minecraft.banner.flower.white":"Figura de flor blanca","item.minecraft.bone_meal":"Hueso molido","block.minecraft.banner.triangle_bottom.red":"Chevrón rojo","block.minecraft.cyan_carpet":"Alfombra cian","block.minecraft.oak_door":"Puerta de roble","block.minecraft.flowering_azalea_leaves":"Hojas de azalea florida","item.minecraft.prismarine_crystals":"Cristales de prismarina","block.minecraft.banner.diagonal_left.cyan":"Tajado cian","block.minecraft.banner.stripe_bottom.light_blue":"Campaña celeste","item.minecraft.tipped_arrow.effect.slow_falling":"Flecha de caída lenta","block.minecraft.end_stone":"Piedra del End","block.minecraft.potted_white_tulip":"Maceta con tulipán blanco","block.minecraft.warped_door":"Puerta distorsionada","block.minecraft.banner.square_top_left.light_gray":"Cantón diestro gris claro en jefe","item.minecraft.splash_potion.effect.fire_resistance":"Poción arrojadiza de resistencia al fuego","block.minecraft.banner.half_vertical_right.pink":"Partido a siniestra rosa","item.minecraft.furnace_minecart":"Carrito con horno","block.minecraft.banner.triangles_bottom.light_gray":"Campaña dentada gris claro","item.minecraft.shield.red":"Escudo rojo","block.minecraft.quartz_pillar":"Columna de cuarzo","block.minecraft.prismarine_slab":"Baldosa de prismarina","block.minecraft.nether_portal":"Portal del Nether","item.minecraft.diamond_sword":"Espada de diamante","block.minecraft.oak_planks":"Madera de roble","item.minecraft.amethyst_shard":"Fragmento de amatista","block.minecraft.purple_banner":"Estandarte violeta","block.minecraft.structure_void":"Vacío de estructuras","block.minecraft.purple_shulker_box":"Caja de shulker violeta","block.minecraft.potatoes":"Papas","block.minecraft.light_blue_bed":"Cama celeste","block.minecraft.yellow_banner":"Estandarte amarillo","item.modifiers.head":"En la cabeza:","item.minecraft.potion.effect.swiftness":"Poción de velocidad","block.minecraft.glass_pane":"Panel de vidrio","block.minecraft.clay":"Arcilla","block.minecraft.banner.diagonal_right.cyan":"Tronchado cian","block.minecraft.cut_copper_slab":"Baldosa de cobre cortado","block.minecraft.polished_diorite_slab":"Baldosa de diorita pulida","block.minecraft.banner.piglin.green":"Hocico verde","item.minecraft.splash_potion.effect.slow_falling":"Poción arrojadiza de caída lenta","item.minecraft.book":"Libro","block.minecraft.banner.gradient.brown":"Gradiente marrón","block.minecraft.banner.cross.magenta":"Aspa magenta","block.minecraft.cobblestone_slab":"Baldosa de adoquín","block.minecraft.banner.diagonal_right.purple":"Tronchado violeta","block.minecraft.banner.curly_border.gray":"Bordura dentada gris","block.minecraft.big_dripleaf":"Plantaforma","block.minecraft.black_shulker_box":"Caja de shulker negra","block.minecraft.banner.straight_cross.purple":"Cruz violeta","block.minecraft.blackstone_stairs":"Escaleras de piedra negra","block.minecraft.banner.triangles_top.blue":"Jefe dentado azulLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota café","block.minecraft.lapis_ore":"Mineral de lapislázuli","item.minecraft.gray_dye":"Tinte gris","block.minecraft.banner.base.yellow":"Tela completamente amarilla","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Generar stray","block.minecraft.banner.base.pink":"Tela completamente rosada","item.minecraft.potion.effect.weakness":"Poción de debilidad","block.minecraft.dark_prismarine_slab":"Losa de prismarina oscura","item.minecraft.splash_potion.effect.thick":"Poción arrojadiza espesa","item.minecraft.cooked_cod":"Bacalao asado","block.minecraft.red_nether_brick_slab":"Losa de ladrillos del Nether rojos","block.minecraft.yellow_terracotta":"Terracota amarilla","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Base Cian","block.minecraft.banner.creeper.purple":"Estampado morado de creeper","block.minecraft.banner.straight_cross.cyan":"Cruz cian","block.minecraft.banner.half_horizontal_bottom.brown":"Cortado marrón invertido","item.minecraft.firework_star.shape.large_ball":"Esfera grande","block.minecraft.prismarine_brick_slab":"Losa de ladrillos de prismarina","block.minecraft.jungle_trapdoor":"Trampilla de jungla","block.minecraft.sculk_sensor":"Sensor de sculk","block.minecraft.banner.creeper.orange":"Estampado naranja de creeper","block.minecraft.banner.triangles_top.lime":"Jefe verde lima dentado","item.minecraft.charcoal":"Carbón vegetal","item.minecraft.tipped_arrow.effect.night_vision":"Flecha de visión nocturna","block.minecraft.stone_brick_slab":"Losa de ladrillos de piedra","block.minecraft.banner.mojang.cyan":"Cosa cian","block.minecraft.white_stained_glass":"Vidrio teñido de blanco","item.minecraft.bowl":"Pocillo","block.minecraft.banner.diagonal_up_left.magenta":"Tronchado magenta invertido","block.minecraft.banner.square_top_right.light_gray":"Cantón siniestro gris claro en jefe","block.minecraft.dead_brain_coral_fan":"Gorgonia cerebro muerta","block.minecraft.banner.flower.white":"Estampado blanco de flor","item.minecraft.bone_meal":"Polvo de hueso","block.minecraft.banner.triangle_bottom.red":"Chevrón rojo","block.minecraft.cyan_carpet":"Alfombra cian","block.minecraft.oak_door":"Puerta de roble","block.minecraft.flowering_azalea_leaves":"Hojas de azalea florida","item.minecraft.prismarine_crystals":"Cristales de prismarina","block.minecraft.banner.diagonal_left.cyan":"Tajado cian","block.minecraft.banner.stripe_bottom.light_blue":"Base celeste","item.minecraft.tipped_arrow.effect.slow_falling":"Flecha de caída lenta","block.minecraft.end_stone":"Piedra del End","block.minecraft.potted_white_tulip":"Macetero con tulipán blanco","block.minecraft.warped_door":"Puerta distorsionada","block.minecraft.banner.square_top_left.light_gray":"Cantón diestro gris claro en jefe","item.minecraft.splash_potion.effect.fire_resistance":"Poción arrojadiza de resistencia ígnea","block.minecraft.banner.half_vertical_right.pink":"Flanco rosado invertido","item.minecraft.furnace_minecart":"Vagón con horno","block.minecraft.banner.triangles_bottom.light_gray":"Base gris claro dentada","item.minecraft.shield.red":"Escudo rojo","block.minecraft.quartz_pillar":"Pilar de cuarzo","block.minecraft.prismarine_slab":"Losa de prismarina","block.minecraft.nether_portal":"Portal al Nether","item.minecraft.diamond_sword":"Espada de diamante","block.minecraft.oak_planks":"Tablas de roble","item.minecraft.amethyst_shard":"Fragmento de amatista","block.minecraft.purple_banner":"Estandarte morado","block.minecraft.structure_void":"Vacío estructural","block.minecraft.purple_shulker_box":"Caja de shulker morada","block.minecraft.potatoes":"Papas","block.minecraft.light_blue_bed":"Cama celeste","block.minecraft.yellow_banner":"Estandarte amarillo","item.modifiers.head":"En la cabeza:","item.minecraft.potion.effect.swiftness":"Poción de velocidad","block.minecraft.glass_pane":"Panel de vidrio","block.minecraft.clay":"Bloque de arcilla","block.minecraft.banner.diagonal_right.cyan":"Tronchado cian","block.minecraft.cut_copper_slab":"Losa de cobre cortado","block.minecraft.polished_diorite_slab":"Losa de diorita pulida","block.minecraft.banner.piglin.green":"Hocico verde","item.minecraft.splash_potion.effect.slow_falling":"Poción arrojadiza de caída lenta","item.minecraft.book":"Libro","block.minecraft.banner.gradient.brown":"Gradiente marrón","block.minecraft.banner.cross.magenta":"Aspa magenta","block.minecraft.cobblestone_slab":"Losa de adoquín","block.minecraft.banner.diagonal_right.purple":"Tronchado morado","block.minecraft.banner.curly_border.gray":"Bordura gris dentada","block.minecraft.big_dripleaf":"Plantaforma grande","block.minecraft.black_shulker_box":"Caja de shulker negra","block.minecraft.banner.straight_cross.purple":"Cruz morada","block.minecraft.blackstone_stairs":"Escaleras de piedra negra","block.minecraft.banner.triangles_top.blue":"Jefe azul dentado","block.minecraft.deepslate_tile_slaLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota café","block.minecraft.lapis_ore":"Mineral de lapislázuli","item.minecraft.gray_dye":"Tinte gris","block.minecraft.banner.base.yellow":"Paño completamente amarillo","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Generar esqueleto glacial","block.minecraft.banner.base.pink":"Paño completamente rosado","item.minecraft.potion.effect.weakness":"Poción de debilidad","block.minecraft.dark_prismarine_slab":"Losa de prismarina oscura","item.minecraft.splash_potion.effect.thick":"Poción espesa arrojadiza","item.minecraft.cooked_cod":"Bacalao asado","block.minecraft.red_nether_brick_slab":"Losa de ladrillos del Nether rojos","block.minecraft.yellow_terracotta":"Terracota amarilla","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Base turquesa","block.minecraft.banner.creeper.purple":"Estampado de creeper morado","block.minecraft.banner.straight_cross.cyan":"Cruz turquesa","block.minecraft.banner.half_horizontal_bottom.brown":"Cortado café invertido","item.minecraft.firework_star.shape.large_ball":"Esfera grande","block.minecraft.prismarine_brick_slab":"Losa de ladrillos de prismarina","block.minecraft.jungle_trapdoor":"Trampilla de jungla","block.minecraft.sculk_sensor":"Sensor de sculk","block.minecraft.banner.creeper.orange":"Estampado de creeper naranja","block.minecraft.banner.triangles_top.lime":"Jefe verde lima dentado","item.minecraft.charcoal":"Carbón vegetal","item.minecraft.tipped_arrow.effect.night_vision":"Flecha de visión nocturna","block.minecraft.stone_brick_slab":"Losa de ladrillos de piedra","block.minecraft.banner.mojang.cyan":"Estampado extraño turquesa","block.minecraft.white_stained_glass":"Vidrio blanco","item.minecraft.bowl":"Tazón","block.minecraft.banner.diagonal_up_left.magenta":"Tronchado fucsia invertido","block.minecraft.banner.square_top_right.light_gray":"Cantón gris claro en jefe a siniestra","block.minecraft.dead_brain_coral_fan":"Gorgonia de cerebro muerta","block.minecraft.banner.flower.white":"Estampado de flor blanca","item.minecraft.bone_meal":"Polvo de hueso","block.minecraft.banner.triangle_bottom.red":"Chevrón Rojo","block.minecraft.cyan_carpet":"Alfombra turquesa","block.minecraft.oak_door":"Puerta de roble","block.minecraft.flowering_azalea_leaves":"Hojas de azalea floreciente","item.minecraft.prismarine_crystals":"Cristales de prismarina","block.minecraft.banner.diagonal_left.cyan":"Tajado turquesa","block.minecraft.banner.stripe_bottom.light_blue":"Base celeste","item.minecraft.tipped_arrow.effect.slow_falling":"Flecha de caída lenta","block.minecraft.end_stone":"Piedra del End","block.minecraft.potted_white_tulip":"Maceta con tulipán blanco","block.minecraft.warped_door":"Puerta distorsionada","block.minecraft.banner.square_top_left.light_gray":"Cantón gris claro en jefe a diestra","item.minecraft.splash_potion.effect.fire_resistance":"Poción de resistencia al fuego arrojadiza","block.minecraft.banner.half_vertical_right.pink":"Flanco rosado invertido","item.minecraft.furnace_minecart":"Vagón con horno","block.minecraft.banner.triangles_bottom.light_gray":"Base gris claro dentada","item.minecraft.shield.red":"Escudo rojo","block.minecraft.quartz_pillar":"Pilar de cuarzo","block.minecraft.prismarine_slab":"Losa de prismarina","block.minecraft.nether_portal":"Portal al Nether","item.minecraft.diamond_sword":"Espada de diamante","block.minecraft.oak_planks":"Tablas de roble","item.minecraft.amethyst_shard":"Fragmento de amatista","block.minecraft.purple_banner":"Estandarte morado","block.minecraft.structure_void":"Vacío estructural","block.minecraft.purple_shulker_box":"Caja de shulker morada","block.minecraft.potatoes":"Papas","block.minecraft.light_blue_bed":"Cama celeste","block.minecraft.yellow_banner":"Estandarte amarillo","item.modifiers.head":"En la cabeza:","item.minecraft.potion.effect.swiftness":"Poción de velocidad","block.minecraft.glass_pane":"Panel de vidrio","block.minecraft.clay":"Arcilla","block.minecraft.banner.diagonal_right.cyan":"Tronchado turquesa","block.minecraft.cut_copper_slab":"Losa de cobre cortado","block.minecraft.polished_diorite_slab":"Losa de diorita pulida","block.minecraft.banner.piglin.green":"Hocico verde","item.minecraft.splash_potion.effect.slow_falling":"Poción de caída lenta arrojadiza","item.minecraft.book":"Libro","block.minecraft.banner.gradient.brown":"Gradiente café","block.minecraft.banner.cross.magenta":"Aspa fucsia","block.minecraft.cobblestone_slab":"Losa de piedra labrada","block.minecraft.banner.diagonal_right.purple":"Tronchado morado","block.minecraft.banner.curly_border.gray":"Bordura gris dentada","block.minecraft.big_dripleaf":"Plantaforma grande","block.minecraft.black_shulker_box":"Caja de shulker negra","block.minecraft.banner.straight_cross.purple":"Cruz morada","block.minecraft.blackstone_stairs":"Escaleras de piedra negra","block.minecraft.banner.triangles_top.blue":"Jefe azul denLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota marrón","block.minecraft.lapis_ore":"Mena de lapislázuli","item.minecraft.gray_dye":"Tinte gris","block.minecraft.banner.base.yellow":"Paño completamente amarillo","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Generar esqueleto glacial","block.minecraft.banner.base.pink":"Paño completamente rosa","item.minecraft.potion.effect.weakness":"Poción de debilidad","block.minecraft.dark_prismarine_slab":"Losa de prismarina oscura","item.minecraft.splash_potion.effect.thick":"Poción densa arrojadiza","item.minecraft.cooked_cod":"Bacalao cocinado","block.minecraft.red_nether_brick_slab":"Losa de ladrillos del Nether rojos","block.minecraft.yellow_terracotta":"Terracota amarilla","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Campaña cian","block.minecraft.banner.creeper.purple":"Estampado morado de creeper","block.minecraft.banner.straight_cross.cyan":"Cruz cian","block.minecraft.banner.half_horizontal_bottom.brown":"Cortado marrón invertido","item.minecraft.firework_star.shape.large_ball":"Bola grande","block.minecraft.prismarine_brick_slab":"Losa de ladrillos de prismarina","block.minecraft.jungle_trapdoor":"Trampilla de jungla","block.minecraft.sculk_sensor":"Sensor de sculk","block.minecraft.banner.creeper.orange":"Estampado naranja de creeper","block.minecraft.banner.triangles_top.lime":"Jefe verde lima dentado","item.minecraft.charcoal":"Carbón vegetal","item.minecraft.tipped_arrow.effect.night_vision":"Flecha de visión nocturna","block.minecraft.stone_brick_slab":"Losa de ladrillos de piedra","block.minecraft.banner.mojang.cyan":"Estampado cian de una cosa","block.minecraft.white_stained_glass":"Cristal tintado de blanco","item.minecraft.bowl":"Cuenco","block.minecraft.banner.diagonal_up_left.magenta":"Tronchado magenta invertido","block.minecraft.banner.square_top_right.light_gray":"Cantón gris claro en jefe a siniestra","block.minecraft.dead_brain_coral_fan":"Gorgonia de cerebro muerta","block.minecraft.banner.flower.white":"Estampado blanco de flor","item.minecraft.bone_meal":"Polvo de hueso","block.minecraft.banner.triangle_bottom.red":"Chevrón rojo","block.minecraft.cyan_carpet":"Alfombra cian","block.minecraft.oak_door":"Puerta de roble","block.minecraft.flowering_azalea_leaves":"Hojas de azalea florecida","item.minecraft.prismarine_crystals":"Cristales de prismarina","block.minecraft.banner.diagonal_left.cyan":"Tajado cian","block.minecraft.banner.stripe_bottom.light_blue":"Campaña azul claro","item.minecraft.tipped_arrow.effect.slow_falling":"Flecha de caída lenta","block.minecraft.end_stone":"Piedra del End","block.minecraft.potted_white_tulip":"Maceta con tulipán blanco","block.minecraft.warped_door":"Puerta distorsionada","block.minecraft.banner.square_top_left.light_gray":"Cantón gris claro en jefe a diestra","item.minecraft.splash_potion.effect.fire_resistance":"Poción de cuerpo ignífugo arrojadiza","block.minecraft.banner.half_vertical_right.pink":"Flanco rosa invertido","item.minecraft.furnace_minecart":"Vagoneta con horno","block.minecraft.banner.triangles_bottom.light_gray":"Base gris claro dentada","item.minecraft.shield.red":"Escudo rojo","block.minecraft.quartz_pillar":"Pilar de cuarzo","block.minecraft.prismarine_slab":"Losa de prismarina","block.minecraft.nether_portal":"Portal al Nether","item.minecraft.diamond_sword":"Espada de diamante","block.minecraft.oak_planks":"Tablones de roble","item.minecraft.amethyst_shard":"Fragmento de amatista","block.minecraft.purple_banner":"Estandarte morado","block.minecraft.structure_void":"Vacío estructural","block.minecraft.purple_shulker_box":"Caja de shulker morada","block.minecraft.potatoes":"Patatas","block.minecraft.light_blue_bed":"Cama azul claro","block.minecraft.yellow_banner":"Estandarte amarillo","item.modifiers.head":"En la cabeza:","item.minecraft.potion.effect.swiftness":"Poción de rapidez","block.minecraft.glass_pane":"Panel de cristal","block.minecraft.clay":"Bloque de arcilla","block.minecraft.banner.diagonal_right.cyan":"Tronchado cian","block.minecraft.cut_copper_slab":"Losa de cobre cortado","block.minecraft.polished_diorite_slab":"Losa de diorita pulida","block.minecraft.banner.piglin.green":"Hocico verde","item.minecraft.splash_potion.effect.slow_falling":"Poción de caída lenta arrojadiza","item.minecraft.book":"Libro","block.minecraft.banner.gradient.brown":"Gradiente marrón","block.minecraft.banner.cross.magenta":"Aspa magenta","block.minecraft.cobblestone_slab":"Losa de roca","block.minecraft.banner.diagonal_right.purple":"Tronchado morado","block.minecraft.banner.curly_border.gray":"Bordura gris dentada","block.minecraft.big_dripleaf":"Plantaforma grande","block.minecraft.black_shulker_box":"Caja de shulker negra","block.minecraft.banner.straight_cross.purple":"Cruz morada","block.minecraft.blackstone_stairs":"Escaleras de piedra negra","block.minecraft.banner.triangles_top.blue":"Jefe azuLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota café","block.minecraft.lapis_ore":"Mineral de lapislázuli","item.minecraft.gray_dye":"Tinte gris","block.minecraft.banner.base.yellow":"Tela completamente amarilla","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Generar esqueleto glacial","block.minecraft.banner.base.pink":"Tela completamente rosa","item.minecraft.potion.effect.weakness":"Poción de debilidad","block.minecraft.dark_prismarine_slab":"Losa de prismarina oscura","item.minecraft.splash_potion.effect.thick":"Poción arrojadiza espesa","item.minecraft.cooked_cod":"Bacalao asado","block.minecraft.red_nether_brick_slab":"Losa de ladrillos del Nether rojos","block.minecraft.yellow_terracotta":"Terracota amarilla","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Campaña cian","block.minecraft.banner.creeper.purple":"Estampado morado de creeper","block.minecraft.banner.straight_cross.cyan":"Cruz cian","block.minecraft.banner.half_horizontal_bottom.brown":"Cortado café invertido","item.minecraft.firework_star.shape.large_ball":"Esfera grande","block.minecraft.prismarine_brick_slab":"Losa de ladrillos de prismarina","block.minecraft.jungle_trapdoor":"Trampilla de jungla","block.minecraft.sculk_sensor":"Sensor de sculk","block.minecraft.banner.creeper.orange":"Estampado naranja de creeper","block.minecraft.banner.triangles_top.lime":"Jefe verde claro dentado","item.minecraft.charcoal":"Carbón vegetal","item.minecraft.tipped_arrow.effect.night_vision":"Flecha de visión nocturna","block.minecraft.stone_brick_slab":"Losa de ladrillos de piedra","block.minecraft.banner.mojang.cyan":"Cosa cian","block.minecraft.white_stained_glass":"Vidrio blanco","item.minecraft.bowl":"Bol","block.minecraft.banner.diagonal_up_left.magenta":"Tronchado magenta invertido","block.minecraft.banner.square_top_right.light_gray":"Cantón siniestro gris claro en jefe","block.minecraft.dead_brain_coral_fan":"Gorgonia de cerebro muerta","block.minecraft.banner.flower.white":"Estampado blanco de flor","item.minecraft.bone_meal":"Hueso molido","block.minecraft.banner.triangle_bottom.red":"Chevrón rojo","block.minecraft.cyan_carpet":"Alfombra cian","block.minecraft.oak_door":"Puerta de roble","block.minecraft.flowering_azalea_leaves":"Hojas de azalea florecidas","item.minecraft.prismarine_crystals":"Cristales de prismarina","block.minecraft.banner.diagonal_left.cyan":"Tajado cian","block.minecraft.banner.stripe_bottom.light_blue":"Campaña azul claro","item.minecraft.tipped_arrow.effect.slow_falling":"Flecha de caída lenta","block.minecraft.end_stone":"Piedra del End","block.minecraft.potted_white_tulip":"Maceta con tulipán blanco","block.minecraft.warped_door":"Puerta distorsionada","block.minecraft.banner.square_top_left.light_gray":"Cantón diestro gris claro en jefe","item.minecraft.splash_potion.effect.fire_resistance":"Poción arrojadiza de resistencia al fuego","block.minecraft.banner.half_vertical_right.pink":"Partido rosa invertido","item.minecraft.furnace_minecart":"Vagón con horno","block.minecraft.banner.triangles_bottom.light_gray":"Campaña gris claro dentada","item.minecraft.shield.red":"Escudo rojo","block.minecraft.quartz_pillar":"Pilar de cuarzo","block.minecraft.prismarine_slab":"Losa de prismarina","block.minecraft.nether_portal":"Portal al Nether","item.minecraft.diamond_sword":"Espada de diamante","block.minecraft.oak_planks":"Madera de roble","item.minecraft.amethyst_shard":"Fragmento de amatista","block.minecraft.purple_banner":"Estandarte morado","block.minecraft.structure_void":"Vacío estructural","block.minecraft.purple_shulker_box":"Caja de shulker morada","block.minecraft.potatoes":"Papas","block.minecraft.light_blue_bed":"Cama azul claro","block.minecraft.yellow_banner":"Estandarte amarillo","item.modifiers.head":"En la cabeza:","item.minecraft.potion.effect.swiftness":"Poción de velocidad","block.minecraft.glass_pane":"Panel de vidrio","block.minecraft.clay":"Arcilla","block.minecraft.banner.diagonal_right.cyan":"Tronchado cian","block.minecraft.cut_copper_slab":"Losa de cobre cortado","block.minecraft.polished_diorite_slab":"Losa de diorita pulida","block.minecraft.banner.piglin.green":"Hocico verde","item.minecraft.splash_potion.effect.slow_falling":"Poción arrojadiza de caída lenta","item.minecraft.book":"Libro","block.minecraft.banner.gradient.brown":"Gradiente café","block.minecraft.banner.cross.magenta":"Souter magenta","block.minecraft.cobblestone_slab":"Losa de piedra labrada","block.minecraft.banner.diagonal_right.purple":"Tronchado morado","block.minecraft.banner.curly_border.gray":"Bordura dentada gris","block.minecraft.big_dripleaf":"Plantaforma grande","block.minecraft.black_shulker_box":"Caja de shulker negra","block.minecraft.banner.straight_cross.purple":"Cruz morada","block.minecraft.blackstone_stairs":"Escaleras de piedra negra","block.minecraft.banner.triangles_top.blue":"Jefe azul dentado","block.minecraft.deepslaLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"block.minecraft.brown_terracotta":"Terracota marrón","block.minecraft.lapis_ore":"Mineral de lapislázuli","item.minecraft.gray_dye":"Tinte gris","block.minecraft.banner.base.yellow":"Paño completamente amarillo","block.minecraft.terracotta":"Terracota","item.minecraft.stray_spawn_egg":"Generar esqueleto glacial (Stray)","block.minecraft.banner.base.pink":"Paño completamente rosa","item.minecraft.potion.effect.weakness":"Poción de debilidad","block.minecraft.dark_prismarine_slab":"Baldosa de prismarina oscura","item.minecraft.splash_potion.effect.thick":"Poción arrojadiza espesa","item.minecraft.cooked_cod":"Bacalao cocinado","block.minecraft.red_nether_brick_slab":"Baldosa de ladrillos del Nether rojos","block.minecraft.yellow_terracotta":"Terracota amarilla","block.minecraft.observer":"Observador","block.minecraft.banner.stripe_bottom.cyan":"Campaña cian","block.minecraft.banner.creeper.purple":"Estampado violeta de creeper","block.minecraft.banner.straight_cross.cyan":"Cruz cian","block.minecraft.banner.half_horizontal_bottom.brown":"Cortado marrón invertido","item.minecraft.firework_star.shape.large_ball":"Esfera grande","block.minecraft.prismarine_brick_slab":"Baldosa de ladrillos de prismarina","block.minecraft.jungle_trapdoor":"Escotilla de jungla","block.minecraft.sculk_sensor":"Sensor de sculk","block.minecraft.banner.creeper.orange":"Estampado naranja de creeper","block.minecraft.banner.triangles_top.lime":"Jefe verde lima dentado","item.minecraft.charcoal":"Carbón vegetal","item.minecraft.tipped_arrow.effect.night_vision":"Flecha de visión nocturna","block.minecraft.stone_brick_slab":"Baldosa de ladrillos de piedra","block.minecraft.banner.mojang.cyan":"Cosa cian","block.minecraft.white_stained_glass":"Vidrio blanco","item.minecraft.bowl":"Cuenco","block.minecraft.banner.diagonal_up_left.magenta":"Tronchado magenta invertido","block.minecraft.banner.square_top_right.light_gray":"Cantón gris claro en jefe a siniestra","block.minecraft.dead_brain_coral_fan":"Gorgonia de cerebro muerta","block.minecraft.banner.flower.white":"Estampado blanco de flor","item.minecraft.bone_meal":"Hueso molido","block.minecraft.banner.triangle_bottom.red":"Chevrón rojo","block.minecraft.cyan_carpet":"Alfombra cian","block.minecraft.oak_door":"Puerta de roble","block.minecraft.flowering_azalea_leaves":"Hojas de azalea floridas","item.minecraft.prismarine_crystals":"Cristales de prismarina","block.minecraft.banner.diagonal_left.cyan":"Tajado cian","block.minecraft.banner.stripe_bottom.light_blue":"Campaña celeste","item.minecraft.tipped_arrow.effect.slow_falling":"Flecha de caída lenta","block.minecraft.end_stone":"Piedra del End","block.minecraft.potted_white_tulip":"Maceta con tulipán blanco","block.minecraft.warped_door":"Puerta distorsionada","block.minecraft.banner.square_top_left.light_gray":"Cantón gris claro en jefe a diestra","item.minecraft.splash_potion.effect.fire_resistance":"Poción arrojadiza de resistencia al fuego","block.minecraft.banner.half_vertical_right.pink":"Flanco rosa a siniestra","item.minecraft.furnace_minecart":"Carrito con horno","block.minecraft.banner.triangles_bottom.light_gray":"Base gris claro dentada","item.minecraft.shield.red":"Escudo rojo","block.minecraft.quartz_pillar":"Pilar de cuarzo","block.minecraft.prismarine_slab":"Baldosa de prismarina","block.minecraft.nether_portal":"Portal del Nether","item.minecraft.diamond_sword":"Espada de diamante","block.minecraft.oak_planks":"Madera de roble","item.minecraft.amethyst_shard":"Fragmento de amatista","block.minecraft.purple_banner":"Estandarte violeta","block.minecraft.structure_void":"Vacío de estructuras","block.minecraft.purple_shulker_box":"Caja de shulker violeta","block.minecraft.potatoes":"Papas","block.minecraft.light_blue_bed":"Cama celeste","block.minecraft.yellow_banner":"Estandarte amarillo","item.modifiers.head":"En la cabeza:","item.minecraft.potion.effect.swiftness":"Poción de velocidad","block.minecraft.glass_pane":"Panel de vidrio","block.minecraft.clay":"Arcilla","block.minecraft.banner.diagonal_right.cyan":"Tronchado cian","block.minecraft.cut_copper_slab":"Baldosa de cobre cortado","block.minecraft.polished_diorite_slab":"Baldosa de diorita pulida","block.minecraft.banner.piglin.green":"Hocico verde","item.minecraft.splash_potion.effect.slow_falling":"Poción arrojadiza de caída lenta","item.minecraft.book":"Libro","block.minecraft.banner.gradient.brown":"Gradiente marrón","block.minecraft.banner.cross.magenta":"Aspa magenta","block.minecraft.cobblestone_slab":"Baldosa de roca","block.minecraft.banner.diagonal_right.purple":"Tronchado violeta","block.minecraft.banner.curly_border.gray":"Bordura gris dentada","block.minecraft.big_dripleaf":"Plantaforma","block.minecraft.black_shulker_box":"Caja de shulker negra","block.minecraft.banner.straight_cross.purple":"Cruz violeta","block.minecraft.blackstone_stairs":"Escaleras de piedra negra","block.minecraft.banner.triangles_top.blue":"Jefe azul dentLine truncated
|
||||
Loaded 100 of 192 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user