From b0050d4a8df6deebd8c26f8df4ca3be120adddb1 Mon Sep 17 00:00:00 2001 From: Myles Date: Wed, 9 Mar 2016 12:08:21 +0000 Subject: [PATCH] Add config option for blocking and fix crash due to synchronization --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 24 ++++++++++++------- .../transformers/IncomingTransformer.java | 9 +++---- .../transformers/OutgoingTransformer.java | 21 ++++++++-------- src/main/resources/config.yml | 4 +++- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 28c48df12..3a756d430 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -116,23 +116,27 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { if (connection != null) { for (Field field : connection.getClass().getDeclaredFields()) { field.setAccessible(true); - Object value = field.get(connection); + final Object value = field.get(connection); if (value instanceof List) { // Inject the list field.set(connection, new ListWrapper((List) value) { @Override public void handleAdd(Object o) { - if (o instanceof ChannelFuture) { - inject((ChannelFuture) o); + synchronized (value) { + if (o instanceof ChannelFuture) { + inject((ChannelFuture) o); + } } } }); // Iterate through current list - for (Object o : (List) value) { - if (o instanceof ChannelFuture) { - inject((ChannelFuture) o); - } else { - break; // not the right list. + synchronized (value) { + for (Object o : (List) value) { + if (o instanceof ChannelFuture) { + inject((ChannelFuture) o); + } else { + break; // not the right list. + } } } } @@ -221,6 +225,10 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { return getConfig().getBoolean("suppress-metadata-errors", false); } + public boolean isShieldBlocking() { + return getConfig().getBoolean("shield-blocking", true); + } + public boolean isAutoTeam() { // Collision has to be enabled first if (!isPreventCollision()) return false; diff --git a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java index 67c5a6d11..5ece3646b 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/IncomingTransformer.java @@ -16,6 +16,7 @@ import us.myles.ViaVersion.util.PacketUtil; import java.io.IOException; public class IncomingTransformer { + private final ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); private final ConnectionInfo info; private boolean startedBlocking = false; @@ -34,7 +35,7 @@ public class IncomingTransformer { if (packet.getPacketID() != -1) { packetID = packet.getPacketID(); } - if (ViaVersion.getInstance().isDebug()) { + if (plugin.isDebug()) { if (packet != PacketType.PLAY_PLAYER_POSITION_LOOK_REQUEST && packet != PacketType.PLAY_KEEP_ALIVE_REQUEST && packet != PacketType.PLAY_PLAYER_POSITION_REQUEST && packet != PacketType.PLAY_PLAYER_LOOK_REQUEST) { System.out.println("Direction " + packet.getDirection().name() + " Packet Type: " + packet + " New ID: " + packetID + " Original: " + original + " Size: " + input.readableBytes()); } @@ -267,7 +268,7 @@ public class IncomingTransformer { output.writeByte(face); PacketUtil.readVarInt(input); - ItemStack inHand = ViaVersionPlugin.getHandItem(info); + ItemStack inHand = plugin.getHandItem(info); try { ItemSlotRewriter.ItemStack item = ItemSlotRewriter.ItemStack.fromBukkit(inHand); ItemSlotRewriter.fixIdsFrom1_9To1_8(item); @@ -291,8 +292,8 @@ public class IncomingTransformer { output.writeLong(-1L); output.writeByte(255); // write item in hand - ItemStack inHand = ViaVersionPlugin.getHandItem(info); - if (inHand != null) { + ItemStack inHand = plugin.getHandItem(info); + if (inHand != null && plugin.isShieldBlocking()) { if (inHand.getType().name().endsWith("SWORD")) { // blocking? if (hand == 0) { diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index fc1c315bd..f1369429b 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -830,17 +830,18 @@ public class OutgoingTransformer { if (entry.getOldID() == 0) { // Byte byte data = (byte) entry.getValue(); - - if ((data & 0x10) == 0x10) { - if (validBlocking.contains(entityID)) { - ItemSlotRewriter.ItemStack shield = new ItemSlotRewriter.ItemStack(); - shield.id = 442; - shield.amount = 1; - shield.data = 0; - sendSecondHandItem(entityID, shield); + if (entityID != info.getEntityID() && plugin.isShieldBlocking()) { + if ((data & 0x10) == 0x10) { + if (validBlocking.contains(entityID)) { + ItemSlotRewriter.ItemStack shield = new ItemSlotRewriter.ItemStack(); + shield.id = 442; + shield.amount = 1; + shield.data = 0; + sendSecondHandItem(entityID, shield); + } + } else { + sendSecondHandItem(entityID, null); } - } else { - sendSecondHandItem(entityID, null); } } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a442449ca..c5cd024c6 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -9,4 +9,6 @@ prevent-collision: true # If the above is true, should we automatically team players until you do? auto-team: true # When enabled if certain metadata can't be read we won't tell you about it -suppress-metadata-errors: false \ No newline at end of file +suppress-metadata-errors: false +# When enabled 1.9 will be able to block by using shields +shield-blocking: true \ No newline at end of file