3
0
Mirror von https://github.com/ViaVersion/ViaVersion.git synchronisiert 2024-12-26 16:12:42 +01:00

Add it so when you're on 1.9 you can block using shields. Also change ConnectionInfo to use lombok.

Dieser Commit ist enthalten in:
Myles 2016-03-07 22:21:32 +00:00
Ursprung 75db62ee6f
Commit 67bad0dec8
3 geänderte Dateien mit 102 neuen und 79 gelöschten Zeilen

Datei anzeigen

@ -1,14 +1,16 @@
package us.myles.ViaVersion; package us.myles.ViaVersion;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.*; import io.netty.channel.ChannelHandler;
import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.SocketChannel;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.packets.State;
import java.util.UUID; @Getter
@Setter
public class ConnectionInfo { public class ConnectionInfo {
private final SocketChannel channel; private final SocketChannel channel;
private Object lastPacket; private Object lastPacket;
@ -17,6 +19,7 @@ public class ConnectionInfo {
private String openWindow; private String openWindow;
private int protocol = 0; private int protocol = 0;
private int compression = 0; private int compression = 0;
private int entityID;
private boolean active = true; private boolean active = true;
private String username; private String username;
@ -24,64 +27,19 @@ public class ConnectionInfo {
this.channel = socketChannel; this.channel = socketChannel;
} }
public int getProtocol() {
return protocol;
}
public void setProtocol(int protocol) {
this.protocol = protocol;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public int getCompression() {
return compression;
}
public void setCompression(int compression) {
this.compression = compression;
}
public Object getLastPacket() {
return lastPacket;
}
public void setLastPacket(Object lastPacket) {
this.lastPacket = lastPacket;
}
public java.util.UUID getUUID() {
return UUID;
}
public void setUUID(UUID UUID) {
this.UUID = UUID;
}
public Player getPlayer() { public Player getPlayer() {
return UUID == null ? null : Bukkit.getPlayer(UUID); return UUID == null ? null : Bukkit.getPlayer(UUID);
} }
public SocketChannel getChannel() {
return channel;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) { public void setActive(boolean active) {
this.active = active; this.active = active;
} }
public void sendRawPacket(final ByteBuf packet) { public void sendRawPacket(final ByteBuf packet, boolean currentThread) {
final ChannelHandler handler = channel.pipeline().get("encoder"); final ChannelHandler handler = channel.pipeline().get("encoder");
if (currentThread) {
channel.pipeline().context(handler).writeAndFlush(packet);
} else {
channel.eventLoop().submit(new Runnable() { channel.eventLoop().submit(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -89,24 +47,13 @@ public class ConnectionInfo {
} }
}); });
} }
public String getOpenWindow() {
return openWindow;
} }
public void setOpenWindow(String openWindow) { public void sendRawPacket(final ByteBuf packet) {
this.openWindow = openWindow; sendRawPacket(packet, false);
} }
public void closeWindow() { public void closeWindow() {
this.openWindow = null; this.openWindow = null;
} }
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
} }

Datei anzeigen

@ -17,6 +17,7 @@ import java.io.IOException;
public class IncomingTransformer { public class IncomingTransformer {
private final ConnectionInfo info; private final ConnectionInfo info;
private boolean startedBlocking = false;
public IncomingTransformer(ConnectionInfo info) { public IncomingTransformer(ConnectionInfo info) {
this.info = info; this.info = info;
@ -87,6 +88,11 @@ public class IncomingTransformer {
} }
if (packet == PacketType.PLAY_PLAYER_DIGGING) { if (packet == PacketType.PLAY_PLAYER_DIGGING) {
int status = input.readByte() & 0xFF; // unsign int status = input.readByte() & 0xFF; // unsign
if (status == 5 && startedBlocking) {
// stopped blocking
startedBlocking = false;
sendSecondHandItem(null);
}
if (status == 6) { // item swap if (status == 6) { // item swap
throw new CancelException(); throw new CancelException();
} }
@ -95,6 +101,13 @@ public class IncomingTransformer {
output.writeBytes(input); output.writeBytes(input);
return; return;
} }
if (packet == PacketType.PLAY_HELD_ITEM_CHANGE_REQUEST) {
if (startedBlocking) {
// stopped blocking
startedBlocking = false;
sendSecondHandItem(null);
}
}
if (packet == PacketType.PLAY_CLICK_WINDOW) { if (packet == PacketType.PLAY_CLICK_WINDOW) {
// if placed in new slot, reject :) // if placed in new slot, reject :)
int windowID = input.readUnsignedByte(); int windowID = input.readUnsignedByte();
@ -268,6 +281,7 @@ public class IncomingTransformer {
return; return;
} }
if (packet == PacketType.PLAY_USE_ITEM) { if (packet == PacketType.PLAY_USE_ITEM) {
int hand = PacketUtil.readVarInt(input);
output.clear(); output.clear();
PacketUtil.writeVarInt(PacketType.PLAY_PLAYER_BLOCK_PLACEMENT.getPacketID(), output); PacketUtil.writeVarInt(PacketType.PLAY_PLAYER_BLOCK_PLACEMENT.getPacketID(), output);
// Simulate using item :) // Simulate using item :)
@ -275,6 +289,22 @@ public class IncomingTransformer {
output.writeByte(255); output.writeByte(255);
// write item in hand // write item in hand
ItemStack inHand = ViaVersionPlugin.getHandItem(info); ItemStack inHand = ViaVersionPlugin.getHandItem(info);
if (inHand != null) {
if (inHand.getType().name().endsWith("SWORD")) {
// blocking?
if (hand == 0) {
if (!startedBlocking) {
startedBlocking = true;
ItemSlotRewriter.ItemStack shield = new ItemSlotRewriter.ItemStack();
shield.id = 442;
shield.amount = 1;
shield.data = 0;
sendSecondHandItem(shield);
}
throw new CancelException();
}
}
}
try { try {
ItemSlotRewriter.ItemStack item = ItemSlotRewriter.ItemStack.fromBukkit(inHand); ItemSlotRewriter.ItemStack item = ItemSlotRewriter.ItemStack.fromBukkit(inHand);
ItemSlotRewriter.fixIdsFrom1_9To1_8(item); ItemSlotRewriter.fixIdsFrom1_9To1_8(item);
@ -296,4 +326,18 @@ public class IncomingTransformer {
} }
output.writeBytes(input); output.writeBytes(input);
} }
private void sendSecondHandItem(ItemSlotRewriter.ItemStack o) {
ByteBuf buf = info.getChannel().alloc().buffer();
PacketUtil.writeVarInt(PacketType.PLAY_ENTITY_EQUIPMENT.getNewPacketID(), buf);
PacketUtil.writeVarInt(info.getEntityID(), buf);
PacketUtil.writeVarInt(1, buf); // slot
// write shield
try {
ItemSlotRewriter.writeItemStack(o, buf);
} catch (IOException e) {
e.printStackTrace();
}
info.sendRawPacket(buf);
}
} }

Datei anzeigen

@ -1,15 +1,12 @@
package us.myles.ViaVersion.transformers; package us.myles.ViaVersion.transformers;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import io.netty.buffer.ByteBufOutputStream;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
import org.spacehq.mc.protocol.data.game.chunk.Column; import org.spacehq.mc.protocol.data.game.chunk.Column;
import org.spacehq.mc.protocol.util.NetUtil; import org.spacehq.mc.protocol.util.NetUtil;
import org.spacehq.opennbt.NBTIO;
import org.spacehq.opennbt.tag.builtin.ByteTag; import org.spacehq.opennbt.tag.builtin.ByteTag;
import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.CompoundTag;
import org.spacehq.opennbt.tag.builtin.StringTag; import org.spacehq.opennbt.tag.builtin.StringTag;
@ -26,8 +23,6 @@ import us.myles.ViaVersion.util.EntityUtil;
import us.myles.ViaVersion.util.PacketUtil; import us.myles.ViaVersion.util.PacketUtil;
import us.myles.ViaVersion.util.ReflectionUtil; import us.myles.ViaVersion.util.ReflectionUtil;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
@ -566,6 +561,7 @@ public class OutgoingTransformer {
if (packet == PacketType.PLAY_JOIN_GAME) { if (packet == PacketType.PLAY_JOIN_GAME) {
int id = input.readInt(); int id = input.readInt();
clientEntityTypes.put(id, EntityType.PLAYER); clientEntityTypes.put(id, EntityType.PLAYER);
info.setEntityID(id);
output.writeInt(id); output.writeInt(id);
output.writeBytes(input); output.writeBytes(input);
return; return;
@ -798,9 +794,31 @@ public class OutgoingTransformer {
return; return;
} }
List<MetadataRewriter.Entry> list = MetadataRewriter.readMetadata1_8(type, input); List<MetadataRewriter.Entry> list = MetadataRewriter.readMetadata1_8(type, input);
for (MetadataRewriter.Entry entry : list) {
handleMetadata(entityID, entry, type);
}
MetadataRewriter.writeMetadata1_9(type, list, output); MetadataRewriter.writeMetadata1_9(type, list, output);
} }
private void handleMetadata(int entityID, MetadataRewriter.Entry entry, EntityType type) {
// This handles old IDs
if (type == EntityType.PLAYER) {
if (entry.getOldID() == 0) {
// Byte
byte data = (byte) entry.getValue();
if ((data & 0x10) == 0x10) {
ItemSlotRewriter.ItemStack shield = new ItemSlotRewriter.ItemStack();
shield.id = 442;
shield.amount = 1;
shield.data = 0;
sendSecondHandItem(entityID, shield);
} else {
sendSecondHandItem(entityID, null);
}
}
}
}
private UUID getUUID(int id) { private UUID getUUID(int id) {
if (uuidMap.containsKey(id)) { if (uuidMap.containsKey(id)) {
@ -812,4 +830,18 @@ public class OutgoingTransformer {
} }
} }
private void sendSecondHandItem(int entityID, ItemSlotRewriter.ItemStack o) {
ByteBuf buf = info.getChannel().alloc().buffer();
PacketUtil.writeVarInt(PacketType.PLAY_ENTITY_EQUIPMENT.getNewPacketID(), buf);
PacketUtil.writeVarInt(entityID, buf);
PacketUtil.writeVarInt(1, buf); // slot
// write shield
try {
ItemSlotRewriter.writeItemStack(o, buf);
} catch (IOException e) {
e.printStackTrace();
}
info.sendRawPacket(buf, true);
}
} }