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:
Ursprung
75db62ee6f
Commit
67bad0dec8
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren