From c704b3709aa2035556b6f964ff3c08c0c609e553 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 15:17:31 +0000 Subject: [PATCH 01/31] Implement changes to entity effect --- .../transformers/OutgoingTransformer.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 667d50be3..9fcc91970 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -428,6 +428,20 @@ public class OutgoingTransformer { output.writeBytes(input); return; } + if (packet == PacketType.PLAY_ENTITY_EFFECT) { + int id = PacketUtil.readVarInt(input); + PacketUtil.writeVarInt(id, output); + byte effectID = input.readByte(); + output.writeByte(effectID); + byte amplifier = input.readByte(); + output.writeByte(amplifier); + int duration = PacketUtil.readVarInt(input); + PacketUtil.writeVarInt(duration, output); + // we need to write as a byte instead of boolean + boolean hideParticles = input.readBoolean(); + output.writeByte(hideParticles ? 1 : 0); + return; + } if (packet == PacketType.PLAY_TEAM) { String teamName = PacketUtil.readString(input); PacketUtil.writeString(teamName, output); From 1e873c123c469cefdd8808db85ebcdd8a797d43c Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Wed, 2 Mar 2016 10:37:43 +0100 Subject: [PATCH 02/31] Added that fancy message when 1.9 clients try to enter a Minecart :) --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 2 ++ .../listeners/MinecartListener.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 0bdaf7820..83e620424 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -16,6 +16,7 @@ import org.bukkit.plugin.java.JavaPlugin; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.ViaVersionAPI; import us.myles.ViaVersion.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.listeners.MinecartListener; import us.myles.ViaVersion.util.ReflectionUtil; import java.util.Collections; @@ -52,6 +53,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { setPorted(e.getPlayer().getUniqueId(), false); } }, this); + Bukkit.getPluginManager().registerEvents(new MinecartListener(),this); } public void injectPacketHandler() throws Exception { diff --git a/src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java b/src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java new file mode 100644 index 000000000..3f95ca6fc --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java @@ -0,0 +1,25 @@ +package us.myles.ViaVersion.listeners; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.vehicle.VehicleEnterEvent; +import us.myles.ViaVersion.api.ViaVersion; + +/** + * Created by fillefilip8 on 2016-03-02. + */ +public class MinecartListener implements Listener { + @EventHandler + public void onMinecartEnter(VehicleEnterEvent e){ + if(e.getEntered() instanceof Player) { + Player player = (Player) e.getEntered(); + if(ViaVersion.getInstance().isPorted(player)){ + e.setCancelled(true); + e.getEntered().sendMessage(ChatColor.RED + "Minecarts are not supported. Due to changes on minecarts in 1.9"); + } + } + + } +} From 121bc9de6c3143de80a5670916066a8e54c1b230 Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Wed, 2 Mar 2016 11:32:57 +0100 Subject: [PATCH 03/31] * Modifyed that fancy message when 1.9 clients try to enter a Minecart or a Boat :) * Renamed the listener to something better. --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 4 +- .../listeners/MinecartListener.java | 25 ------------ .../ViaVersion/listeners/VehicleListener.java | 39 +++++++++++++++++++ 3 files changed, 41 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java create mode 100644 src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 83e620424..f9e2b5fb0 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -16,7 +16,7 @@ import org.bukkit.plugin.java.JavaPlugin; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.ViaVersionAPI; import us.myles.ViaVersion.handlers.ViaVersionInitializer; -import us.myles.ViaVersion.listeners.MinecartListener; +import us.myles.ViaVersion.listeners.VehicleListener; import us.myles.ViaVersion.util.ReflectionUtil; import java.util.Collections; @@ -53,7 +53,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { setPorted(e.getPlayer().getUniqueId(), false); } }, this); - Bukkit.getPluginManager().registerEvents(new MinecartListener(),this); + Bukkit.getPluginManager().registerEvents(new VehicleListener(),this); } public void injectPacketHandler() throws Exception { diff --git a/src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java b/src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java deleted file mode 100644 index 3f95ca6fc..000000000 --- a/src/main/java/us/myles/ViaVersion/listeners/MinecartListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package us.myles.ViaVersion.listeners; - -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.vehicle.VehicleEnterEvent; -import us.myles.ViaVersion.api.ViaVersion; - -/** - * Created by fillefilip8 on 2016-03-02. - */ -public class MinecartListener implements Listener { - @EventHandler - public void onMinecartEnter(VehicleEnterEvent e){ - if(e.getEntered() instanceof Player) { - Player player = (Player) e.getEntered(); - if(ViaVersion.getInstance().isPorted(player)){ - e.setCancelled(true); - e.getEntered().sendMessage(ChatColor.RED + "Minecarts are not supported. Due to changes on minecarts in 1.9"); - } - } - - } -} diff --git a/src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java b/src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java new file mode 100644 index 000000000..537dde557 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java @@ -0,0 +1,39 @@ +package us.myles.ViaVersion.listeners; + +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Boat; +import org.bukkit.entity.Minecart; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.event.vehicle.VehicleEnterEvent; +import org.bukkit.event.vehicle.VehicleExitEvent; +import us.myles.ViaVersion.api.ViaVersion; + +/** + * Created by fillefilip8 on 2016-03-02. + */ +public class VehicleListener implements Listener { + @EventHandler + public void onVehicleEnter(VehicleEnterEvent e){ + if(e.getEntered() instanceof Player) { + Player player = (Player) e.getEntered(); + if(ViaVersion.getInstance().isPorted(player)){ + + if(e.getVehicle() instanceof Minecart){ + e.getEntered().sendMessage(ChatColor.RED + "Minecarts are not supported. Due to changes on minecarts in 1.9"); + e.setCancelled(true); + }else if(e.getVehicle() instanceof Boat){ + e.getEntered().sendMessage(ChatColor.RED + "Boats are not supported. Due to changes on boats in 1.9"); + e.setCancelled(true); + } + + + } + } + + } + +} From bb42cda4a8b716d721dd1a1626052e7be03845f5 Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Thu, 3 Mar 2016 13:26:52 +0100 Subject: [PATCH 04/31] . --- .../ViaVersion/listeners/InteractListener.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/us/myles/ViaVersion/listeners/InteractListener.java diff --git a/src/main/java/us/myles/ViaVersion/listeners/InteractListener.java b/src/main/java/us/myles/ViaVersion/listeners/InteractListener.java new file mode 100644 index 000000000..ad8a6686e --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/listeners/InteractListener.java @@ -0,0 +1,15 @@ +package us.myles.ViaVersion.listeners; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; + +/** + * Created by fillefilip8 on 2016-03-03. + */ +public class InteractListener implements Listener { + @EventHandler + public void onSwordBlock(PlayerInteractEvent e){ + + } +} From ef118a3a642180bcdf658547c685bdb61086f345 Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Thu, 3 Mar 2016 14:28:26 +0100 Subject: [PATCH 05/31] * One JavaDoc to the api XD * Added faster way to change version number. --- pom.xml | 8 +++- .../us/myles/ViaVersion/ViaVersionPlugin.java | 4 +- .../myles/ViaVersion/api/ViaVersionAPI.java | 6 ++- .../listeners/InteractListener.java | 15 ------- .../ViaVersion/listeners/VehicleListener.java | 39 ------------------- src/main/resources/plugin.yml | 2 +- 6 files changed, 14 insertions(+), 60 deletions(-) delete mode 100644 src/main/java/us/myles/ViaVersion/listeners/InteractListener.java delete mode 100644 src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java diff --git a/pom.xml b/pom.xml index 7ab46f1b7..28e6acfee 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ us.myles ViaVersion - 1.0-SNAPSHOT + 0.4.6 @@ -18,6 +18,12 @@ + + + src/main/resources + true + + diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index f9e2b5fb0..2dfe7bcfc 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -16,7 +16,6 @@ import org.bukkit.plugin.java.JavaPlugin; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.ViaVersionAPI; import us.myles.ViaVersion.handlers.ViaVersionInitializer; -import us.myles.ViaVersion.listeners.VehicleListener; import us.myles.ViaVersion.util.ReflectionUtil; import java.util.Collections; @@ -39,7 +38,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { return; } - getLogger().info("ViaVersion enabled, injecting. (Allows 1.8 to be accessed via 1.9)"); + getLogger().info("ViaVersion " + getDescription().getVersion() + " is now enabled, injecting. (Allows 1.8 to be accessed via 1.9)"); try { injectPacketHandler(); System.setProperty("ViaVersion", getDescription().getVersion()); @@ -53,7 +52,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { setPorted(e.getPlayer().getUniqueId(), false); } }, this); - Bukkit.getPluginManager().registerEvents(new VehicleListener(),this); } public void injectPacketHandler() throws Exception { diff --git a/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java b/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java index cdccc80ce..2d053b69f 100644 --- a/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java +++ b/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java @@ -3,6 +3,10 @@ package us.myles.ViaVersion.api; import org.bukkit.entity.Player; public interface ViaVersionAPI { - + /** + * Is player using 1.9? + * @param player + * @return + */ boolean isPorted(Player player); } diff --git a/src/main/java/us/myles/ViaVersion/listeners/InteractListener.java b/src/main/java/us/myles/ViaVersion/listeners/InteractListener.java deleted file mode 100644 index ad8a6686e..000000000 --- a/src/main/java/us/myles/ViaVersion/listeners/InteractListener.java +++ /dev/null @@ -1,15 +0,0 @@ -package us.myles.ViaVersion.listeners; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEvent; - -/** - * Created by fillefilip8 on 2016-03-03. - */ -public class InteractListener implements Listener { - @EventHandler - public void onSwordBlock(PlayerInteractEvent e){ - - } -} diff --git a/src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java b/src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java deleted file mode 100644 index 537dde557..000000000 --- a/src/main/java/us/myles/ViaVersion/listeners/VehicleListener.java +++ /dev/null @@ -1,39 +0,0 @@ -package us.myles.ViaVersion.listeners; - -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.Boat; -import org.bukkit.entity.Minecart; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerToggleSneakEvent; -import org.bukkit.event.vehicle.VehicleEnterEvent; -import org.bukkit.event.vehicle.VehicleExitEvent; -import us.myles.ViaVersion.api.ViaVersion; - -/** - * Created by fillefilip8 on 2016-03-02. - */ -public class VehicleListener implements Listener { - @EventHandler - public void onVehicleEnter(VehicleEnterEvent e){ - if(e.getEntered() instanceof Player) { - Player player = (Player) e.getEntered(); - if(ViaVersion.getInstance().isPorted(player)){ - - if(e.getVehicle() instanceof Minecart){ - e.getEntered().sendMessage(ChatColor.RED + "Minecarts are not supported. Due to changes on minecarts in 1.9"); - e.setCancelled(true); - }else if(e.getVehicle() instanceof Boat){ - e.getEntered().sendMessage(ChatColor.RED + "Boats are not supported. Due to changes on boats in 1.9"); - e.setCancelled(true); - } - - - } - } - - } - -} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3f3eaa8a2..012f63e08 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: ViaVersion main: us.myles.ViaVersion.ViaVersionPlugin author: _MylesC -version: 0.4.6 +version: ${version} load: startup loadbefore: [ProtocolLib, ProxyPipe] \ No newline at end of file From 5930a8376510b59848c5bf2a3ff43e69649f03c3 Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Thu, 3 Mar 2016 14:57:04 +0100 Subject: [PATCH 06/31] Added a command and a new API function "getVersion()" --- .../myles/ViaVersion/ViaVersionCommand.java | 48 +++++++++++++++++++ .../us/myles/ViaVersion/ViaVersionPlugin.java | 6 +++ .../myles/ViaVersion/api/ViaVersionAPI.java | 1 + src/main/resources/plugin.yml | 4 +- 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/main/java/us/myles/ViaVersion/ViaVersionCommand.java diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionCommand.java b/src/main/java/us/myles/ViaVersion/ViaVersionCommand.java new file mode 100644 index 000000000..d02098112 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/ViaVersionCommand.java @@ -0,0 +1,48 @@ +package us.myles.ViaVersion; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import us.myles.ViaVersion.api.ViaVersion; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by fillefilip8 on 2016-03-03. + */ +public class ViaVersionCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + if (sender.hasPermission("viaversion.admin")) { + if (args.length == 0) { + sender.sendMessage(color("&aViaVersion &c" + ViaVersion.getInstance().getVersion() + "&b by &6_MylesC")); + sender.sendMessage(color("&6Commands:")); + sender.sendMessage(color("&2/viaversion list &7- &6Shows lists of all 1.9 clients and 1.8 clients.")); + } else if (args.length == 1) { + if (args[0].equalsIgnoreCase("list")) { + List portedPlayers = new ArrayList(); + List normalPlayers = new ArrayList(); + for (Player p : Bukkit.getOnlinePlayers()) { + if (ViaVersion.getInstance().isPorted(p)) { + portedPlayers.add(p.getName()); + } else { + normalPlayers.add(p.getName()); + } + } + + sender.sendMessage(color("&8[&61.9&8]: &b" + portedPlayers.toString())); + sender.sendMessage(color("&8[&61.8&8]: &b" + normalPlayers.toString())); + } + } + + } + return false; + } + public String color(String string){ + return string.replace("&", "ยง"); + } +} diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 2dfe7bcfc..6cf14b4f6 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -52,6 +52,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { setPorted(e.getPlayer().getUniqueId(), false); } }, this); + getCommand("viaversion").setExecutor(new ViaVersionCommand()); } public void injectPacketHandler() throws Exception { @@ -78,6 +79,11 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { return portedPlayers.contains(player.getUniqueId()); } + @Override + public String getVersion() { + return getDescription().getVersion(); + } + public void setPorted(UUID id, boolean value) { if (value) { portedPlayers.add(id); diff --git a/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java b/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java index 2d053b69f..ba3fe0b0e 100644 --- a/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java +++ b/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java @@ -9,4 +9,5 @@ public interface ViaVersionAPI { * @return */ boolean isPorted(Player player); + String getVersion(); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 012f63e08..e570f35b9 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,4 +3,6 @@ main: us.myles.ViaVersion.ViaVersionPlugin author: _MylesC version: ${version} load: startup -loadbefore: [ProtocolLib, ProxyPipe] \ No newline at end of file +loadbefore: [ProtocolLib, ProxyPipe] +commands: + viaversion: \ No newline at end of file From 1b75526892a71fe41d7d6614b5fa34696cc360b3 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 15:17:31 +0000 Subject: [PATCH 07/31] Implement changes to entity effect --- .../transformers/OutgoingTransformer.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 667d50be3..9fcc91970 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -428,6 +428,20 @@ public class OutgoingTransformer { output.writeBytes(input); return; } + if (packet == PacketType.PLAY_ENTITY_EFFECT) { + int id = PacketUtil.readVarInt(input); + PacketUtil.writeVarInt(id, output); + byte effectID = input.readByte(); + output.writeByte(effectID); + byte amplifier = input.readByte(); + output.writeByte(amplifier); + int duration = PacketUtil.readVarInt(input); + PacketUtil.writeVarInt(duration, output); + // we need to write as a byte instead of boolean + boolean hideParticles = input.readBoolean(); + output.writeByte(hideParticles ? 1 : 0); + return; + } if (packet == PacketType.PLAY_TEAM) { String teamName = PacketUtil.readString(input); PacketUtil.writeString(teamName, output); From 9108e78491d3893f0f279039eab156994770e373 Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Thu, 3 Mar 2016 17:42:38 +0100 Subject: [PATCH 08/31] Added more yml info and remove author name from the message in the command. --- src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java | 1 + .../myles/ViaVersion/{ => commands}/ViaVersionCommand.java | 4 ++-- src/main/resources/plugin.yml | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) rename src/main/java/us/myles/ViaVersion/{ => commands}/ViaVersionCommand.java (95%) diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 6cf14b4f6..3f8d24e03 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -15,6 +15,7 @@ import org.bukkit.plugin.java.JavaPlugin; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.ViaVersionAPI; +import us.myles.ViaVersion.commands.ViaVersionCommand; import us.myles.ViaVersion.handlers.ViaVersionInitializer; import us.myles.ViaVersion.util.ReflectionUtil; diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionCommand.java b/src/main/java/us/myles/ViaVersion/commands/ViaVersionCommand.java similarity index 95% rename from src/main/java/us/myles/ViaVersion/ViaVersionCommand.java rename to src/main/java/us/myles/ViaVersion/commands/ViaVersionCommand.java index d02098112..11872a831 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionCommand.java +++ b/src/main/java/us/myles/ViaVersion/commands/ViaVersionCommand.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion; +package us.myles.ViaVersion.commands; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -19,7 +19,7 @@ public class ViaVersionCommand implements CommandExecutor { public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (sender.hasPermission("viaversion.admin")) { if (args.length == 0) { - sender.sendMessage(color("&aViaVersion &c" + ViaVersion.getInstance().getVersion() + "&b by &6_MylesC")); + sender.sendMessage(color("&aViaVersion &c" + ViaVersion.getInstance().getVersion())); sender.sendMessage(color("&6Commands:")); sender.sendMessage(color("&2/viaversion list &7- &6Shows lists of all 1.9 clients and 1.8 clients.")); } else if (args.length == 1) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e570f35b9..18a0b5f85 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,4 +5,7 @@ version: ${version} load: startup loadbefore: [ProtocolLib, ProxyPipe] commands: - viaversion: \ No newline at end of file + viaversion: + description: Shows ViaVersion Version and more. + permission: viaversion.admin + aliases: [viaver] \ No newline at end of file From fee986d21558e63d5ef9b33eb525a433cec48062 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 18:12:10 +0000 Subject: [PATCH 09/31] Make the injectors work in any 1.8 version. Now looks through fields for suitable in case of different field names also construct slot using known arguments. --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 37 ++++++++++++------- .../transformers/IncomingTransformer.java | 7 +++- .../transformers/OutgoingTransformer.java | 5 ++- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 0bdaf7820..ae03f1cd1 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -12,12 +12,12 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; - import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.ViaVersionAPI; import us.myles.ViaVersion.handlers.ViaVersionInitializer; import us.myles.ViaVersion.util.ReflectionUtil; +import java.lang.reflect.Field; import java.util.Collections; import java.util.List; import java.util.Set; @@ -33,7 +33,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { @Override public void onEnable() { ViaVersion.setInstance(this); - if(System.getProperty("ViaVersion") != null){ + if (System.getProperty("ViaVersion") != null) { getLogger().severe("ViaVersion is already loaded, we don't support reloads. Please reboot if you wish to update."); return; } @@ -58,18 +58,29 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { Class serverClazz = ReflectionUtil.nms("MinecraftServer"); Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); Object connection = serverClazz.getDeclaredMethod("getServerConnection").invoke(server); - - List futures = ReflectionUtil.get(connection, "g", List.class); - if (futures.size() == 0) { - throw new Exception("Could not find server to inject (Please ensure late-bind in your spigot.yml is false)"); + // loop through all fields checking if list + boolean injected = false; + for (Field field : connection.getClass().getDeclaredFields()) { + field.setAccessible(true); + Object value = field.get(connection); + if (value instanceof List) { + for (Object o : (List) value) { + if (o instanceof ChannelFuture) { + ChannelFuture future = (ChannelFuture) o; + ChannelPipeline pipeline = future.channel().pipeline(); + ChannelHandler bootstrapAcceptor = pipeline.first(); + ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); + ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); + injected = true; + } else { + break; // not the right list. + } + } + } } - - for (ChannelFuture future : futures) { - ChannelPipeline pipeline = future.channel().pipeline(); - ChannelHandler bootstrapAcceptor = pipeline.first(); - ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); - ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); + if (!injected) { + throw new Exception("Could not find server to inject (Please ensure late-bind in your spigot.yml is false)"); } } diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index b7c99669d..579297062 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -10,6 +10,7 @@ import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.util.PacketUtil; import us.myles.ViaVersion.util.ReflectionUtil; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -102,7 +103,9 @@ public class IncomingTransformer { if (slot == 45 && windowID == 0) { try { Class setSlot = ReflectionUtil.nms("PacketPlayOutSetSlot"); - Object setSlotPacket = setSlot.getConstructors()[1].newInstance(windowID, slot, null); + Constructor setSlotConstruct = setSlot.getDeclaredConstructor(int.class, int.class, ReflectionUtil.nms("ItemStack")); + // properly construct + Object setSlotPacket = setSlotConstruct.newInstance(windowID, slot, null); info.getChannel().pipeline().writeAndFlush(setSlotPacket); // slot is empty slot = -999; // we're evil, they'll throw item on the ground } catch (ClassNotFoundException e) { @@ -113,6 +116,8 @@ public class IncomingTransformer { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); } } diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 9fcc91970..90cf3967a 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -50,7 +50,7 @@ public class OutgoingTransformer { if (packet == null) { throw new RuntimeException("Outgoing Packet not found? " + packetID + " State: " + info.getState() + " Version: " + info.getProtocol()); } -// if (packet != PacketType.PLAY_CHUNK_DATA && packet != PacketType.PLAY_KEEP_ALIVE && packet != PacketType.PLAY_TIME_UPDATE && (!packet.name().toLowerCase().contains("move") && !packet.name().contains("look"))) +// if (packet != PacketType.PLAY_CHUNK_DATA && packet != PacketType.PLAY_KEEP_ALIVE && packet != PacketType.PLAY_TIME_UPDATE && (!packet.name().toLowerCase().contains("move") && !packet.name().toLowerCase().contains("look"))) // System.out.println("Packet Type: " + packet + " Original ID: " + packetID + " State:" + info.getState()); if (packet.getPacketID() != -1) { packetID = packet.getNewPacketID(); @@ -60,6 +60,7 @@ public class OutgoingTransformer { PacketUtil.writeVarInt(packetID, output); if (packet == PacketType.PLAY_NAMED_SOUND_EFFECT) { String name = PacketUtil.readString(input); + SoundEffect effect = SoundEffect.getByName(name); int catid = 0; String newname = name; @@ -511,7 +512,7 @@ public class OutgoingTransformer { output.writeBytes(input); } - private String fixJson(String line) { + public static String fixJson(String line) { if (line == null || line.equalsIgnoreCase("null")) { line = "{\"text\":\"\"}"; } else { From 1a90f0eb28537c09e678044fc72e5ed9558bafb7 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 19:24:37 +0000 Subject: [PATCH 10/31] Use new method for finding cause, might need updating with disconnect. Can't replicate disconnect spam on any version on my machine. Also move to JSON for all because older versions don't have GSON :( in main package --- .../ViaVersion/handlers/ViaDecodeHandler.java | 10 +--- .../ViaVersion/handlers/ViaEncodeHandler.java | 9 +--- .../transformers/OutgoingTransformer.java | 46 ++++++++++--------- .../us/myles/ViaVersion/util/PacketUtil.java | 10 +++- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index 0a2d0f735..8f4d4b7d6 100644 --- a/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -44,13 +44,7 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - if (!(cause.getCause().getCause() instanceof CancelException)) { - if (!(cause.getCause() instanceof CancelException)) { - if (!(cause instanceof CancelException)) { - super.exceptionCaught(ctx, cause); - } - } - } + if (PacketUtil.containsCause(cause, CancelException.class)) return; + super.exceptionCaught(ctx, cause); } - } diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java b/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java index dac12dc59..915f2d9d3 100644 --- a/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java +++ b/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java @@ -72,12 +72,7 @@ public class ViaEncodeHandler extends MessageToByteEncoder { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - if (!(cause.getCause().getCause() instanceof CancelException)) { - if (!(cause.getCause() instanceof CancelException)) { - if (!(cause instanceof CancelException)) { - super.exceptionCaught(ctx, cause); - } - } - } + if (PacketUtil.containsCause(cause, CancelException.class)) return; + super.exceptionCaught(ctx, cause); } } diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 90cf3967a..8fdfb86ca 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -1,15 +1,12 @@ package us.myles.ViaVersion.transformers; -import com.google.gson.Gson; -import com.google.gson.JsonObject; - import io.netty.buffer.ByteBuf; - import org.bukkit.entity.EntityType; +import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; import org.spacehq.mc.protocol.data.game.chunk.Column; import org.spacehq.mc.protocol.util.NetUtil; - import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; @@ -28,7 +25,8 @@ import java.util.*; import static us.myles.ViaVersion.util.PacketUtil.*; public class OutgoingTransformer { - private static Gson gson = new Gson(); + private static JSONParser parser = new JSONParser(); + private final ConnectionInfo info; private final ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); private boolean cancel = false; @@ -65,11 +63,11 @@ public class OutgoingTransformer { int catid = 0; String newname = name; if (effect != null) { - if(effect.isBreakPlaceSound()) { - input.readBytes(input.readableBytes()); - output.clear(); - return; - } + if (effect.isBreakPlaceSound()) { + input.readBytes(input.readableBytes()); + output.clear(); + return; + } catid = effect.getCategory().getId(); newname = effect.getNewName(); } @@ -88,12 +86,12 @@ public class OutgoingTransformer { if (!vehicleMap.containsKey(passenger)) throw new CancelException(); vehicle = vehicleMap.remove(passenger); - writeVarInt(vehicle,output); + writeVarInt(vehicle, output); writeVarIntArray(Collections.emptyList(), output); - } else{ + } else { writeVarInt(vehicle, output); writeVarIntArray(Collections.singletonList(passenger), output); - vehicleMap.put(passenger,vehicle); + vehicleMap.put(passenger, vehicle); } return; } @@ -193,9 +191,14 @@ public class OutgoingTransformer { if (packet == PacketType.STATUS_RESPONSE) { String original = PacketUtil.readString(input); - JsonObject object = gson.fromJson(original, JsonObject.class); - object.get("version").getAsJsonObject().addProperty("protocol", info.getProtocol()); - PacketUtil.writeString(gson.toJson(object), output); + try { + JSONObject json = (JSONObject) parser.parse(original); + JSONObject version = (JSONObject) json.get("version"); + version.put("protocol", info.getProtocol()); + PacketUtil.writeString(json.toJSONString(), output); + } catch (ParseException e) { + e.printStackTrace(); + } return; } if (packet == PacketType.LOGIN_SUCCESS) { @@ -522,11 +525,10 @@ public class OutgoingTransformer { line = "{\"text\":" + line + "}"; } try { - new JSONParser().parse(line); - } - catch (org.json.simple.parser.ParseException e) { - System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github!"); - return "{\"text\":\"\"}"; + parser.parse(line); + } catch (org.json.simple.parser.ParseException e) { + System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github!"); + return "{\"text\":\"\"}"; } return line; } diff --git a/src/main/java/us/myles/ViaVersion/util/PacketUtil.java b/src/main/java/us/myles/ViaVersion/util/PacketUtil.java index 1c2dde784..086b4cdc0 100644 --- a/src/main/java/us/myles/ViaVersion/util/PacketUtil.java +++ b/src/main/java/us/myles/ViaVersion/util/PacketUtil.java @@ -390,7 +390,7 @@ public class PacketUtil { } catch (InvocationTargetException e) { e.printStackTrace(); } - return null; + return null; } public static long[] readBlockPosition(ByteBuf buf) { @@ -414,4 +414,12 @@ public class PacketUtil { return data; } + + public static boolean containsCause(Throwable t, Class c) { + while (t != null) { + t = t.getCause(); + if (c.isAssignableFrom(t.getClass())) return true; + } + return false; + } } From f06851f57aa981e8f0821d953caf5c354def22d5 Mon Sep 17 00:00:00 2001 From: Mats Date: Thu, 3 Mar 2016 20:37:46 +0100 Subject: [PATCH 11/31] Fix skin overlay --- src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java b/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java index 0224f5401..dfb624e05 100644 --- a/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java +++ b/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java @@ -27,7 +27,7 @@ public enum MetaIndex { STAND_LL_POS(ArmorStand.class, 15, Type.Rotation, NewType.Vector3F), STAND_RL_POS(ArmorStand.class, 16, Type.Rotation, NewType.Vector3F), // human, discountined? - PLAYER_SKIN_FLAGS(HumanEntity.class, 10, Type.Byte, NewType.Discontinued), // unsigned on 1.8 + PLAYER_SKIN_FLAGS(HumanEntity.class, 10, Type.Byte, 12, NewType.Byte), // unsigned on 1.8 PLAYER_HUMAN_BYTE(HumanEntity.class, 16, Type.Byte, NewType.Discontinued), // unused on 1.8 PLAYER_ADDITIONAL_HEARTS(HumanEntity.class, 17, Type.Float, NewType.Discontinued), PLAYER_SCORE(HumanEntity.class, 18, Type.Int, NewType.Discontinued), From e826b339f69abce7925a409db786b71d37e91635 Mon Sep 17 00:00:00 2001 From: Mats Date: Thu, 3 Mar 2016 20:49:29 +0100 Subject: [PATCH 12/31] Fixed missing Player metadata --- src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java b/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java index dfb624e05..0cc37828b 100644 --- a/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java +++ b/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java @@ -29,8 +29,8 @@ public enum MetaIndex { // human, discountined? PLAYER_SKIN_FLAGS(HumanEntity.class, 10, Type.Byte, 12, NewType.Byte), // unsigned on 1.8 PLAYER_HUMAN_BYTE(HumanEntity.class, 16, Type.Byte, NewType.Discontinued), // unused on 1.8 - PLAYER_ADDITIONAL_HEARTS(HumanEntity.class, 17, Type.Float, NewType.Discontinued), - PLAYER_SCORE(HumanEntity.class, 18, Type.Int, NewType.Discontinued), + PLAYER_ADDITIONAL_HEARTS(HumanEntity.class, 17, Type.Float, 10, NewType.Float), + PLAYER_SCORE(HumanEntity.class, 18, Type.Int, 11, NewType.VarInt), // horse HORSE_INFO(Horse.class, 16, Type.Int, 12, NewType.Byte), HORSE_TYPE(Horse.class, 19, Type.Byte, 13, NewType.VarInt), From ab9f786999a62a9b8664645754dc437639c3d6d4 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 19:56:00 +0000 Subject: [PATCH 13/31] Don't send a signed byte for digging. --- .../us/myles/ViaVersion/transformers/IncomingTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index 579297062..93b6ed3fe 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -83,7 +83,7 @@ public class IncomingTransformer { return; } if (packet == PacketType.PLAY_PLAYER_DIGGING) { - byte status = input.readByte(); + int status = input.readByte() & 0xFF; // unsign if (status == 6) { // item swap throw new CancelException(); } From 64c2ba243f94b63623a31264d8d58c927dbb2cba Mon Sep 17 00:00:00 2001 From: Paulomart Date: Thu, 3 Mar 2016 18:34:17 +0100 Subject: [PATCH 14/31] Basic support for rewriting SpawnEggs and Potions, still needs more work --- pom.xml | 7 +- .../ViaVersion/api/slot/ItemSlotRewriter.java | 168 ++++++++++++++++++ .../ViaVersion/metadata/MetadataRewriter.java | 13 +- .../transformers/IncomingTransformer.java | 28 ++- .../transformers/OutgoingTransformer.java | 43 ++++- .../us/myles/ViaVersion/util/PacketUtil.java | 39 ---- .../myles/ViaVersion/util/ReflectionUtil.java | 12 ++ 7 files changed, 254 insertions(+), 56 deletions(-) create mode 100644 src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java diff --git a/pom.xml b/pom.xml index 28e6acfee..e85a36124 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,12 @@ - + + org.spigotmc + spigot + 1.8.8-R0.1-SNAPSHOT + + org.bukkit bukkit 1.8.8-R0.1-SNAPSHOT diff --git a/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java b/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java new file mode 100644 index 000000000..0c94f4ac3 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java @@ -0,0 +1,168 @@ +package us.myles.ViaVersion.api.slot; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.bukkit.Material; + +import net.minecraft.server.v1_8_R3.EntityTypes; +import net.minecraft.server.v1_8_R3.Item; +import net.minecraft.server.v1_8_R3.ItemStack; +import net.minecraft.server.v1_8_R3.MobEffect; +import net.minecraft.server.v1_8_R3.MobEffectList; +import net.minecraft.server.v1_8_R3.NBTTagCompound; +import net.minecraft.server.v1_8_R3.PotionBrewer; + +import io.netty.buffer.ByteBuf; + +import us.myles.ViaVersion.CancelException; +import us.myles.ViaVersion.util.ReflectionUtil; + +public class ItemSlotRewriter { + + public static void rewrite1_9To1_8(ByteBuf input, ByteBuf output) throws CancelException { + try { + Object item = readItemStack(input); + fixIdsFrom1_9To1_8(item); + writeItemStack(item, output); + } catch (Exception e) { + System.out.println("Error while rewriting an item slot."); + e.printStackTrace(); + throw new CancelException(); + } + } + + public static void rewrite1_8To1_9(ByteBuf input, ByteBuf output) throws CancelException { + try { + Object item = readItemStack(input); + fixIdsFrom1_8To1_9(item); + writeItemStack(item, output); + } catch (Exception e) { + System.out.println("Error while rewriting an item slot."); + e.printStackTrace(); + throw new CancelException(); + } + } + + public static void fixIdsFrom1_9To1_8(Object itemstack) throws NoSuchFieldException, IllegalAccessException { + if (itemstack != null) { + ItemStack stack = (ItemStack) itemstack; + int itemId = Item.getId(stack.getItem()); + if (itemId == Material.MONSTER_EGG.getId() && stack.getData() == 0) { + NBTTagCompound tag = stack.getTag(); + int data = 0; + if (tag != null && tag.hasKeyOfType("EntityTag", 10)) { + NBTTagCompound entityTag = tag.getCompound("EntityTag"); + if (entityTag.hasKeyOfType("id", 8)) { + String id = entityTag.getString("id"); + Map g = (Map) ReflectionUtil.getStatic(EntityTypes.class, "g", Map.class); + data = g.get(id); + } + } + stack.setTag(null); + stack.setData(data); + } else if (itemId == Material.POTION.getId() && stack.getData() == 0) { + NBTTagCompound tag = stack.getTag(); + if (tag != null) { + System.out.println("in: " + tag); + } + } + } + } + + public static void fixIdsFrom1_8To1_9(Object itemstack) { + if (itemstack != null) { + ItemStack stack = (ItemStack) itemstack; + int itemId = Item.getId(stack.getItem()); + if (itemId == Material.MONSTER_EGG.getId() && stack.getData() != 0) { + NBTTagCompound tag = stack.getTag(); + if (tag == null) { + tag = new NBTTagCompound(); + } + NBTTagCompound entityTag = new NBTTagCompound(); + entityTag.setString("id", EntityTypes.b(stack.getData())); + tag.set("EntityTag", entityTag); + stack.setTag(tag); + stack.setData(0); + } else if (itemId == Material.POTION.getId() && stack.getData() != 0) { + NBTTagCompound tag = stack.getTag(); + if (tag == null) { + tag = new NBTTagCompound(); + stack.setTag(tag); + } + try { + List effects = PotionBrewer.getEffects(stack.getData(), true); + if (effects != null && effects.size() >= 1) { + MobEffect effect = effects.get(0); + MobEffectList type = MobEffectList.byId[effect.getEffectId()]; + StringBuilder name = new StringBuilder(); + System.out.println(effect.getDuration() + " ?>? " +type.k()); + if (effect.getAmplifier() > 0) { + name.append("strong_"); + } else if (effect.getDuration() > type.k()) { + name.append("long_"); + } + + name.append(POTION_TYPE_TO_KEY.get(effect.getEffectId())); + System.out.println("Rewriting to: " + name.toString()); + tag.setString("Potion", name.toString()); + } else { + System.out.println("Falling back to water for subId: " + stack.getData()); + tag.setString("Potion", "water"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + public static Object readItemStack(ByteBuf input) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Object serializer = getPacketDataSerializer(input); + return READ_ITEM.invoke(serializer); + } + + public static void writeItemStack(Object itemstack, ByteBuf output) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Object serializer = getPacketDataSerializer(output); + WRITE_ITEM.invoke(serializer, itemstack); + } + + private static final Map POTION_TYPE_TO_KEY = new HashMap<>(); + private static Constructor SERIALIZER_CONSTRUCTOR; + private static Method WRITE_ITEM; + private static Method READ_ITEM; + + static { + try { + Class list = ReflectionUtil.nms("MobEffectList"); + Map map = ReflectionUtil.getStatic(list, "I", Map.class); + for (Entry e : map.entrySet()) { + System.out.println(e.getValue()); + System.out.println(e.getValue().getClass()); + int id = ReflectionUtil.get(e.getValue(), list, "id", int.class); + String type = ReflectionUtil.get(e.getKey(), "b", String.class); + POTION_TYPE_TO_KEY.put(id, type); + } + } catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException e1) { + e1.printStackTrace(); + } + try { + Class serializer = ReflectionUtil.nms("PacketDataSerializer"); + Class itemStack = ReflectionUtil.nms("ItemStack"); + SERIALIZER_CONSTRUCTOR = serializer.getDeclaredConstructor(ByteBuf.class); + WRITE_ITEM = serializer.getDeclaredMethod("a", itemStack); + READ_ITEM = serializer.getDeclaredMethod("i"); + } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } + } + + private static Object getPacketDataSerializer(ByteBuf buf) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + return SERIALIZER_CONSTRUCTOR.newInstance(buf); + } +} diff --git a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java index 1dad62f05..fd2467a33 100644 --- a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java +++ b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java @@ -11,6 +11,7 @@ import org.bukkit.util.Vector; import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.slot.ItemSlotRewriter; import us.myles.ViaVersion.util.PacketUtil; public class MetadataRewriter { @@ -92,7 +93,8 @@ public class MetadataRewriter { output.writeBoolean(((Byte) value).byteValue() != 0); break; case Slot: - PacketUtil.writeItem(value, output); + ItemSlotRewriter.fixIdsFrom1_8To1_9(value); + ItemSlotRewriter.writeItemStack(value, output); break; case Position: Vector vector = (Vector) value; @@ -148,8 +150,13 @@ public class MetadataRewriter { case String: entries.add(new Entry(index, PacketUtil.readString(buf))); break; - case Slot: - entries.add(new Entry(index, PacketUtil.readItem(buf))); + case Slot: { + try { + entries.add(new Entry(index, ItemSlotRewriter.readItemStack(buf))); + } catch (Exception e) { + e.printStackTrace(); + } + } break; case Position: { int x = buf.readInt(); diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index b7c99669d..5d1d0a522 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -5,6 +5,7 @@ import org.bukkit.inventory.ItemStack; import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.slot.ItemSlotRewriter; import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.util.PacketUtil; @@ -121,7 +122,7 @@ public class IncomingTransformer { output.writeByte(button); output.writeShort(action); output.writeByte(mode); - output.writeBytes(input); + ItemSlotRewriter.rewrite1_9To1_8(input, output); return; } if (packet == PacketType.PLAY_CLIENT_SETTINGS) { @@ -178,6 +179,8 @@ public class IncomingTransformer { try { Method m = ReflectionUtil.obc("inventory.CraftItemStack").getDeclaredMethod("asNMSCopy", ItemStack.class); item = m.invoke(null, inHand); + ItemSlotRewriter.fixIdsFrom1_9To1_8(item); + ItemSlotRewriter.writeItemStack(item, output); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { @@ -186,10 +189,14 @@ public class IncomingTransformer { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); } - PacketUtil.writeItem(item, output); - short curX = input.readUnsignedByte(); output.writeByte(curX); short curY = input.readUnsignedByte(); @@ -210,6 +217,8 @@ public class IncomingTransformer { try { Method m = ReflectionUtil.obc("inventory.CraftItemStack").getDeclaredMethod("asNMSCopy", ItemStack.class); item = m.invoke(null, inHand); + ItemSlotRewriter.fixIdsFrom1_9To1_8(item); + ItemSlotRewriter.writeItemStack(item, output); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { @@ -218,14 +227,25 @@ public class IncomingTransformer { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); } - PacketUtil.writeItem(item, output); output.writeByte(-1); output.writeByte(-1); output.writeByte(-1); return; } + if (packet == PacketType.PLAY_CREATIVE_INVENTORY_ACTION) { + short slot = input.readShort(); + output.writeShort(slot); + + ItemSlotRewriter.rewrite1_9To1_8(input, output); + } output.writeBytes(input); } } diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 9fcc91970..7c5bdc958 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -14,6 +14,7 @@ import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.slot.ItemSlotRewriter; import us.myles.ViaVersion.metadata.MetadataRewriter; import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.packets.State; @@ -64,11 +65,11 @@ public class OutgoingTransformer { int catid = 0; String newname = name; if (effect != null) { - if(effect.isBreakPlaceSound()) { - input.readBytes(input.readableBytes()); - output.clear(); - return; - } + if(effect.isBreakPlaceSound()) { + input.readBytes(input.readableBytes()); + output.clear(); + return; + } catid = effect.getCategory().getId(); newname = effect.getNewName(); } @@ -221,7 +222,9 @@ public class OutgoingTransformer { slot += 1; // add 1 so it's now 2-5 } PacketUtil.writeVarInt(slot, output); - output.writeBytes(input); + + ItemSlotRewriter.rewrite1_8To1_9(input, output); + return; } if (packet == PacketType.PLAY_ENTITY_METADATA) { int id = PacketUtil.readVarInt(input); @@ -338,6 +341,28 @@ public class OutgoingTransformer { output.writeBytes(input); return; } + if (packet == PacketType.PLAY_SET_SLOT) { + int windowId = input.readUnsignedByte(); + output.writeByte(windowId); + + short slot = input.readShort(); + output.writeShort(slot); + + ItemSlotRewriter.rewrite1_8To1_9(input, output); + return; + } + if (packet == PacketType.PLAY_WINDOW_ITEMS) { + int windowId = input.readUnsignedByte(); + output.writeByte(windowId); + + short count = input.readShort(); + output.writeShort(count); + + for (int i = 0; i < count; i++) { + ItemSlotRewriter.rewrite1_8To1_9(input, output); + } + return; + } if (packet == PacketType.PLAY_SPAWN_MOB) { int id = PacketUtil.readVarInt(input); PacketUtil.writeVarInt(id, output); @@ -521,11 +546,11 @@ public class OutgoingTransformer { line = "{\"text\":" + line + "}"; } try { - new JSONParser().parse(line); + new JSONParser().parse(line); } catch (org.json.simple.parser.ParseException e) { - System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github!"); - return "{\"text\":\"\"}"; + System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github!"); + return "{\"text\":\"\"}"; } return line; } diff --git a/src/main/java/us/myles/ViaVersion/util/PacketUtil.java b/src/main/java/us/myles/ViaVersion/util/PacketUtil.java index 1c2dde784..5d703b4fe 100644 --- a/src/main/java/us/myles/ViaVersion/util/PacketUtil.java +++ b/src/main/java/us/myles/ViaVersion/util/PacketUtil.java @@ -354,45 +354,6 @@ public class PacketUtil { return output; } - public static void writeItem(Object value, ByteBuf output) { - try { - Class serializer = ReflectionUtil.nms("PacketDataSerializer"); - Object init = serializer.getDeclaredConstructor(ByteBuf.class).newInstance(output); - Method toCall = init.getClass().getDeclaredMethod("a", ReflectionUtil.nms("ItemStack")); - toCall.invoke(init, value); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } - - public static Object readItem(ByteBuf output) { - try { - Class serializer = ReflectionUtil.nms("PacketDataSerializer"); - Object init = serializer.getDeclaredConstructor(ByteBuf.class).newInstance(output); - Method toCall = init.getClass().getDeclaredMethod("i"); - return toCall.invoke(init); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - return null; - } - public static long[] readBlockPosition(ByteBuf buf) { long val = buf.readLong(); long x = (val >> 38); // signed diff --git a/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java b/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java index e5f19187e..9b7829d3e 100644 --- a/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java +++ b/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java @@ -27,6 +27,18 @@ public class ReflectionUtil { return m.invoke(o); } + public static T getStatic(Class clazz, String f, Class t) throws NoSuchFieldException, IllegalAccessException { + Field field = clazz.getDeclaredField(f); + field.setAccessible(true); + return (T) field.get(null); + } + + public static T get(Object instance, Class clazz, String f, Class t) throws NoSuchFieldException, IllegalAccessException { + Field field = clazz.getDeclaredField(f); + field.setAccessible(true); + return (T) field.get(instance); + } + public static T get(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { Field field = o.getClass().getDeclaredField(f); field.setAccessible(true); From 00df80e6fd21c54a25ab7d27dc13db0d001bb5f7 Mon Sep 17 00:00:00 2001 From: Paulomart Date: Thu, 3 Mar 2016 21:13:49 +0100 Subject: [PATCH 15/31] Replace nms code with fancy library and own code. --- pom.xml | 39 ++- .../ViaVersion/api/slot/ItemSlotRewriter.java | 243 ++++++++++-------- .../ViaVersion/metadata/MetadataRewriter.java | 6 +- .../transformers/IncomingTransformer.java | 36 +-- .../us/myles/ViaVersion/util/PacketUtil.java | 27 ++ 5 files changed, 197 insertions(+), 154 deletions(-) diff --git a/pom.xml b/pom.xml index e85a36124..a8e32f12c 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 us.myles @@ -9,6 +8,22 @@ 0.4.6 + + org.apache.maven.plugins + maven-shade-plugin + 1.4 + + false + + + + package + + shade + + + + org.apache.maven.plugins maven-compiler-plugin @@ -26,12 +41,12 @@ - - org.spigotmc - spigot - 1.8.8-R0.1-SNAPSHOT - - + + org.spacehq + opennbt + 1.0 + + org.bukkit bukkit 1.8.8-R0.1-SNAPSHOT @@ -61,5 +76,9 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - + + spacehq-repo + https://repo.spacehq.org/content/repositories/releases/ + + diff --git a/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java b/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java index 0c94f4ac3..a25be1362 100644 --- a/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java +++ b/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java @@ -1,33 +1,23 @@ package us.myles.ViaVersion.api.slot; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import java.io.IOException; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; import org.bukkit.Material; - -import net.minecraft.server.v1_8_R3.EntityTypes; -import net.minecraft.server.v1_8_R3.Item; -import net.minecraft.server.v1_8_R3.ItemStack; -import net.minecraft.server.v1_8_R3.MobEffect; -import net.minecraft.server.v1_8_R3.MobEffectList; -import net.minecraft.server.v1_8_R3.NBTTagCompound; -import net.minecraft.server.v1_8_R3.PotionBrewer; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import org.spacehq.opennbt.tag.builtin.StringTag; import io.netty.buffer.ByteBuf; import us.myles.ViaVersion.CancelException; -import us.myles.ViaVersion.util.ReflectionUtil; +import us.myles.ViaVersion.util.PacketUtil; public class ItemSlotRewriter { public static void rewrite1_9To1_8(ByteBuf input, ByteBuf output) throws CancelException { try { - Object item = readItemStack(input); + ItemStack item = readItemStack(input); fixIdsFrom1_9To1_8(item); writeItemStack(item, output); } catch (Exception e) { @@ -39,7 +29,7 @@ public class ItemSlotRewriter { public static void rewrite1_8To1_9(ByteBuf input, ByteBuf output) throws CancelException { try { - Object item = readItemStack(input); + ItemStack item = readItemStack(input); fixIdsFrom1_8To1_9(item); writeItemStack(item, output); } catch (Exception e) { @@ -49,120 +39,153 @@ public class ItemSlotRewriter { } } - public static void fixIdsFrom1_9To1_8(Object itemstack) throws NoSuchFieldException, IllegalAccessException { - if (itemstack != null) { - ItemStack stack = (ItemStack) itemstack; - int itemId = Item.getId(stack.getItem()); - if (itemId == Material.MONSTER_EGG.getId() && stack.getData() == 0) { - NBTTagCompound tag = stack.getTag(); + public static void fixIdsFrom1_9To1_8(ItemStack item) { + if (item != null) { + if (item.id == Material.MONSTER_EGG.getId() && item.data == 0) { + CompoundTag tag = item.tag; int data = 0; - if (tag != null && tag.hasKeyOfType("EntityTag", 10)) { - NBTTagCompound entityTag = tag.getCompound("EntityTag"); - if (entityTag.hasKeyOfType("id", 8)) { - String id = entityTag.getString("id"); - Map g = (Map) ReflectionUtil.getStatic(EntityTypes.class, "g", Map.class); - data = g.get(id); + if (tag != null && tag.get("EntityTag") instanceof CompoundTag) { + CompoundTag entityTag = tag.get("EntityTag"); + if (entityTag.get("id") instanceof StringTag) { + StringTag id = entityTag.get("id"); + data = ENTTIY_NAME_TO_ID.get(id.getValue()); } } - stack.setTag(null); - stack.setData(data); - } else if (itemId == Material.POTION.getId() && stack.getData() == 0) { - NBTTagCompound tag = stack.getTag(); - if (tag != null) { - System.out.println("in: " + tag); - } + item.tag = null; + item.data = (short) data; } } } - public static void fixIdsFrom1_8To1_9(Object itemstack) { - if (itemstack != null) { - ItemStack stack = (ItemStack) itemstack; - int itemId = Item.getId(stack.getItem()); - if (itemId == Material.MONSTER_EGG.getId() && stack.getData() != 0) { - NBTTagCompound tag = stack.getTag(); + public static void fixIdsFrom1_8To1_9(ItemStack item) { + if (item != null) { + if (item.id == Material.MONSTER_EGG.getId() && item.data != 0) { + CompoundTag tag = item.tag; if (tag == null) { - tag = new NBTTagCompound(); - } - NBTTagCompound entityTag = new NBTTagCompound(); - entityTag.setString("id", EntityTypes.b(stack.getData())); - tag.set("EntityTag", entityTag); - stack.setTag(tag); - stack.setData(0); - } else if (itemId == Material.POTION.getId() && stack.getData() != 0) { - NBTTagCompound tag = stack.getTag(); - if (tag == null) { - tag = new NBTTagCompound(); - stack.setTag(tag); - } - try { - List effects = PotionBrewer.getEffects(stack.getData(), true); - if (effects != null && effects.size() >= 1) { - MobEffect effect = effects.get(0); - MobEffectList type = MobEffectList.byId[effect.getEffectId()]; - StringBuilder name = new StringBuilder(); - System.out.println(effect.getDuration() + " ?>? " +type.k()); - if (effect.getAmplifier() > 0) { - name.append("strong_"); - } else if (effect.getDuration() > type.k()) { - name.append("long_"); - } - - name.append(POTION_TYPE_TO_KEY.get(effect.getEffectId())); - System.out.println("Rewriting to: " + name.toString()); - tag.setString("Potion", name.toString()); - } else { - System.out.println("Falling back to water for subId: " + stack.getData()); - tag.setString("Potion", "water"); - } - } catch (Exception e) { - e.printStackTrace(); + tag = new CompoundTag("tag"); } + CompoundTag entityTag = new CompoundTag("EntityTag"); + StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get(item.data)); + entityTag.put(id); + tag.put(entityTag); + item.tag = tag; + item.data = 0; } } } - public static Object readItemStack(ByteBuf input) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - Object serializer = getPacketDataSerializer(input); - return READ_ITEM.invoke(serializer); + public static ItemStack readItemStack(ByteBuf input) throws IOException { + short id = input.readShort(); + if (id < 0) { + return null; + } else { + ItemStack item = new ItemStack(); + item.id = id; + item.amount = input.readByte(); + item.data = input.readShort(); + item.tag = PacketUtil.readNBT(input); + return item; + } } - public static void writeItemStack(Object itemstack, ByteBuf output) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - Object serializer = getPacketDataSerializer(output); - WRITE_ITEM.invoke(serializer, itemstack); + public static void writeItemStack(ItemStack item, ByteBuf output) throws IOException { + if (item == null) { + output.writeShort(-1); + } else { + output.writeShort(item.id); + output.writeByte(item.amount); + output.writeShort(item.data); + PacketUtil.writeNBT(output, item.tag); + } } - private static final Map POTION_TYPE_TO_KEY = new HashMap<>(); - private static Constructor SERIALIZER_CONSTRUCTOR; - private static Method WRITE_ITEM; - private static Method READ_ITEM; + public static class ItemStack { + + private short id; + private byte amount; + private short data; + private CompoundTag tag; + + public static ItemStack fromBukkit(org.bukkit.inventory.ItemStack stack) { + ItemStack item = new ItemStack(); + item.id = (short) stack.getTypeId(); + item.amount = (byte) stack.getAmount(); + item.data = stack.getData().getData(); + // TODO: nbt + return item; + } + } + + private static Map ENTTIY_NAME_TO_ID = new HashMap<>(); + private static Map ENTTIY_ID_TO_NAME = new HashMap<>(); static { - try { - Class list = ReflectionUtil.nms("MobEffectList"); - Map map = ReflectionUtil.getStatic(list, "I", Map.class); - for (Entry e : map.entrySet()) { - System.out.println(e.getValue()); - System.out.println(e.getValue().getClass()); - int id = ReflectionUtil.get(e.getValue(), list, "id", int.class); - String type = ReflectionUtil.get(e.getKey(), "b", String.class); - POTION_TYPE_TO_KEY.put(id, type); - } - } catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException e1) { - e1.printStackTrace(); - } - try { - Class serializer = ReflectionUtil.nms("PacketDataSerializer"); - Class itemStack = ReflectionUtil.nms("ItemStack"); - SERIALIZER_CONSTRUCTOR = serializer.getDeclaredConstructor(ByteBuf.class); - WRITE_ITEM = serializer.getDeclaredMethod("a", itemStack); - READ_ITEM = serializer.getDeclaredMethod("i"); - } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) { - e.printStackTrace(); - } + register(1, "Item"); + register(2, "XPOrb"); + register(7, "ThrownEgg"); + register(8, "LeashKnot"); + register(9, "Painting"); + register(10, "Arrow"); + register(11, "Snowball"); + register(12, "Fireball"); + register(13, "SmallFireball"); + register(14, "ThrownEnderpearl"); + register(15, "EyeOfEnderSignal"); + register(16, "ThrownPotion"); + register(17, "ThrownExpBottle"); + register(18, "ItemFrame"); + register(19, "WitherSkull"); + register(20, "PrimedTnt"); + register(21, "FallingSand"); + register(22, "FireworksRocketEntity"); + register(30, "ArmorStand"); + register(40, "MinecartCommandBlock"); + register(41, "Boat"); + register(42, "MinecartRideable"); + register(43, "MinecartChest"); + register(44, "MinecartFurnace"); + register(45, "MinecartTNT"); + register(46, "MinecartHopper"); + register(47, "MinecartSpawner"); + register(48, "Mob"); + register(49, "Monster"); + register(50, "Creeper"); + register(51, "Skeleton"); + register(52, "Spider"); + register(53, "Giant"); + register(54, "Zombie"); + register(55, "Slime"); + register(56, "Ghast"); + register(57, "PigZombie"); + register(58, "Enderman"); + register(59, "CaveSpider"); + register(60, "Silverfish"); + register(61, "Blaze"); + register(62, "LavaSlime"); + register(63, "EnderDragon"); + register(64, "WitherBoss"); + register(65, "Bat"); + register(66, "Witch"); + register(67, "Endermite"); + register(68, "Guardian"); + register(90, "Pig"); + register(91, "Sheep"); + register(92, "Cow"); + register(93, "Chicken"); + register(94, "Squid"); + register(95, "Wolf"); + register(96, "MushroomCow"); + register(97, "SnowMan"); + register(98, "Ozelot"); + register(99, "VillagerGolem"); + register(100, "EntityHorse"); + register(101, "Rabbit"); + register(120, "Villager"); + register(200, "EnderCrystal"); } - private static Object getPacketDataSerializer(ByteBuf buf) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - return SERIALIZER_CONSTRUCTOR.newInstance(buf); + private static void register(int id, String name) { + ENTTIY_ID_TO_NAME.put(id, name); + ENTTIY_NAME_TO_ID.put(name, id); } } diff --git a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java index fd2467a33..a983a41d3 100644 --- a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java +++ b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java @@ -12,6 +12,7 @@ import org.bukkit.util.Vector; import io.netty.buffer.ByteBuf; import us.myles.ViaVersion.api.slot.ItemSlotRewriter; +import us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack; import us.myles.ViaVersion.util.PacketUtil; public class MetadataRewriter { @@ -93,8 +94,9 @@ public class MetadataRewriter { output.writeBoolean(((Byte) value).byteValue() != 0); break; case Slot: - ItemSlotRewriter.fixIdsFrom1_8To1_9(value); - ItemSlotRewriter.writeItemStack(value, output); + ItemStack item = (ItemStack) value; + ItemSlotRewriter.fixIdsFrom1_8To1_9(item); + ItemSlotRewriter.writeItemStack(item, output); break; case Position: Vector vector = (Vector) value; diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index 5d1d0a522..e102a4214 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -175,25 +175,11 @@ public class IncomingTransformer { int hand = PacketUtil.readVarInt(input); ItemStack inHand = ViaVersionPlugin.getHandItem(info); - Object item = null; try { - Method m = ReflectionUtil.obc("inventory.CraftItemStack").getDeclaredMethod("asNMSCopy", ItemStack.class); - item = m.invoke(null, inHand); + us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack item = us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack.fromBukkit(inHand); ItemSlotRewriter.fixIdsFrom1_9To1_8(item); ItemSlotRewriter.writeItemStack(item, output); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { + } catch (Exception e) { e.printStackTrace(); } @@ -213,25 +199,11 @@ public class IncomingTransformer { output.writeByte(255); // write item in hand ItemStack inHand = ViaVersionPlugin.getHandItem(info); - Object item = null; try { - Method m = ReflectionUtil.obc("inventory.CraftItemStack").getDeclaredMethod("asNMSCopy", ItemStack.class); - item = m.invoke(null, inHand); + us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack item = us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack.fromBukkit(inHand); ItemSlotRewriter.fixIdsFrom1_9To1_8(item); ItemSlotRewriter.writeItemStack(item, output); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { + } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/us/myles/ViaVersion/util/PacketUtil.java b/src/main/java/us/myles/ViaVersion/util/PacketUtil.java index 5d703b4fe..8129e008f 100644 --- a/src/main/java/us/myles/ViaVersion/util/PacketUtil.java +++ b/src/main/java/us/myles/ViaVersion/util/PacketUtil.java @@ -3,6 +3,8 @@ package us.myles.ViaVersion.util; import com.google.common.base.Charsets; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; @@ -11,6 +13,9 @@ import us.myles.ViaVersion.chunks.PacketChunk; import us.myles.ViaVersion.chunks.PacketChunkData; import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.ByteBuffer; @@ -21,6 +26,9 @@ import java.util.BitSet; import java.util.List; import java.util.UUID; +import org.spacehq.opennbt.NBTIO; +import org.spacehq.opennbt.tag.builtin.CompoundTag; + public class PacketUtil { private static Method DECODE_METHOD; private static Method ENCODE_METHOD; @@ -42,6 +50,25 @@ public class PacketUtil { } } + public static CompoundTag readNBT(ByteBuf input) throws IOException { + int readerIndex = input.readerIndex(); + byte b = input.readByte(); + if (b == 0) { + return null; + } else { + input.readerIndex(readerIndex); + return (CompoundTag) NBTIO.readTag(new DataInputStream(new ByteBufInputStream(input))); + } + } + + public static void writeNBT(ByteBuf output, CompoundTag tag) throws IOException { + if (tag == null) { + output.writeByte(0); + } else { + NBTIO.writeTag(new DataOutputStream(new ByteBufOutputStream(output)), tag); + } + } + public static List callDecode(ByteToMessageDecoder decoder, ChannelHandlerContext ctx, Object input) { List output = new ArrayList(); try { From c97b443cf24e19985e6fc936c49b66fd1a2e8d9b Mon Sep 17 00:00:00 2001 From: Paulomart Date: Thu, 3 Mar 2016 21:24:19 +0100 Subject: [PATCH 16/31] I dont even Java. --- .../java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java b/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java index a25be1362..fa126972c 100644 --- a/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java +++ b/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java @@ -65,7 +65,7 @@ public class ItemSlotRewriter { tag = new CompoundTag("tag"); } CompoundTag entityTag = new CompoundTag("EntityTag"); - StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get(item.data)); + StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get(Integer.valueOf(item.data))); entityTag.put(id); tag.put(entityTag); item.tag = tag; @@ -184,7 +184,7 @@ public class ItemSlotRewriter { register(200, "EnderCrystal"); } - private static void register(int id, String name) { + private static void register(Integer id, String name) { ENTTIY_ID_TO_NAME.put(id, name); ENTTIY_NAME_TO_ID.put(name, id); } From c2edf4584622cdebf285c17f8bfbe678ed48e04a Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 21:06:36 +0000 Subject: [PATCH 17/31] Change package for slot rewriter. --- .../ViaVersion/metadata/MetadataRewriter.java | 4 +- .../{api => }/slot/ItemSlotRewriter.java | 382 +++++++++--------- .../transformers/IncomingTransformer.java | 7 +- .../transformers/OutgoingTransformer.java | 2 +- 4 files changed, 197 insertions(+), 198 deletions(-) rename src/main/java/us/myles/ViaVersion/{api => }/slot/ItemSlotRewriter.java (96%) diff --git a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java index a983a41d3..f034bdb16 100644 --- a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java +++ b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java @@ -11,8 +11,8 @@ import org.bukkit.util.Vector; import io.netty.buffer.ByteBuf; -import us.myles.ViaVersion.api.slot.ItemSlotRewriter; -import us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack; +import us.myles.ViaVersion.slot.ItemSlotRewriter; +import us.myles.ViaVersion.slot.ItemSlotRewriter.ItemStack; import us.myles.ViaVersion.util.PacketUtil; public class MetadataRewriter { diff --git a/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java b/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java similarity index 96% rename from src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java rename to src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java index fa126972c..0861d9656 100644 --- a/src/main/java/us/myles/ViaVersion/api/slot/ItemSlotRewriter.java +++ b/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java @@ -1,191 +1,191 @@ -package us.myles.ViaVersion.api.slot; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Material; -import org.spacehq.opennbt.tag.builtin.CompoundTag; -import org.spacehq.opennbt.tag.builtin.StringTag; - -import io.netty.buffer.ByteBuf; - -import us.myles.ViaVersion.CancelException; -import us.myles.ViaVersion.util.PacketUtil; - -public class ItemSlotRewriter { - - public static void rewrite1_9To1_8(ByteBuf input, ByteBuf output) throws CancelException { - try { - ItemStack item = readItemStack(input); - fixIdsFrom1_9To1_8(item); - writeItemStack(item, output); - } catch (Exception e) { - System.out.println("Error while rewriting an item slot."); - e.printStackTrace(); - throw new CancelException(); - } - } - - public static void rewrite1_8To1_9(ByteBuf input, ByteBuf output) throws CancelException { - try { - ItemStack item = readItemStack(input); - fixIdsFrom1_8To1_9(item); - writeItemStack(item, output); - } catch (Exception e) { - System.out.println("Error while rewriting an item slot."); - e.printStackTrace(); - throw new CancelException(); - } - } - - public static void fixIdsFrom1_9To1_8(ItemStack item) { - if (item != null) { - if (item.id == Material.MONSTER_EGG.getId() && item.data == 0) { - CompoundTag tag = item.tag; - int data = 0; - if (tag != null && tag.get("EntityTag") instanceof CompoundTag) { - CompoundTag entityTag = tag.get("EntityTag"); - if (entityTag.get("id") instanceof StringTag) { - StringTag id = entityTag.get("id"); - data = ENTTIY_NAME_TO_ID.get(id.getValue()); - } - } - item.tag = null; - item.data = (short) data; - } - } - } - - public static void fixIdsFrom1_8To1_9(ItemStack item) { - if (item != null) { - if (item.id == Material.MONSTER_EGG.getId() && item.data != 0) { - CompoundTag tag = item.tag; - if (tag == null) { - tag = new CompoundTag("tag"); - } - CompoundTag entityTag = new CompoundTag("EntityTag"); - StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get(Integer.valueOf(item.data))); - entityTag.put(id); - tag.put(entityTag); - item.tag = tag; - item.data = 0; - } - } - } - - public static ItemStack readItemStack(ByteBuf input) throws IOException { - short id = input.readShort(); - if (id < 0) { - return null; - } else { - ItemStack item = new ItemStack(); - item.id = id; - item.amount = input.readByte(); - item.data = input.readShort(); - item.tag = PacketUtil.readNBT(input); - return item; - } - } - - public static void writeItemStack(ItemStack item, ByteBuf output) throws IOException { - if (item == null) { - output.writeShort(-1); - } else { - output.writeShort(item.id); - output.writeByte(item.amount); - output.writeShort(item.data); - PacketUtil.writeNBT(output, item.tag); - } - } - - public static class ItemStack { - - private short id; - private byte amount; - private short data; - private CompoundTag tag; - - public static ItemStack fromBukkit(org.bukkit.inventory.ItemStack stack) { - ItemStack item = new ItemStack(); - item.id = (short) stack.getTypeId(); - item.amount = (byte) stack.getAmount(); - item.data = stack.getData().getData(); - // TODO: nbt - return item; - } - } - - private static Map ENTTIY_NAME_TO_ID = new HashMap<>(); - private static Map ENTTIY_ID_TO_NAME = new HashMap<>(); - - static { - register(1, "Item"); - register(2, "XPOrb"); - register(7, "ThrownEgg"); - register(8, "LeashKnot"); - register(9, "Painting"); - register(10, "Arrow"); - register(11, "Snowball"); - register(12, "Fireball"); - register(13, "SmallFireball"); - register(14, "ThrownEnderpearl"); - register(15, "EyeOfEnderSignal"); - register(16, "ThrownPotion"); - register(17, "ThrownExpBottle"); - register(18, "ItemFrame"); - register(19, "WitherSkull"); - register(20, "PrimedTnt"); - register(21, "FallingSand"); - register(22, "FireworksRocketEntity"); - register(30, "ArmorStand"); - register(40, "MinecartCommandBlock"); - register(41, "Boat"); - register(42, "MinecartRideable"); - register(43, "MinecartChest"); - register(44, "MinecartFurnace"); - register(45, "MinecartTNT"); - register(46, "MinecartHopper"); - register(47, "MinecartSpawner"); - register(48, "Mob"); - register(49, "Monster"); - register(50, "Creeper"); - register(51, "Skeleton"); - register(52, "Spider"); - register(53, "Giant"); - register(54, "Zombie"); - register(55, "Slime"); - register(56, "Ghast"); - register(57, "PigZombie"); - register(58, "Enderman"); - register(59, "CaveSpider"); - register(60, "Silverfish"); - register(61, "Blaze"); - register(62, "LavaSlime"); - register(63, "EnderDragon"); - register(64, "WitherBoss"); - register(65, "Bat"); - register(66, "Witch"); - register(67, "Endermite"); - register(68, "Guardian"); - register(90, "Pig"); - register(91, "Sheep"); - register(92, "Cow"); - register(93, "Chicken"); - register(94, "Squid"); - register(95, "Wolf"); - register(96, "MushroomCow"); - register(97, "SnowMan"); - register(98, "Ozelot"); - register(99, "VillagerGolem"); - register(100, "EntityHorse"); - register(101, "Rabbit"); - register(120, "Villager"); - register(200, "EnderCrystal"); - } - - private static void register(Integer id, String name) { - ENTTIY_ID_TO_NAME.put(id, name); - ENTTIY_NAME_TO_ID.put(name, id); - } -} +package us.myles.ViaVersion.slot; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Material; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import org.spacehq.opennbt.tag.builtin.StringTag; + +import io.netty.buffer.ByteBuf; + +import us.myles.ViaVersion.CancelException; +import us.myles.ViaVersion.util.PacketUtil; + +public class ItemSlotRewriter { + + public static void rewrite1_9To1_8(ByteBuf input, ByteBuf output) throws CancelException { + try { + ItemStack item = readItemStack(input); + fixIdsFrom1_9To1_8(item); + writeItemStack(item, output); + } catch (Exception e) { + System.out.println("Error while rewriting an item slot."); + e.printStackTrace(); + throw new CancelException(); + } + } + + public static void rewrite1_8To1_9(ByteBuf input, ByteBuf output) throws CancelException { + try { + ItemStack item = readItemStack(input); + fixIdsFrom1_8To1_9(item); + writeItemStack(item, output); + } catch (Exception e) { + System.out.println("Error while rewriting an item slot."); + e.printStackTrace(); + throw new CancelException(); + } + } + + public static void fixIdsFrom1_9To1_8(ItemStack item) { + if (item != null) { + if (item.id == Material.MONSTER_EGG.getId() && item.data == 0) { + CompoundTag tag = item.tag; + int data = 0; + if (tag != null && tag.get("EntityTag") instanceof CompoundTag) { + CompoundTag entityTag = tag.get("EntityTag"); + if (entityTag.get("id") instanceof StringTag) { + StringTag id = entityTag.get("id"); + data = ENTTIY_NAME_TO_ID.get(id.getValue()); + } + } + item.tag = null; + item.data = (short) data; + } + } + } + + public static void fixIdsFrom1_8To1_9(ItemStack item) { + if (item != null) { + if (item.id == Material.MONSTER_EGG.getId() && item.data != 0) { + CompoundTag tag = item.tag; + if (tag == null) { + tag = new CompoundTag("tag"); + } + CompoundTag entityTag = new CompoundTag("EntityTag"); + StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get(Integer.valueOf(item.data))); + entityTag.put(id); + tag.put(entityTag); + item.tag = tag; + item.data = 0; + } + } + } + + public static ItemStack readItemStack(ByteBuf input) throws IOException { + short id = input.readShort(); + if (id < 0) { + return null; + } else { + ItemStack item = new ItemStack(); + item.id = id; + item.amount = input.readByte(); + item.data = input.readShort(); + item.tag = PacketUtil.readNBT(input); + return item; + } + } + + public static void writeItemStack(ItemStack item, ByteBuf output) throws IOException { + if (item == null) { + output.writeShort(-1); + } else { + output.writeShort(item.id); + output.writeByte(item.amount); + output.writeShort(item.data); + PacketUtil.writeNBT(output, item.tag); + } + } + + public static class ItemStack { + + private short id; + private byte amount; + private short data; + private CompoundTag tag; + + public static ItemStack fromBukkit(org.bukkit.inventory.ItemStack stack) { + ItemStack item = new ItemStack(); + item.id = (short) stack.getTypeId(); + item.amount = (byte) stack.getAmount(); + item.data = stack.getData().getData(); + // TODO: nbt + return item; + } + } + + private static Map ENTTIY_NAME_TO_ID = new HashMap<>(); + private static Map ENTTIY_ID_TO_NAME = new HashMap<>(); + + static { + register(1, "Item"); + register(2, "XPOrb"); + register(7, "ThrownEgg"); + register(8, "LeashKnot"); + register(9, "Painting"); + register(10, "Arrow"); + register(11, "Snowball"); + register(12, "Fireball"); + register(13, "SmallFireball"); + register(14, "ThrownEnderpearl"); + register(15, "EyeOfEnderSignal"); + register(16, "ThrownPotion"); + register(17, "ThrownExpBottle"); + register(18, "ItemFrame"); + register(19, "WitherSkull"); + register(20, "PrimedTnt"); + register(21, "FallingSand"); + register(22, "FireworksRocketEntity"); + register(30, "ArmorStand"); + register(40, "MinecartCommandBlock"); + register(41, "Boat"); + register(42, "MinecartRideable"); + register(43, "MinecartChest"); + register(44, "MinecartFurnace"); + register(45, "MinecartTNT"); + register(46, "MinecartHopper"); + register(47, "MinecartSpawner"); + register(48, "Mob"); + register(49, "Monster"); + register(50, "Creeper"); + register(51, "Skeleton"); + register(52, "Spider"); + register(53, "Giant"); + register(54, "Zombie"); + register(55, "Slime"); + register(56, "Ghast"); + register(57, "PigZombie"); + register(58, "Enderman"); + register(59, "CaveSpider"); + register(60, "Silverfish"); + register(61, "Blaze"); + register(62, "LavaSlime"); + register(63, "EnderDragon"); + register(64, "WitherBoss"); + register(65, "Bat"); + register(66, "Witch"); + register(67, "Endermite"); + register(68, "Guardian"); + register(90, "Pig"); + register(91, "Sheep"); + register(92, "Cow"); + register(93, "Chicken"); + register(94, "Squid"); + register(95, "Wolf"); + register(96, "MushroomCow"); + register(97, "SnowMan"); + register(98, "Ozelot"); + register(99, "VillagerGolem"); + register(100, "EntityHorse"); + register(101, "Rabbit"); + register(120, "Villager"); + register(200, "EnderCrystal"); + } + + private static void register(Integer id, String name) { + ENTTIY_ID_TO_NAME.put(id, name); + ENTTIY_NAME_TO_ID.put(name, id); + } +} diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index bbf0d950a..52179f694 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -5,7 +5,7 @@ import org.bukkit.inventory.ItemStack; import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.slot.ItemSlotRewriter; +import us.myles.ViaVersion.slot.ItemSlotRewriter; import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.util.PacketUtil; @@ -13,7 +13,6 @@ import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; public class IncomingTransformer { private final ConnectionInfo info; @@ -181,7 +180,7 @@ public class IncomingTransformer { ItemStack inHand = ViaVersionPlugin.getHandItem(info); try { - us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack item = us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack.fromBukkit(inHand); + ItemSlotRewriter.ItemStack item = ItemSlotRewriter.ItemStack.fromBukkit(inHand); ItemSlotRewriter.fixIdsFrom1_9To1_8(item); ItemSlotRewriter.writeItemStack(item, output); } catch (Exception e) { @@ -205,7 +204,7 @@ public class IncomingTransformer { // write item in hand ItemStack inHand = ViaVersionPlugin.getHandItem(info); try { - us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack item = us.myles.ViaVersion.api.slot.ItemSlotRewriter.ItemStack.fromBukkit(inHand); + us.myles.ViaVersion.slot.ItemSlotRewriter.ItemStack item = us.myles.ViaVersion.slot.ItemSlotRewriter.ItemStack.fromBukkit(inHand); ItemSlotRewriter.fixIdsFrom1_9To1_8(item); ItemSlotRewriter.writeItemStack(item, output); } catch (Exception e) { diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 2a7db72c0..38cec131f 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -11,7 +11,7 @@ import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; -import us.myles.ViaVersion.api.slot.ItemSlotRewriter; +import us.myles.ViaVersion.slot.ItemSlotRewriter; import us.myles.ViaVersion.metadata.MetadataRewriter; import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.packets.State; From a84b45f5dd5ce8dc0ebeae2049d7b856a30a21a7 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 21:15:20 +0000 Subject: [PATCH 18/31] Add new contributor, make format of output match spigot --- README.md | 5 +++++ pom.xml | 1 + 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 1e9b8b404..b9b722ee7 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,10 @@ Sources: **MCProtocolLib** (used for chunk reading & some of writing.) +**OpenNBT** (used for slot rewriting) + + + Contributors: -------- @@ -33,6 +37,7 @@ Contributors: **SanderGielisse** **Paulomart** **gigosaurus** +**fillefilip8** **Chat: ** https://gitter.im/MylesIsCool/ViaVersion diff --git a/pom.xml b/pom.xml index a8e32f12c..d407148a3 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,7 @@ ViaVersion 0.4.6 + ViaVersion-${version} org.apache.maven.plugins From ee58fbedbedbd7a8640a4b5d93222136a82835e8 Mon Sep 17 00:00:00 2001 From: gigosaurus Date: Thu, 3 Mar 2016 21:28:40 +0000 Subject: [PATCH 19/31] Fix some MalformedJsonExceptions This should fix the last possible cause of issue #70 --- .../transformers/OutgoingTransformer.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 38cec131f..6f3dedbbe 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -115,6 +115,55 @@ public class OutgoingTransformer { output.writeBytes(input); return; } + if (packet == PacketType.PLAY_PLAYER_LIST_ITEM) { + int action = readVarInt(input); + writeVarInt(action, output); + int players = readVarInt(input); + writeVarInt(players, output); + + // loop through players + for (int i = 0; i < players; i++) { + UUID uuid = readUUID(input); + writeUUID(uuid, output); + if (action == 0) { // add player + writeString(readString(input), output); // name + + int properties = readVarInt(input); + writeVarInt(properties, output); + + // loop through properties + for (int j = 0; j < properties; j++) { + writeString(readString(input), output); // name + writeString(readString(input), output); // value + boolean isSigned = input.readBoolean(); + output.writeBoolean(isSigned); + if (isSigned) { + writeString(readString(input), output); // signature + } + } + + writeVarInt(readVarInt(input), output); // gamemode + writeVarInt(readVarInt(input), output); // ping + boolean hasDisplayName = input.readBoolean(); + output.writeBoolean(hasDisplayName); + if (hasDisplayName) { + writeString(fixJson(readString(input)), output); // display name + } + } else if ((action == 1) || (action == 2)) { // update gamemode || update latency + writeVarInt(readVarInt(input), output); + } else if (action == 3) { // update display name + boolean hasDisplayName = input.readBoolean(); + output.writeBoolean(hasDisplayName); + if (hasDisplayName) { + writeString(fixJson(readString(input)), output); // display name + } + } else if (action == 4) { // remove player + // no fields + } + } + + return; + } if (packet == PacketType.PLAY_PLAYER_LIST_HEADER_FOOTER) { String header = readString(input); String footer = readString(input); From d7b7c4916a40dd3abaf60c918b3177d683dd3fdd Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 22:01:49 +0000 Subject: [PATCH 20/31] Read any remaining bytes, not sure if this fixes any errors but we ideally should to prevent issues. --- src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index 8f4d4b7d6..590a9539a 100644 --- a/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -31,6 +31,7 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { ByteBuf newPacket = ctx.alloc().buffer(); try { incomingTransformer.transform(id, bytebuf, newPacket); + bytebuf.readBytes(bytebuf.readableBytes()); bytebuf = newPacket; } catch (CancelException e) { bytebuf.readBytes(bytebuf.readableBytes()); From be6245e6937e01790b24490d023c6c7d468343ee Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 22:46:17 +0000 Subject: [PATCH 21/31] Bump version 0.4.7 --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b9b722ee7..9fd64cfa5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ViaVersion 0.4.6 +# ViaVersion 0.4.7 **Allows the connection of 1.8 clients to 1.9** This plugin modifies netty to allow connection of 1.9 clients to 1.8, diff --git a/pom.xml b/pom.xml index d407148a3..48f55e744 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ us.myles ViaVersion - 0.4.6 + 0.4.7 ViaVersion-${version} From 27046119774192ebad1c6c05f98b5adacf74ccab Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 22:48:17 +0000 Subject: [PATCH 22/31] Cancel sounds properly, fixes block placing issue on bungee. Updated version to 0.4.8 --- README.md | 4 ++-- pom.xml | 2 +- .../us/myles/ViaVersion/transformers/IncomingTransformer.java | 2 +- .../us/myles/ViaVersion/transformers/OutgoingTransformer.java | 4 +--- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9fd64cfa5..7cdf42533 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ViaVersion 0.4.7 +# ViaVersion 0.4.8 **Allows the connection of 1.8 clients to 1.9** This plugin modifies netty to allow connection of 1.9 clients to 1.8, @@ -9,7 +9,7 @@ This plugin modifies netty to allow connection of 1.9 clients to 1.8, Attempt to make boats nicer when they don't work -Remap spawn eggs +Remap potions If you have a bug with entities, please report the full stack trace diff --git a/pom.xml b/pom.xml index 48f55e744..c5a42fc15 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ us.myles ViaVersion - 0.4.7 + 0.4.8 ViaVersion-${version} diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index 52179f694..a625595a2 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -204,7 +204,7 @@ public class IncomingTransformer { // write item in hand ItemStack inHand = ViaVersionPlugin.getHandItem(info); try { - us.myles.ViaVersion.slot.ItemSlotRewriter.ItemStack item = us.myles.ViaVersion.slot.ItemSlotRewriter.ItemStack.fromBukkit(inHand); + ItemSlotRewriter.ItemStack item = ItemSlotRewriter.ItemStack.fromBukkit(inHand); ItemSlotRewriter.fixIdsFrom1_9To1_8(item); ItemSlotRewriter.writeItemStack(item, output); } catch (Exception e) { diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 6f3dedbbe..79b593799 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -65,9 +65,7 @@ public class OutgoingTransformer { String newname = name; if (effect != null) { if (effect.isBreakPlaceSound()) { - input.readBytes(input.readableBytes()); - output.clear(); - return; + throw new CancelException(); } catid = effect.getCategory().getId(); newname = effect.getNewName(); From a42b11361883fa06a95442877019275a8882436f Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 3 Mar 2016 23:40:09 +0000 Subject: [PATCH 23/31] Use new JSONParsers or they all implode. --- .../ViaVersion/transformers/OutgoingTransformer.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 79b593799..b08c40a9c 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -26,8 +26,6 @@ import java.util.*; import static us.myles.ViaVersion.util.PacketUtil.*; public class OutgoingTransformer { - private static JSONParser parser = new JSONParser(); - private final ConnectionInfo info; private final ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); private boolean cancel = false; @@ -240,7 +238,7 @@ public class OutgoingTransformer { if (packet == PacketType.STATUS_RESPONSE) { String original = PacketUtil.readString(input); try { - JSONObject json = (JSONObject) parser.parse(original); + JSONObject json = (JSONObject) new JSONParser().parse(original); JSONObject version = (JSONObject) json.get("version"); version.put("protocol", info.getProtocol()); PacketUtil.writeString(json.toJSONString(), output); @@ -597,9 +595,9 @@ public class OutgoingTransformer { line = "{\"text\":" + line + "}"; } try { - parser.parse(line); - } catch (org.json.simple.parser.ParseException e) { - System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github!"); + new JSONParser().parse(line); + } catch (Exception e) { + System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github: " + e.getMessage()); return "{\"text\":\"\"}"; } return line; From 0aa190353e9c9eb83fa640fc3e895bf5a5779d38 Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 4 Mar 2016 01:01:04 +0000 Subject: [PATCH 24/31] Add potions, including splash. --- .../ViaVersion/slot/ItemSlotRewriter.java | 257 ++++++++++++------ 1 file changed, 181 insertions(+), 76 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java b/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java index 0861d9656..f3c7c912c 100644 --- a/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java +++ b/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java @@ -1,18 +1,16 @@ package us.myles.ViaVersion.slot; +import io.netty.buffer.ByteBuf; +import org.bukkit.Material; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import org.spacehq.opennbt.tag.builtin.StringTag; +import us.myles.ViaVersion.CancelException; +import us.myles.ViaVersion.util.PacketUtil; + import java.io.IOException; import java.util.HashMap; import java.util.Map; -import org.bukkit.Material; -import org.spacehq.opennbt.tag.builtin.CompoundTag; -import org.spacehq.opennbt.tag.builtin.StringTag; - -import io.netty.buffer.ByteBuf; - -import us.myles.ViaVersion.CancelException; -import us.myles.ViaVersion.util.PacketUtil; - public class ItemSlotRewriter { public static void rewrite1_9To1_8(ByteBuf input, ByteBuf output) throws CancelException { @@ -48,7 +46,35 @@ public class ItemSlotRewriter { CompoundTag entityTag = tag.get("EntityTag"); if (entityTag.get("id") instanceof StringTag) { StringTag id = entityTag.get("id"); - data = ENTTIY_NAME_TO_ID.get(id.getValue()); + if (ENTTIY_NAME_TO_ID.containsKey(id.getValue())) + data = ENTTIY_NAME_TO_ID.get(id.getValue()); + } + } + item.tag = null; + item.data = (short) data; + } + if (item.id == Material.POTION.getId()) { + CompoundTag tag = item.tag; + int data = 0; + if (tag != null && tag.get("Potion") instanceof StringTag) { + StringTag potion = tag.get("Potion"); + String potionName = potion.getValue().replace("minecraft:", ""); + if (POTION_NAME_TO_ID.containsKey(potionName)) { + data = POTION_NAME_TO_ID.get(potionName); + } + } + item.tag = null; + item.data = (short) data; + } + if (item.id == 438) { + CompoundTag tag = item.tag; + int data = 0; + item.id = (short) Material.POTION.getId(); + if (tag != null && tag.get("Potion") instanceof StringTag) { + StringTag potion = tag.get("Potion"); + String potionName = potion.getValue().replace("minecraft:", ""); + if (POTION_NAME_TO_ID.containsKey(potionName)) { + data = POTION_NAME_TO_ID.get(potionName) + 8192; } } item.tag = null; @@ -65,9 +91,28 @@ public class ItemSlotRewriter { tag = new CompoundTag("tag"); } CompoundTag entityTag = new CompoundTag("EntityTag"); - StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get(Integer.valueOf(item.data))); - entityTag.put(id); - tag.put(entityTag); + if (ENTTIY_ID_TO_NAME.containsKey(Integer.valueOf(item.data))) { + StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get(Integer.valueOf(item.data))); + entityTag.put(id); + tag.put(entityTag); + } + item.tag = tag; + item.data = 0; + } + if (item.id == Material.POTION.getId()) { + CompoundTag tag = item.tag; + if (tag == null) { + tag = new CompoundTag("tag"); + } + if(item.data >= 16384){ + item.id = 438; // splash id + item.data = (short) (item.data - 8192); + } + if (POTION_ID_TO_NAME.containsKey(Integer.valueOf(item.data))) { + String name = POTION_ID_TO_NAME.get(Integer.valueOf(item.data)); + StringTag potion = new StringTag("Potion", "minecraft:" + name); + tag.put(potion); + } item.tag = tag; item.data = 0; } @@ -119,73 +164,133 @@ public class ItemSlotRewriter { private static Map ENTTIY_NAME_TO_ID = new HashMap<>(); private static Map ENTTIY_ID_TO_NAME = new HashMap<>(); + private static Map POTION_NAME_TO_ID = new HashMap<>(); + private static Map POTION_ID_TO_NAME = new HashMap<>(); + static { - register(1, "Item"); - register(2, "XPOrb"); - register(7, "ThrownEgg"); - register(8, "LeashKnot"); - register(9, "Painting"); - register(10, "Arrow"); - register(11, "Snowball"); - register(12, "Fireball"); - register(13, "SmallFireball"); - register(14, "ThrownEnderpearl"); - register(15, "EyeOfEnderSignal"); - register(16, "ThrownPotion"); - register(17, "ThrownExpBottle"); - register(18, "ItemFrame"); - register(19, "WitherSkull"); - register(20, "PrimedTnt"); - register(21, "FallingSand"); - register(22, "FireworksRocketEntity"); - register(30, "ArmorStand"); - register(40, "MinecartCommandBlock"); - register(41, "Boat"); - register(42, "MinecartRideable"); - register(43, "MinecartChest"); - register(44, "MinecartFurnace"); - register(45, "MinecartTNT"); - register(46, "MinecartHopper"); - register(47, "MinecartSpawner"); - register(48, "Mob"); - register(49, "Monster"); - register(50, "Creeper"); - register(51, "Skeleton"); - register(52, "Spider"); - register(53, "Giant"); - register(54, "Zombie"); - register(55, "Slime"); - register(56, "Ghast"); - register(57, "PigZombie"); - register(58, "Enderman"); - register(59, "CaveSpider"); - register(60, "Silverfish"); - register(61, "Blaze"); - register(62, "LavaSlime"); - register(63, "EnderDragon"); - register(64, "WitherBoss"); - register(65, "Bat"); - register(66, "Witch"); - register(67, "Endermite"); - register(68, "Guardian"); - register(90, "Pig"); - register(91, "Sheep"); - register(92, "Cow"); - register(93, "Chicken"); - register(94, "Squid"); - register(95, "Wolf"); - register(96, "MushroomCow"); - register(97, "SnowMan"); - register(98, "Ozelot"); - register(99, "VillagerGolem"); - register(100, "EntityHorse"); - register(101, "Rabbit"); - register(120, "Villager"); - register(200, "EnderCrystal"); + /* Entities */ + registerEntity(1, "Item"); + registerEntity(2, "XPOrb"); + registerEntity(7, "ThrownEgg"); + registerEntity(8, "LeashKnot"); + registerEntity(9, "Painting"); + registerEntity(10, "Arrow"); + registerEntity(11, "Snowball"); + registerEntity(12, "Fireball"); + registerEntity(13, "SmallFireball"); + registerEntity(14, "ThrownEnderpearl"); + registerEntity(15, "EyeOfEnderSignal"); + registerEntity(16, "ThrownPotion"); + registerEntity(17, "ThrownExpBottle"); + registerEntity(18, "ItemFrame"); + registerEntity(19, "WitherSkull"); + registerEntity(20, "PrimedTnt"); + registerEntity(21, "FallingSand"); + registerEntity(22, "FireworksRocketEntity"); + registerEntity(30, "ArmorStand"); + registerEntity(40, "MinecartCommandBlock"); + registerEntity(41, "Boat"); + registerEntity(42, "MinecartRideable"); + registerEntity(43, "MinecartChest"); + registerEntity(44, "MinecartFurnace"); + registerEntity(45, "MinecartTNT"); + registerEntity(46, "MinecartHopper"); + registerEntity(47, "MinecartSpawner"); + registerEntity(48, "Mob"); + registerEntity(49, "Monster"); + registerEntity(50, "Creeper"); + registerEntity(51, "Skeleton"); + registerEntity(52, "Spider"); + registerEntity(53, "Giant"); + registerEntity(54, "Zombie"); + registerEntity(55, "Slime"); + registerEntity(56, "Ghast"); + registerEntity(57, "PigZombie"); + registerEntity(58, "Enderman"); + registerEntity(59, "CaveSpider"); + registerEntity(60, "Silverfish"); + registerEntity(61, "Blaze"); + registerEntity(62, "LavaSlime"); + registerEntity(63, "EnderDragon"); + registerEntity(64, "WitherBoss"); + registerEntity(65, "Bat"); + registerEntity(66, "Witch"); + registerEntity(67, "Endermite"); + registerEntity(68, "Guardian"); + registerEntity(90, "Pig"); + registerEntity(91, "Sheep"); + registerEntity(92, "Cow"); + registerEntity(93, "Chicken"); + registerEntity(94, "Squid"); + registerEntity(95, "Wolf"); + registerEntity(96, "MushroomCow"); + registerEntity(97, "SnowMan"); + registerEntity(98, "Ozelot"); + registerEntity(99, "VillagerGolem"); + registerEntity(100, "EntityHorse"); + registerEntity(101, "Rabbit"); + registerEntity(120, "Villager"); + registerEntity(200, "EnderCrystal"); + + /* Potions */ + registerPotion(0, "water"); + registerPotion(64, "mundane"); + registerPotion(32, "thick"); + registerPotion(16, "awkward"); + + registerPotion(8198, "night_vision"); + registerPotion(8262, "long_night_vision"); + + registerPotion(8206, "invisibility"); + registerPotion(8270, "long_invisibility"); + + registerPotion(8203, "leaping"); + registerPotion(8267, "long_leaping"); + registerPotion(8235, "strong_leaping"); + + registerPotion(8195, "fire_resistance"); + registerPotion(8259, "long_fire_resistance"); + + registerPotion(8194, "swiftness"); + registerPotion(8258, "long_swiftness"); + registerPotion(8226, "strong_swiftness"); + + registerPotion(8202, "slowness"); + registerPotion(8266, "long_slowness"); + + registerPotion(8205, "water_breathing"); + registerPotion(8269, "long_water_breathing"); + + registerPotion(8197, "healing"); + registerPotion(8229, "strong_healing"); + + registerPotion(8204, "harming"); + registerPotion(8236, "strong_harming"); + + registerPotion(8196, "poison"); + registerPotion(8260, "long_poison"); + registerPotion(8228, "strong_poison"); + + registerPotion(8193, "regeneration"); + registerPotion(8257, "long_regeneration"); + registerPotion(8225, "strong_regeneration"); + + registerPotion(8201, "strength"); + registerPotion(8265, "long_strength"); + registerPotion(8233, "strong_strength"); + + registerPotion(8200, "weakness"); + registerPotion(8264, "long_weakness"); + } - private static void register(Integer id, String name) { + private static void registerEntity(Integer id, String name) { ENTTIY_ID_TO_NAME.put(id, name); ENTTIY_NAME_TO_ID.put(name, id); } + + private static void registerPotion(Integer id, String name) { + POTION_ID_TO_NAME.put(id, name); + POTION_NAME_TO_ID.put(name, id); + } } From 678a7de664d64f4250abe6f337fa3b33e037e735 Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 4 Mar 2016 01:02:35 +0000 Subject: [PATCH 25/31] Correct README --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 7cdf42533..a4a272119 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,6 @@ This plugin modifies netty to allow connection of 1.9 clients to 1.8, **Don't use late bind* -**As of this point it doesn't have everything, I need to fix:** - -Attempt to make boats nicer when they don't work - -Remap potions - -If you have a bug with entities, please report the full stack trace - This took hours of work, so if you enjoy this consider looking into contacting me and supporting my projects. From 5c180285779cfa3ae3fc4b0f6158bb5b1c94790d Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 4 Mar 2016 08:14:26 +0000 Subject: [PATCH 26/31] Bump version to 0.4.9 --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a4a272119..a87cf2e59 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ViaVersion 0.4.8 +# ViaVersion 0.4.9 **Allows the connection of 1.8 clients to 1.9** This plugin modifies netty to allow connection of 1.9 clients to 1.8, diff --git a/pom.xml b/pom.xml index c5a42fc15..c87afbb2a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ us.myles ViaVersion - 0.4.8 + 0.4.9 ViaVersion-${version} From 1ecf515006d008b03e0214f12395966ce89c6768 Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Fri, 4 Mar 2016 09:58:31 +0100 Subject: [PATCH 27/31] Fixed README formatting. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index a87cf2e59..14a193d5c 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,17 @@ Contributors: -------- **Myself** (harhar) + **Matsv/StamBoom** + **HugoDaBosss** + **SanderGielisse** + **Paulomart** + **gigosaurus** + **fillefilip8** **Chat: ** https://gitter.im/MylesIsCool/ViaVersion From 89311af76abedb31f5e5f65640a81e89f5438ced Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 4 Mar 2016 09:05:05 +0000 Subject: [PATCH 28/31] Small issue with README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a87cf2e59..26bb6ac8d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ViaVersion 0.4.9 -**Allows the connection of 1.8 clients to 1.9** +**Allows the connection of 1.9 clients to 1.8** This plugin modifies netty to allow connection of 1.9 clients to 1.8, From 76c908b1327bc73379ae7298bdb201736e8df6c6 Mon Sep 17 00:00:00 2001 From: fillefilip8 Date: Fri, 4 Mar 2016 10:05:44 +0100 Subject: [PATCH 29/31] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 14a193d5c..b64840faf 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # ViaVersion 0.4.9 -**Allows the connection of 1.8 clients to 1.9** +**Allows the connection of 1.9 clients to 1.8** This plugin modifies netty to allow connection of 1.9 clients to 1.8, -**Don't use late bind* +###**Don't use late bind* This took hours of work, so if you enjoy this consider looking into contacting me and supporting my projects. From 963f02122651982df62bd2d635e00eb77d6a4258 Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 4 Mar 2016 10:04:50 +0000 Subject: [PATCH 30/31] Fix books, also makes ItemSlotRewriter.ItemStack fields public --- .../ViaVersion/slot/ItemSlotRewriter.java | 9 +++--- .../transformers/IncomingTransformer.java | 28 +++++++++++++++++++ .../transformers/OutgoingTransformer.java | 20 +++++++++++-- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java b/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java index f3c7c912c..3a01d3d95 100644 --- a/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java +++ b/src/main/java/us/myles/ViaVersion/slot/ItemSlotRewriter.java @@ -122,6 +122,7 @@ public class ItemSlotRewriter { public static ItemStack readItemStack(ByteBuf input) throws IOException { short id = input.readShort(); if (id < 0) { + return null; } else { ItemStack item = new ItemStack(); @@ -146,10 +147,10 @@ public class ItemSlotRewriter { public static class ItemStack { - private short id; - private byte amount; - private short data; - private CompoundTag tag; + public short id; + public byte amount; + public short data; + public CompoundTag tag; public static ItemStack fromBukkit(org.bukkit.inventory.ItemStack stack) { ItemStack item = new ItemStack(); diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index a625595a2..bc4549e85 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -1,7 +1,13 @@ package us.myles.ViaVersion.transformers; +import com.avaje.ebeaninternal.server.cluster.Packet; import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.bukkit.Material; import org.bukkit.inventory.ItemStack; +import org.spacehq.opennbt.tag.builtin.ListTag; +import org.spacehq.opennbt.tag.builtin.StringTag; +import org.spacehq.opennbt.tag.builtin.Tag; import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; @@ -11,8 +17,10 @@ import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.util.PacketUtil; import us.myles.ViaVersion.util.ReflectionUtil; +import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.nio.charset.Charset; public class IncomingTransformer { private final ConnectionInfo info; @@ -171,6 +179,26 @@ public class IncomingTransformer { } return; } + if(packet == PacketType.PLAY_PLUGIN_MESSAGE_REQUEST) { + String name = PacketUtil.readString(input); + PacketUtil.writeString(name, output); + byte[] b = new byte[input.readableBytes()]; + input.readBytes(b); + // patch books + if(name.equals("MC|BSign")){ + ByteBuf in = Unpooled.wrappedBuffer(b); + try { + ItemSlotRewriter.ItemStack stack = ItemSlotRewriter.readItemStack(in); + stack.id = (short) Material.WRITTEN_BOOK.getId(); + // write + ItemSlotRewriter.writeItemStack(stack, output); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + output.writeBytes(b); + } if (packet == PacketType.PLAY_PLAYER_BLOCK_PLACEMENT) { Long position = input.readLong(); output.writeLong(position); diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index b08c40a9c..72824ae18 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -1,20 +1,25 @@ package us.myles.ViaVersion.transformers; import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.spacehq.mc.protocol.data.game.chunk.Column; import org.spacehq.mc.protocol.util.NetUtil; +import org.spacehq.opennbt.tag.builtin.ListTag; +import org.spacehq.opennbt.tag.builtin.StringTag; +import org.spacehq.opennbt.tag.builtin.Tag; import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; -import us.myles.ViaVersion.slot.ItemSlotRewriter; import us.myles.ViaVersion.metadata.MetadataRewriter; import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.packets.State; +import us.myles.ViaVersion.slot.ItemSlotRewriter; import us.myles.ViaVersion.sounds.SoundEffect; import us.myles.ViaVersion.util.EntityUtil; import us.myles.ViaVersion.util.PacketUtil; @@ -96,6 +101,17 @@ public class OutgoingTransformer { output.writeInt(vehicle); return; } + if (packet == PacketType.PLAY_PLUGIN_MESSAGE) { + String name = PacketUtil.readString(input); + PacketUtil.writeString(name, output); + byte[] b = new byte[input.readableBytes()]; + input.readBytes(b); + // patch books + if(name.equals("MC|BOpen")){ + PacketUtil.writeVarInt(0, output); + } + output.writeBytes(b); + } if (packet == PacketType.PLAY_DISCONNECT) { String reason = readString(input); writeString(fixJson(reason), output); @@ -271,7 +287,7 @@ public class OutgoingTransformer { slot += 1; // add 1 so it's now 2-5 } PacketUtil.writeVarInt(slot, output); - + ItemSlotRewriter.rewrite1_8To1_9(input, output); return; } From 12df86a14277671dfe162b832cc1101610e7aab0 Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 4 Mar 2016 10:09:06 +0000 Subject: [PATCH 31/31] As per wiki.vg only unload if bitmask = 0 and full chunk (not sure if this fixes chunk issue) --- .../us/myles/ViaVersion/transformers/OutgoingTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 72824ae18..9609fc1f5 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -564,7 +564,7 @@ public class OutgoingTransformer { int bitMask = input.readUnsignedShort(); - if (bitMask == 0) { + if (bitMask == 0 && groundUp) { output.clear(); PacketUtil.writeVarInt(PacketType.PLAY_UNLOAD_CHUNK.getNewPacketID(), output); output.writeInt(chunkX);