diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..b0e07f6e3
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,26 @@
+---
+name: Bug report
+about: Create a bug report so we can fix it
+
+---
+
+**Describe the bug, provide any errors**
+A clear and concise description of what the bug is. Can you https://hastebin.com the error?
+
+**How can we reproduce it?**
+Steps to reproduce the behavior:
+1. Login on 1.12'
+2. Click on '....'
+3. The '....' is displayed wrong
+
+**Expected behaviour**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**ViaVersion Dump:**
+- Type /viaversion dump, and put the link here.
+
+**Additional server info**
+Do you use a proxy (eg. BungeeCord)? What software do you use and what plugins?
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..8bbc2c4fd
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,17 @@
+---
+name: Feature request
+about: Suggest an idea for ViaVersion
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Which versions is this for?**
+Does the feature apply to any specific versions? If so put them here.
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
deleted file mode 100644
index 80bbbc13c..000000000
--- a/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,11 +0,0 @@
-### What is the output link of /viaversion dump?
-
-
-### Are you using any additional software like BungeeCord? If so, what software and version? (Please list your plugins as well)
-
-
-### How does this error happen? login? Using an item?
-
-
-### Is there an error in the console? Use pastebin.com. Is there a kick message?
-
diff --git a/bukkit/pom.xml b/bukkit/pom.xml
index 59b61c638..d99698d30 100644
--- a/bukkit/pom.xml
+++ b/bukkit/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.6.1-18w46a
+ 2.0.0-18w46a
4.0.0
diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java
index d4c326384..f597c65c1 100644
--- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java
+++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java
@@ -34,7 +34,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform {
private boolean lateBind = false;
private boolean protocolSupport = false;
@Getter
- private BukkitConfigAPI conf;
+ private BukkitViaConfig conf;
@Getter
private ViaAPI api = new BukkitViaAPI(this);
private List queuedTasks = new ArrayList<>();
@@ -51,7 +51,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform {
.loader(new BukkitViaLoader(this))
.build());
// Config magic
- conf = new BukkitConfigAPI();
+ conf = new BukkitViaConfig();
// For compatibility
ViaVersion.setInstance(this);
diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java
similarity index 94%
rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java
rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java
index 2aea4289e..ff4cf6d00 100644
--- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java
+++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java
@@ -11,10 +11,10 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
-public class BukkitConfigAPI extends Config implements ViaVersionConfig {
- private static List UNSUPPORTED = Arrays.asList("bungee-ping-interval", "bungee-ping-save", "bungee-servers");
+public class BukkitViaConfig extends Config implements ViaVersionConfig {
+ private static List UNSUPPORTED = Arrays.asList("bungee-ping-interval", "bungee-ping-save", "bungee-servers", "velocity-ping-interval", "velocity-ping-save", "velocity-servers");
- public BukkitConfigAPI() {
+ public BukkitViaConfig() {
super(new File(((ViaVersionPlugin) Via.getPlatform()).getDataFolder(), "config.yml"));
// Load config
reloadConfig();
@@ -192,7 +192,7 @@ public class BukkitConfigAPI extends Config implements ViaVersionConfig {
@Override
public URL getDefaultConfigURL() {
- return BukkitConfigAPI.class.getClassLoader().getResource("assets/viaversion/config.yml");
+ return BukkitViaConfig.class.getClassLoader().getResource("assets/viaversion/config.yml");
}
@Override
diff --git a/bungee/pom.xml b/bungee/pom.xml
index 89edea773..df7a48db5 100644
--- a/bungee/pom.xml
+++ b/bungee/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.6.1-18w46a
+ 2.0.0-18w46a
4.0.0
diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java
index 97e3a9c75..72142e311 100644
--- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java
+++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java
@@ -31,13 +31,13 @@ import java.util.concurrent.TimeUnit;
public class BungeePlugin extends Plugin implements ViaPlatform, Listener {
private BungeeViaAPI api;
- private BungeeConfigAPI config;
+ private BungeeViaConfig config;
private BungeeCommandHandler commandHandler;
@Override
public void onLoad() {
api = new BungeeViaAPI();
- config = new BungeeConfigAPI(getDataFolder());
+ config = new BungeeViaConfig(getDataFolder());
commandHandler = new BungeeCommandHandler();
ProxyServer.getInstance().getPluginManager().registerCommand(this, new BungeeCommand(commandHandler));
// Init platform
@@ -134,7 +134,7 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener {
}
@Override
- public BungeeConfigAPI getConf() {
+ public BungeeViaConfig getConf() {
return config;
}
diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/ProbeSubCmd.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/ProbeSubCmd.java
index fda215417..a6184efa6 100644
--- a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/ProbeSubCmd.java
+++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/ProbeSubCmd.java
@@ -3,7 +3,7 @@ package us.myles.ViaVersion.bungee.commands.subs;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.command.ViaCommandSender;
import us.myles.ViaVersion.api.command.ViaSubCommand;
-import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI;
+import us.myles.ViaVersion.bungee.platform.BungeeViaConfig;
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
public class ProbeSubCmd extends ViaSubCommand {
@@ -15,7 +15,7 @@ public class ProbeSubCmd extends ViaSubCommand {
@Override
public String description() {
return "Forces ViaVersion to scan server protocol versions " +
- (((BungeeConfigAPI) Via.getConfig()).getBungeePingInterval() == -1 ?
+ (((BungeeViaConfig) Via.getConfig()).getBungeePingInterval() == -1 ?
"" : "(Also happens at an interval)");
}
diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java
similarity index 96%
rename from bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java
rename to bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java
index 5b773185d..18c0c2510 100644
--- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java
+++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java
@@ -9,10 +9,10 @@ import java.io.File;
import java.net.URL;
import java.util.*;
-public class BungeeConfigAPI extends Config implements ViaVersionConfig {
- private static List UNSUPPORTED = Arrays.asList("nms-player-ticking", "item-cache", "anti-xray-patch", "quick-move-action-fix");
+public class BungeeViaConfig extends Config implements ViaVersionConfig {
+ private static List UNSUPPORTED = Arrays.asList("nms-player-ticking", "item-cache", "anti-xray-patch", "quick-move-action-fix", "velocity-ping-interval", "velocity-ping-save", "velocity-servers");
- public BungeeConfigAPI(File configFile) {
+ public BungeeViaConfig(File configFile) {
super(new File(configFile, "config.yml"));
// Load config
reloadConfig();
@@ -20,7 +20,7 @@ public class BungeeConfigAPI extends Config implements ViaVersionConfig {
@Override
public URL getDefaultConfigURL() {
- return BungeeConfigAPI.class.getClassLoader().getResource("assets/viaversion/config.yml");
+ return BungeeViaConfig.class.getClassLoader().getResource("assets/viaversion/config.yml");
}
@Override
diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java
index e3aa9defe..6f5f6a909 100644
--- a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java
+++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java
@@ -6,7 +6,7 @@ import net.md_5.bungee.api.ServerPing;
import net.md_5.bungee.api.config.ServerInfo;
import us.myles.ViaVersion.BungeePlugin;
import us.myles.ViaVersion.api.Via;
-import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI;
+import us.myles.ViaVersion.bungee.platform.BungeeViaConfig;
import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider;
import java.util.HashMap;
@@ -26,7 +26,7 @@ public class ProtocolDetectorService implements Runnable {
public static Integer getProtocolId(String serverName) {
// Step 1. Check Config
- Map servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols();
+ Map servers = ((BungeeViaConfig) Via.getConfig()).getBungeeServerProtocols();
Integer protocol = servers.get(serverName);
if (protocol != null) {
return protocol;
@@ -58,19 +58,22 @@ public class ProtocolDetectorService implements Runnable {
@Override
public void done(ServerPing serverPing, Throwable throwable) {
if (throwable == null && serverPing != null && serverPing.getVersion() != null) {
- detectedProtocolIds.put(key, serverPing.getVersion().getProtocol());
- if (((BungeeConfigAPI) Via.getConfig()).isBungeePingSave()) {
- Map servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols();
- Integer protocol = servers.get(key);
- if (protocol != null && protocol == serverPing.getVersion().getProtocol()) {
- return;
+ // Ensure protocol is positive, some services will return -1
+ if (serverPing.getVersion().getProtocol() > 0) {
+ detectedProtocolIds.put(key, serverPing.getVersion().getProtocol());
+ if (((BungeeViaConfig) Via.getConfig()).isBungeePingSave()) {
+ Map servers = ((BungeeViaConfig) Via.getConfig()).getBungeeServerProtocols();
+ Integer protocol = servers.get(key);
+ if (protocol != null && protocol == serverPing.getVersion().getProtocol()) {
+ return;
+ }
+ // Ensure we're the only ones writing to the config
+ synchronized (Via.getPlatform().getConfigurationProvider()) {
+ servers.put(key, serverPing.getVersion().getProtocol());
+ }
+ // Save
+ Via.getPlatform().getConfigurationProvider().saveConfig();
}
- // Ensure we're the only ones writing to the config
- synchronized (Via.getPlatform().getConfigurationProvider()) {
- servers.put(key, serverPing.getVersion().getProtocol());
- }
- // Save
- Via.getPlatform().getConfigurationProvider().saveConfig();
}
}
}
diff --git a/common/pom.xml b/common/pom.xml
index 8414d7dc2..549004b0b 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.6.1-18w46a
+ 2.0.0-18w46a
4.0.0
@@ -17,7 +17,7 @@
org.yaml
snakeyaml
1.18
- provided
+ compile
\ No newline at end of file
diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java
index ffc4b4a58..566240937 100644
--- a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java
+++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java
@@ -18,6 +18,8 @@ import us.myles.ViaVersion.util.PipelineUtil;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
@Data
public class UserConnection {
@@ -36,7 +38,7 @@ public class UserConnection {
// Used for handling warnings (over time)
private int secondsObserved = 0;
private int warnings = 0;
-
+ private ReadWriteLock velocityLock = new ReentrantReadWriteLock();
public UserConnection(Channel channel) {
this.channel = channel;
@@ -108,7 +110,8 @@ public class UserConnection {
*/
public ChannelFuture sendRawPacketFuture(final ByteBuf packet) {
final ChannelHandler handler = channel.pipeline().get(Via.getManager().getInjector().getEncoderName());
- return channel.pipeline().context(handler).writeAndFlush(packet);
+ ChannelFuture future = channel.pipeline().context(handler).writeAndFlush(packet);
+ return future;
}
/**
@@ -218,7 +221,8 @@ public class UserConnection {
}
buf.writeBytes(packet);
packet.release();
- final ChannelHandlerContext context = PipelineUtil.getPreviousContext(Via.getManager().getInjector().getDecoderName(), getChannel().pipeline());
+ final ChannelHandlerContext context = PipelineUtil
+ .getPreviousContext(Via.getManager().getInjector().getDecoderName(), getChannel().pipeline());
if (currentThread) {
if (context != null) {
context.fireChannelRead(buf);
diff --git a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java
index c6afc0b6e..5610e2a50 100644
--- a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java
+++ b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java
@@ -74,7 +74,7 @@ public abstract class ViaCommandHandler implements ViaVersionCommand {
//SubCommands tabcomplete
if (args.length == 1) {
- if (!args[0].equals("")) {
+ if (!args[0].isEmpty()) {
for (ViaSubCommand sub : allowed)
if (sub.name().toLowerCase().startsWith(args[0].toLowerCase()))
output.add(sub.name());
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java
index ff162030d..e06278f9d 100644
--- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/Protocol1_13_1To1_13.java
@@ -90,6 +90,22 @@ public class Protocol1_13_1To1_13 extends Protocol {
}
});
+ // Set cooldown
+ registerOutgoing(State.PLAY, 0x18, 0x18, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.VAR_INT); // Item
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ wrapper.set(Type.VAR_INT, 0,
+ InventoryPackets.getNewItemId(wrapper.get(Type.VAR_INT, 0))
+ );
+ }
+ });
+ }
+ });
+
// Boss bar
registerOutgoing(State.PLAY, 0x0C, 0x0C, new PacketRemapper() {
@Override
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/Protocol1_13_2To1_13_1.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/Protocol1_13_2To1_13_1.java
index bd01d958c..c6750ad01 100644
--- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/Protocol1_13_2To1_13_1.java
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_2to1_13_1/Protocol1_13_2To1_13_1.java
@@ -22,14 +22,13 @@ public class Protocol1_13_2To1_13_1 extends Protocol {
WorldPackets.register(this);
EntityPackets.register(this);
- //Edit Book
- registerIncoming(State.PLAY, 0x0B, 0x0B, new PacketRemapper() {
- @Override
- public void registerMap() {
- map(Type.FLAT_ITEM, Type.FLAT_VAR_INT_ITEM);
- map(Type.BOOLEAN);
- }
- });
+ //Edit Book
+ registerIncoming(State.PLAY, 0x0B, 0x0B, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.FLAT_VAR_INT_ITEM, Type.FLAT_ITEM);
+ }
+ });
// Advancements
registerOutgoing(State.PLAY, 0x51, 0x51, new PacketRemapper() {
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java
index 047cecac6..d6e888402 100644
--- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java
@@ -4,7 +4,9 @@ import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent;
+import net.md_5.bungee.api.chat.TranslatableComponent;
import net.md_5.bungee.chat.ComponentSerializer;
+import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.MappingData;
import java.util.ArrayList;
import java.util.regex.Matcher;
@@ -115,4 +117,43 @@ public class ChatRewriter {
public static String jsonTextToLegacy(String value) {
return TextComponent.toLegacyText(ComponentSerializer.parse(value));
}
+
+ public static String processTranslate(String value) {
+ BaseComponent[] components = ComponentSerializer.parse(value);
+ for (BaseComponent component : components) {
+ processTranslate(component);
+ }
+ if (components.length == 1) {
+ return ComponentSerializer.toString(components[0]);
+ } else {
+ return ComponentSerializer.toString(components);
+ }
+ }
+
+ private static void processTranslate(BaseComponent component) {
+ if (component instanceof TranslatableComponent) {
+ String oldTranslate = ((TranslatableComponent) component).getTranslate();
+ String newTranslate;
+ newTranslate = MappingData.translateMapping.get(oldTranslate);
+ if (newTranslate == null) MappingData.mojangTranslation.get(oldTranslate);
+ if (newTranslate != null) {
+ ((TranslatableComponent) component).setTranslate(newTranslate);
+ }
+ if (((TranslatableComponent) component).getWith() != null) {
+ for (BaseComponent baseComponent : ((TranslatableComponent) component).getWith()) {
+ processTranslate(baseComponent);
+ }
+ }
+ }
+ if (component.getHoverEvent() != null) {
+ for (BaseComponent baseComponent : component.getHoverEvent().getValue()) {
+ processTranslate(baseComponent);
+ }
+ }
+ if (component.getExtra() != null) {
+ for (BaseComponent baseComponent : component.getExtra()) {
+ processTranslate(baseComponent);
+ }
+ }
+ }
}
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java
index ca501ec8f..3ad9c9ab3 100644
--- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java
@@ -47,77 +47,78 @@ public class Protocol1_13To1_12_2 extends Protocol {
}
};
- public static final PacketHandler SEND_DECLARE_COMMANDS_AND_TAGS = new PacketHandler() { // *insert here a good name*
- @Override
- public void handle(PacketWrapper w) throws Exception {
- // Send fake declare commands
- w.create(0x11, new ValueCreator() {
+ public static final PacketHandler SEND_DECLARE_COMMANDS_AND_TAGS =
+ new PacketHandler() { // *insert here a good name*
@Override
- public void write(PacketWrapper wrapper) {
- wrapper.write(Type.VAR_INT, 2); // Size
- // Write root node
- wrapper.write(Type.VAR_INT, 0); // Mark as command
- wrapper.write(Type.VAR_INT, 1); // 1 child
- wrapper.write(Type.VAR_INT, 1); // Child is at 1
+ public void handle(PacketWrapper w) throws Exception {
+ // Send fake declare commands
+ w.create(0x11, new ValueCreator() {
+ @Override
+ public void write(PacketWrapper wrapper) {
+ wrapper.write(Type.VAR_INT, 2); // Size
+ // Write root node
+ wrapper.write(Type.VAR_INT, 0); // Mark as command
+ wrapper.write(Type.VAR_INT, 1); // 1 child
+ wrapper.write(Type.VAR_INT, 1); // Child is at 1
- // Write arg node
- wrapper.write(Type.VAR_INT, 0x02 | 0x04 | 0x10); // Mark as command
- wrapper.write(Type.VAR_INT, 0); // No children
- // Extra data
- wrapper.write(Type.STRING, "args"); // Arg name
- wrapper.write(Type.STRING, "brigadier:string");
- wrapper.write(Type.VAR_INT, 2); // Greedy
- wrapper.write(Type.STRING, "minecraft:ask_server"); // Ask server
+ // Write arg node
+ wrapper.write(Type.VAR_INT, 0x02 | 0x04 | 0x10); // Mark as command
+ wrapper.write(Type.VAR_INT, 0); // No children
+ // Extra data
+ wrapper.write(Type.STRING, "args"); // Arg name
+ wrapper.write(Type.STRING, "brigadier:string");
+ wrapper.write(Type.VAR_INT, 2); // Greedy
+ wrapper.write(Type.STRING, "minecraft:ask_server"); // Ask server
- wrapper.write(Type.VAR_INT, 0); // Root node index
+ wrapper.write(Type.VAR_INT, 0); // Root node index
+ }
+ }).send(Protocol1_13To1_12_2.class);
+
+ // Send tags packet
+ w.create(0x55, new ValueCreator() {
+ @Override
+ public void write(PacketWrapper wrapper) throws Exception {
+ wrapper.write(Type.VAR_INT, MappingData.blockTags.size()); // block tags
+ for (Map.Entry tag : MappingData.blockTags.entrySet()) {
+ wrapper.write(Type.STRING, tag.getKey());
+ wrapper.write(Type.VAR_INT_ARRAY, tag.getValue().clone());
+ }
+ wrapper.write(Type.VAR_INT, MappingData.itemTags.size()); // item tags
+ for (Map.Entry tag : MappingData.itemTags.entrySet()) {
+ wrapper.write(Type.STRING, tag.getKey());
+ wrapper.write(Type.VAR_INT_ARRAY, tag.getValue().clone());
+ }
+ wrapper.write(Type.VAR_INT, MappingData.fluidTags.size()); // fluid tags
+ for (Map.Entry tag : MappingData.fluidTags.entrySet()) {
+ wrapper.write(Type.STRING, tag.getKey());
+ wrapper.write(Type.VAR_INT_ARRAY, tag.getValue().clone());
+ }
+ }
+ }).send(Protocol1_13To1_12_2.class);
}
- }).send(Protocol1_13To1_12_2.class);
-
- // Send tags packet
- w.create(0x55, new ValueCreator() {
- @Override
- public void write(PacketWrapper wrapper) throws Exception {
- wrapper.write(Type.VAR_INT, MappingData.blockTags.size()); // block tags
- for (Map.Entry tag : MappingData.blockTags.entrySet()) {
- wrapper.write(Type.STRING, tag.getKey());
- wrapper.write(Type.VAR_INT_ARRAY, tag.getValue().clone());
- }
- wrapper.write(Type.VAR_INT, MappingData.itemTags.size()); // item tags
- for (Map.Entry tag : MappingData.itemTags.entrySet()) {
- wrapper.write(Type.STRING, tag.getKey());
- wrapper.write(Type.VAR_INT_ARRAY, tag.getValue().clone());
- }
- wrapper.write(Type.VAR_INT, MappingData.fluidTags.size()); // fluid tags
- for (Map.Entry tag : MappingData.fluidTags.entrySet()) {
- wrapper.write(Type.STRING, tag.getKey());
- wrapper.write(Type.VAR_INT_ARRAY, tag.getValue().clone());
- }
- }
- }).send(Protocol1_13To1_12_2.class);
- }
- };
+ };
// These are arbitrary rewrite values, it just needs an invalid color code character.
- protected static EnumMap SCOREBOARD_TEAM_NAME_REWRITE = new EnumMap(ChatColor.class) {{
- put(ChatColor.BLACK, ChatColor.COLOR_CHAR + "g");
- put(ChatColor.DARK_BLUE, ChatColor.COLOR_CHAR + "h");
- put(ChatColor.DARK_GREEN, ChatColor.COLOR_CHAR + "i");
- put(ChatColor.DARK_AQUA, ChatColor.COLOR_CHAR + "j");
- put(ChatColor.DARK_RED, ChatColor.COLOR_CHAR + "p");
- put(ChatColor.DARK_PURPLE, ChatColor.COLOR_CHAR + "q");
- put(ChatColor.GOLD, ChatColor.COLOR_CHAR + "s");
- put(ChatColor.GRAY, ChatColor.COLOR_CHAR + "t");
- put(ChatColor.DARK_GRAY, ChatColor.COLOR_CHAR + "u");
- put(ChatColor.BLUE, ChatColor.COLOR_CHAR + "v");
- put(ChatColor.GREEN, ChatColor.COLOR_CHAR + "w");
- put(ChatColor.AQUA, ChatColor.COLOR_CHAR + "x");
- put(ChatColor.RED, ChatColor.COLOR_CHAR + "y");
- put(ChatColor.LIGHT_PURPLE, ChatColor.COLOR_CHAR + "z");
- put(ChatColor.YELLOW, ChatColor.COLOR_CHAR + "!");
- put(ChatColor.WHITE, ChatColor.COLOR_CHAR + "?");
- }};
+ protected static EnumMap SCOREBOARD_TEAM_NAME_REWRITE = new EnumMap<>(ChatColor.class);
+ // @formatter:on
static {
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.BLACK, 'g');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.DARK_BLUE, 'h');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.DARK_GREEN, 'i');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.DARK_AQUA, 'j');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.DARK_RED, 'p');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.DARK_PURPLE, 'q');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.GOLD, 's');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.GRAY, 't');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.DARK_GRAY, 'u');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.BLUE, 'v');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.GREEN, 'w');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.AQUA, 'x');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.RED, 'y');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.LIGHT_PURPLE, 'z');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.YELLOW, '!');
+ SCOREBOARD_TEAM_NAME_REWRITE.put(ChatColor.WHITE, '?');
MappingData.init();
}
@@ -130,6 +131,19 @@ public class Protocol1_13To1_12_2 extends Protocol {
// Outgoing packets
+ registerOutgoing(State.LOGIN, 0x0, 0x0, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.STRING);
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ wrapper.set(Type.STRING, 0, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 0)));
+ }
+ });
+ }
+ });
+
registerOutgoing(State.STATUS, 0x00, 0x00, new PacketRemapper() {
@Override
public void registerMap() {
@@ -169,7 +183,36 @@ public class Protocol1_13To1_12_2 extends Protocol {
}
});
- registerOutgoing(State.PLAY, 0xF, 0xE);
+ // Boss bar
+ registerOutgoing(State.PLAY, 0xC, 0xC, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.UUID);
+ map(Type.VAR_INT);
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ int action = wrapper.get(Type.VAR_INT, 0);
+ if (action == 0 || action == 3) {
+ wrapper.write(Type.STRING, ChatRewriter.processTranslate(wrapper.read(Type.STRING)));
+ }
+ }
+ });
+ }
+ });
+ // Chat message
+ registerOutgoing(State.PLAY, 0xF, 0xE, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.STRING);
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ wrapper.set(Type.STRING, 0, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 0)));
+ }
+ });
+ }
+ });
// WorldPackets 0x10 -> 0x0F
// Tab-Complete
@@ -217,13 +260,77 @@ public class Protocol1_13To1_12_2 extends Protocol {
// New packet 0x11, declare commands
registerOutgoing(State.PLAY, 0x11, 0x12);
registerOutgoing(State.PLAY, 0x12, 0x13);
- registerOutgoing(State.PLAY, 0x13, 0x14);
+ // Open window
+ registerOutgoing(State.PLAY, 0x13, 0x14, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.UNSIGNED_BYTE); // Id
+ map(Type.STRING); // Window type
+ map(Type.STRING); // Title
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ wrapper.set(Type.STRING, 1, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 1)));
+ }
+ });
+ }
+ });
// InventoryPackets 0x14 -> 0x15
// InventoryPackets 0x15 -> 0x16
// InventoryPackets 0x16 -> 0x17
- registerOutgoing(State.PLAY, 0x17, 0x18);
+ // Set cooldown
+ registerOutgoing(State.PLAY, 0x17, 0x18, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ int item = wrapper.read(Type.VAR_INT);
+ int ticks = wrapper.read(Type.VAR_INT);
+ wrapper.cancel();
+ if (item == 383) { // Spawn egg
+ for (int i = 0; i < 44; i++) {
+ Integer newItem = MappingData.oldToNewItems.get(item << 16 | i);
+ if (newItem != null) {
+ PacketWrapper packet = wrapper.create(0x18);
+ packet.write(Type.VAR_INT, newItem);
+ packet.write(Type.VAR_INT, ticks);
+ packet.send(Protocol1_13To1_12_2.class);
+ } else {
+ break;
+ }
+ }
+ } else {
+ for (int i = 0; i < 16; i++) {
+ Integer newItem = MappingData.oldToNewItems.get(item << 4 | i);
+ if (newItem != null) {
+ PacketWrapper packet = wrapper.create(0x18);
+ packet.write(Type.VAR_INT, newItem);
+ packet.write(Type.VAR_INT, ticks);
+ packet.send(Protocol1_13To1_12_2.class);
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ });
+ }
+ });
// WorldPackets 0x18 -> 0x19
- registerOutgoing(State.PLAY, 0x1A, 0x1B);
+ // Disconnect
+ registerOutgoing(State.PLAY, 0x1A, 0x1B, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.STRING);
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ wrapper.set(Type.STRING, 0, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 0)));
+ }
+ });
+ }
+ });
registerOutgoing(State.PLAY, 0x1B, 0x1C);
// New packet 0x1D - NBT Query
registerOutgoing(State.PLAY, 0x1C, 0x1E);
@@ -326,7 +433,23 @@ public class Protocol1_13To1_12_2 extends Protocol {
}
});
registerOutgoing(State.PLAY, 0x2C, 0x2E);
- registerOutgoing(State.PLAY, 0x2D, 0x2F);
+ // Combat event
+ registerOutgoing(State.PLAY, 0x2D, 0x2F, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.VAR_INT); // Event
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ if (wrapper.get(Type.VAR_INT, 0) == 2) { // Entity dead
+ wrapper.passthrough(Type.VAR_INT); // Player id
+ wrapper.passthrough(Type.INT); // Entity id
+ wrapper.write(Type.STRING, ChatRewriter.processTranslate(wrapper.read(Type.STRING)));
+ }
+ }
+ });
+ }
+ });
registerOutgoing(State.PLAY, 0x2E, 0x30);
// New 0x31 - Face Player
registerOutgoing(State.PLAY, 0x2F, 0x32);
@@ -480,7 +603,22 @@ public class Protocol1_13To1_12_2 extends Protocol {
});
registerOutgoing(State.PLAY, 0x46, 0x49);
registerOutgoing(State.PLAY, 0x47, 0x4A);
- registerOutgoing(State.PLAY, 0x48, 0x4B);
+ // Title
+ registerOutgoing(State.PLAY, 0x48, 0x4B, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.VAR_INT); // Action
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ int action = wrapper.get(Type.VAR_INT, 0);
+ if (action >= 0 && action <= 2) {
+ wrapper.write(Type.STRING, ChatRewriter.processTranslate(wrapper.read(Type.STRING)));
+ }
+ }
+ });
+ }
+ });
// New 0x4C - Stop Sound
// Sound Effect packet
@@ -498,7 +636,21 @@ public class Protocol1_13To1_12_2 extends Protocol {
});
}
});
- registerOutgoing(State.PLAY, 0x4A, 0x4E);
+ // Player list header and footer
+ registerOutgoing(State.PLAY, 0x4A, 0x4E, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.STRING);
+ map(Type.STRING);
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ wrapper.set(Type.STRING, 0, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 0)));
+ wrapper.set(Type.STRING, 1, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 1)));
+ }
+ });
+ }
+ });
registerOutgoing(State.PLAY, 0x4B, 0x4F);
registerOutgoing(State.PLAY, 0x4C, 0x50);
// Advancements
@@ -520,8 +672,8 @@ public class Protocol1_13To1_12_2 extends Protocol {
// Display data
if (wrapper.passthrough(Type.BOOLEAN)) {
- wrapper.passthrough(Type.STRING); // Title
- wrapper.passthrough(Type.STRING); // Description
+ wrapper.write(Type.STRING, ChatRewriter.processTranslate(wrapper.read(Type.STRING))); // Title
+ wrapper.write(Type.STRING, ChatRewriter.processTranslate(wrapper.read(Type.STRING))); // Description
Item icon = wrapper.read(Type.ITEM);
InventoryPackets.toClient(icon);
wrapper.write(Type.FLAT_ITEM, icon); // Translate item to flat item
@@ -931,14 +1083,13 @@ public class Protocol1_13To1_12_2 extends Protocol {
// will just send colour as 'invisible' character
if (ChatColor.stripColor(name).length() == 0) {
StringBuilder newName = new StringBuilder();
- for (int i = 0; i < name.length() / 2; i++) {
- ChatColor color = ChatColor.getByChar(name.charAt(i * 2 + 1));
- String rewrite = SCOREBOARD_TEAM_NAME_REWRITE.get(color);
- if (rewrite != null) { // just in case, should never happen
- newName.append(rewrite);
- } else {
- newName.append(name);
+ for (int i = 1; i < name.length(); i += 2) {
+ char colorChar = name.charAt(i);
+ Character rewrite = SCOREBOARD_TEAM_NAME_REWRITE.get(ChatColor.getByChar(colorChar));
+ if (rewrite == null) {
+ rewrite = colorChar;
}
+ newName.append(ChatColor.COLOR_CHAR).append(rewrite);
}
name = newName.toString();
}
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java
index 6ecbd93c9..c9f572aa1 100644
--- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/MappingData.java
@@ -2,15 +2,19 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
+import com.google.common.io.CharStreams;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.util.GsonUtil;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -21,6 +25,8 @@ public class MappingData {
public static Map itemTags = new HashMap<>();
public static Map fluidTags = new HashMap<>();
public static BiMap oldEnchantmentsIds = HashBiMap.create();
+ public static Map translateMapping = new HashMap<>();
+ public static Map mojangTranslation = new HashMap<>();
public static EnchantmentMappings enchantmentMappings;
public static SoundMappings soundMappings;
public static BlockMappings blockMappings;
@@ -42,6 +48,38 @@ public class MappingData {
enchantmentMappings = new EnchantmentMappingByteArray(mapping1_12.getAsJsonObject("enchantments"), mapping1_13.getAsJsonObject("enchantments"));
Via.getPlatform().getLogger().info("Loading 1.12.2 -> 1.13 sound mapping...");
soundMappings = new SoundMappingShortArray(mapping1_12.getAsJsonArray("sounds"), mapping1_13.getAsJsonArray("sounds"));
+ Via.getPlatform().getLogger().info("Loading translation mappping");
+ translateMapping = new HashMap<>();
+ Map translateData = GsonUtil.getGson().fromJson(
+ new InputStreamReader(
+ MappingData.class.getClassLoader()
+ .getResourceAsStream("assets/viaversion/data/mapping-lang-1.12-1.13.json")
+ ),
+ (new TypeToken