Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-27 08:30:09 +01:00
Commit
80f84d4001
@ -1,4 +1,4 @@
|
|||||||
# ViaVersion 1.5.0 - Spigot, Sponge, BungeeCord
|
# ViaVersion 1.5.2 - Spigot, Sponge, BungeeCord
|
||||||
[![Build Status](https://travis-ci.org/MylesIsCool/ViaVersion.svg?branch=master)](https://travis-ci.org/MylesIsCool/ViaVersion)
|
[![Build Status](https://travis-ci.org/MylesIsCool/ViaVersion.svg?branch=master)](https://travis-ci.org/MylesIsCool/ViaVersion)
|
||||||
[![Discord](https://img.shields.io/badge/chat-on%20discord-blue.svg)](https://viaversion.com/discord)
|
[![Discord](https://img.shields.io/badge/chat-on%20discord-blue.svg)](https://viaversion.com/discord)
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>viaversion-parent</artifactId>
|
<artifactId>viaversion-parent</artifactId>
|
||||||
<groupId>us.myles</groupId>
|
<groupId>us.myles</groupId>
|
||||||
<version>1.5.1-SNAPSHOT</version>
|
<version>1.5.3-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -14,8 +14,6 @@ public class HandItemCache extends BukkitRunnable {
|
|||||||
private static Map<UUID, Item> handCache = new ConcurrentHashMap<>();
|
private static Map<UUID, Item> handCache = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public static Item getHandItem(UUID player) {
|
public static Item getHandItem(UUID player) {
|
||||||
if (!handCache.containsKey(player))
|
|
||||||
return null;
|
|
||||||
return handCache.get(player);
|
return handCache.get(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>viaversion-parent</artifactId>
|
<artifactId>viaversion-parent</artifactId>
|
||||||
<groupId>us.myles</groupId>
|
<groupId>us.myles</groupId>
|
||||||
<version>1.5.1-SNAPSHOT</version>
|
<version>1.5.3-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -27,16 +27,19 @@ public class ProtocolDetectorService implements Runnable {
|
|||||||
public static Integer getProtocolId(String serverName) {
|
public static Integer getProtocolId(String serverName) {
|
||||||
// Step 1. Check Config
|
// Step 1. Check Config
|
||||||
Map<String, Integer> servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols();
|
Map<String, Integer> servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols();
|
||||||
if (servers.containsKey(serverName)) {
|
Integer protocol = servers.get(serverName);
|
||||||
return servers.get(serverName);
|
if (protocol != null) {
|
||||||
|
return protocol;
|
||||||
}
|
}
|
||||||
// Step 2. Check Detected
|
// Step 2. Check Detected
|
||||||
if (detectedProtocolIds.containsKey(serverName)) {
|
Integer detectedProtocol = detectedProtocolIds.get(serverName);
|
||||||
return detectedProtocolIds.get(serverName);
|
if (detectedProtocol != null) {
|
||||||
|
return detectedProtocol;
|
||||||
}
|
}
|
||||||
// Step 3. Use Default
|
// Step 3. Use Default
|
||||||
if (servers.containsKey("default")) {
|
Integer defaultProtocol = servers.get("default");
|
||||||
return servers.get("default");
|
if (defaultProtocol != null) {
|
||||||
|
return defaultProtocol;
|
||||||
}
|
}
|
||||||
// Step 4: Use bungee lowest supported... *cries*
|
// Step 4: Use bungee lowest supported... *cries*
|
||||||
return BungeeVersionProvider.getLowestSupportedVersion();
|
return BungeeVersionProvider.getLowestSupportedVersion();
|
||||||
@ -58,10 +61,9 @@ public class ProtocolDetectorService implements Runnable {
|
|||||||
detectedProtocolIds.put(key, serverPing.getVersion().getProtocol());
|
detectedProtocolIds.put(key, serverPing.getVersion().getProtocol());
|
||||||
if (((BungeeConfigAPI) Via.getConfig()).isBungeePingSave()) {
|
if (((BungeeConfigAPI) Via.getConfig()).isBungeePingSave()) {
|
||||||
Map<String, Integer> servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols();
|
Map<String, Integer> servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols();
|
||||||
if (servers.containsKey(key)) {
|
Integer protocol = servers.get(key);
|
||||||
if (servers.get(key) == serverPing.getVersion().getProtocol()) {
|
if (protocol != null && protocol == serverPing.getVersion().getProtocol()) {
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Ensure we're the only ones writing to the config
|
// Ensure we're the only ones writing to the config
|
||||||
synchronized (Via.getPlatform().getConfigurationProvider()) {
|
synchronized (Via.getPlatform().getConfigurationProvider()) {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>viaversion-parent</artifactId>
|
<artifactId>viaversion-parent</artifactId>
|
||||||
<groupId>us.myles</groupId>
|
<groupId>us.myles</groupId>
|
||||||
<version>1.5.1-SNAPSHOT</version>
|
<version>1.5.3-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
@ -330,7 +330,7 @@ public class PacketWrapper {
|
|||||||
resetReader();
|
resetReader();
|
||||||
|
|
||||||
// Apply other protocols
|
// Apply other protocols
|
||||||
apply(Direction.OUTGOING, user().get(ProtocolInfo.class).getState(), index, protocols);
|
apply(direction, user().get(ProtocolInfo.class).getState(), index, protocols);
|
||||||
// Send
|
// Send
|
||||||
ByteBuf output = inputBuffer == null ? user().getChannel().alloc().buffer() : inputBuffer.alloc().buffer();
|
ByteBuf output = inputBuffer == null ? user().getChannel().alloc().buffer() : inputBuffer.alloc().buffer();
|
||||||
writeToBuffer(output);
|
writeToBuffer(output);
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package us.myles.ViaVersion.api.minecraft.metadata.types;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.MetaType;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.Protocol1_13_2To1_13_1;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public enum MetaType1_13_2 implements MetaType {
|
||||||
|
Byte(0, Type.BYTE),
|
||||||
|
VarInt(1, Type.VAR_INT),
|
||||||
|
Float(2, Type.FLOAT),
|
||||||
|
String(3, Type.STRING),
|
||||||
|
Chat(4, Type.STRING),
|
||||||
|
OptChat(5, Type.OPTIONAL_CHAT),
|
||||||
|
Slot(6, Type.FLAT_VAR_INT_ITEM),
|
||||||
|
Boolean(7, Type.BOOLEAN),
|
||||||
|
Vector3F(8, Type.ROTATION),
|
||||||
|
Position(9, Type.POSITION),
|
||||||
|
OptPosition(10, Type.OPTIONAL_POSITION),
|
||||||
|
Direction(11, Type.VAR_INT),
|
||||||
|
OptUUID(12, Type.OPTIONAL_UUID),
|
||||||
|
BlockID(13, Type.VAR_INT),
|
||||||
|
NBTTag(14, Type.NBT),
|
||||||
|
PARTICLE(15, Protocol1_13_2To1_13_1.PARTICLE_TYPE),
|
||||||
|
Discontinued(99, null);
|
||||||
|
|
||||||
|
private final int typeID;
|
||||||
|
private final Type type;
|
||||||
|
|
||||||
|
public static MetaType1_13_2 byId(int id) {
|
||||||
|
return values()[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,15 +18,14 @@ public class ViaProviders {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <T extends Provider> void use(Class<T> provider, T value) {
|
public <T extends Provider> void use(Class<T> provider, T value) {
|
||||||
if (lonelyProviders.contains(provider)) {
|
lonelyProviders.remove(provider);
|
||||||
lonelyProviders.remove(provider);
|
|
||||||
}
|
|
||||||
providers.put(provider, value);
|
providers.put(provider, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends Provider> T get(Class<T> provider) {
|
public <T extends Provider> T get(Class<T> provider) {
|
||||||
if (providers.containsKey(provider)) {
|
Provider rawProvider = providers.get(provider);
|
||||||
return (T) providers.get(provider);
|
if (rawProvider != null) {
|
||||||
|
return (T) rawProvider;
|
||||||
} else {
|
} else {
|
||||||
if (lonelyProviders.contains(provider)) {
|
if (lonelyProviders.contains(provider)) {
|
||||||
throw new IllegalStateException("There was no provider for " + provider + ", one is required!");
|
throw new IllegalStateException("There was no provider for " + provider + ", one is required!");
|
||||||
|
@ -137,10 +137,8 @@ public abstract class Protocol {
|
|||||||
public void transform(Direction direction, State state, PacketWrapper packetWrapper) throws Exception {
|
public void transform(Direction direction, State state, PacketWrapper packetWrapper) throws Exception {
|
||||||
Pair<State, Integer> statePacket = new Pair<>(state, packetWrapper.getId());
|
Pair<State, Integer> statePacket = new Pair<>(state, packetWrapper.getId());
|
||||||
Map<Pair<State, Integer>, ProtocolPacket> packetMap = (direction == Direction.OUTGOING ? outgoing : incoming);
|
Map<Pair<State, Integer>, ProtocolPacket> packetMap = (direction == Direction.OUTGOING ? outgoing : incoming);
|
||||||
ProtocolPacket protocolPacket;
|
ProtocolPacket protocolPacket = packetMap.get(statePacket);
|
||||||
if (packetMap.containsKey(statePacket)) {
|
if (protocolPacket == null) {
|
||||||
protocolPacket = packetMap.get(statePacket);
|
|
||||||
} else {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// write packet id
|
// write packet id
|
||||||
|
@ -13,6 +13,7 @@ import us.myles.ViaVersion.protocols.protocol1_11to1_10.Protocol1_11To1_10;
|
|||||||
import us.myles.ViaVersion.protocols.protocol1_12_1to1_12.Protocol1_12_1TO1_12;
|
import us.myles.ViaVersion.protocols.protocol1_12_1to1_12.Protocol1_12_1TO1_12;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_12_2to1_12_1.Protocol1_12_2TO1_12_1;
|
import us.myles.ViaVersion.protocols.protocol1_12_2to1_12_1.Protocol1_12_2TO1_12_1;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.Protocol1_12To1_11_1;
|
import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.Protocol1_12To1_11_1;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.Protocol1_13_2To1_13_1;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.Protocol1_13To1_12_2;
|
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.Protocol1_13To1_12_2;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.Protocol1_9_1_2TO1_9_3_4;
|
import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.Protocol1_9_1_2TO1_9_3_4;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9_1to1_9.Protocol1_9_1TO1_9;
|
import us.myles.ViaVersion.protocols.protocol1_9_1to1_9.Protocol1_9_1TO1_9;
|
||||||
@ -57,6 +58,7 @@ public class ProtocolRegistry {
|
|||||||
|
|
||||||
registerProtocol(new Protocol1_13To1_12_2(), Collections.singletonList(ProtocolVersion.v1_13.getId()), ProtocolVersion.v1_12_2.getId());
|
registerProtocol(new Protocol1_13To1_12_2(), Collections.singletonList(ProtocolVersion.v1_13.getId()), ProtocolVersion.v1_12_2.getId());
|
||||||
registerProtocol(new Protocol1_13_1To1_13(), Arrays.asList(ProtocolVersion.v1_13_1.getId()), ProtocolVersion.v1_13.getId());
|
registerProtocol(new Protocol1_13_1To1_13(), Arrays.asList(ProtocolVersion.v1_13_1.getId()), ProtocolVersion.v1_13.getId());
|
||||||
|
registerProtocol(new Protocol1_13_2To1_13_1(), Arrays.asList(ProtocolVersion.v1_13_2.getId()), ProtocolVersion.v1_13_1.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -165,13 +167,14 @@ public class ProtocolRegistry {
|
|||||||
if (current.size() > 50) return null; // Fail safe, protocol too complicated.
|
if (current.size() > 50) return null; // Fail safe, protocol too complicated.
|
||||||
|
|
||||||
// First check if there is any protocols for this
|
// First check if there is any protocols for this
|
||||||
if (!registryMap.containsKey(clientVersion)) {
|
Map<Integer, Protocol> inputMap = registryMap.get(clientVersion);
|
||||||
|
if (inputMap == null) {
|
||||||
return null; // Not supported
|
return null; // Not supported
|
||||||
}
|
}
|
||||||
// Next check there isn't an obvious path
|
// Next check there isn't an obvious path
|
||||||
Map<Integer, Protocol> inputMap = registryMap.get(clientVersion);
|
Protocol protocol = inputMap.get(serverVersion);
|
||||||
if (inputMap.containsKey(serverVersion)) {
|
if (protocol != null) {
|
||||||
current.add(new Pair<>(serverVersion, inputMap.get(serverVersion)));
|
current.add(new Pair<>(serverVersion, protocol));
|
||||||
return current; // Easy solution
|
return current; // Easy solution
|
||||||
}
|
}
|
||||||
// There might be a more advanced solution... So we'll see if any of the others can get us there
|
// There might be a more advanced solution... So we'll see if any of the others can get us there
|
||||||
@ -211,8 +214,9 @@ public class ProtocolRegistry {
|
|||||||
public static List<Pair<Integer, Protocol>> getProtocolPath(int clientVersion, int serverVersion) {
|
public static List<Pair<Integer, Protocol>> getProtocolPath(int clientVersion, int serverVersion) {
|
||||||
Pair<Integer, Integer> protocolKey = new Pair<>(clientVersion, serverVersion);
|
Pair<Integer, Integer> protocolKey = new Pair<>(clientVersion, serverVersion);
|
||||||
// Check cache
|
// Check cache
|
||||||
if (pathCache.containsKey(protocolKey)) {
|
List<Pair<Integer, Protocol>> protocolList = pathCache.get(protocolKey);
|
||||||
return pathCache.get(protocolKey);
|
if (protocolList != null) {
|
||||||
|
return protocolList;
|
||||||
}
|
}
|
||||||
// Generate path
|
// Generate path
|
||||||
List<Pair<Integer, Protocol>> outputPath = getProtocolPath(new ArrayList<Pair<Integer, Protocol>>(), clientVersion, serverVersion);
|
List<Pair<Integer, Protocol>> outputPath = getProtocolPath(new ArrayList<Pair<Integer, Protocol>>(), clientVersion, serverVersion);
|
||||||
|
@ -34,6 +34,7 @@ public class ProtocolVersion {
|
|||||||
public static final ProtocolVersion v1_12_2;
|
public static final ProtocolVersion v1_12_2;
|
||||||
public static final ProtocolVersion v1_13;
|
public static final ProtocolVersion v1_13;
|
||||||
public static final ProtocolVersion v1_13_1;
|
public static final ProtocolVersion v1_13_1;
|
||||||
|
public static final ProtocolVersion v1_13_2;
|
||||||
public static final ProtocolVersion unknown;
|
public static final ProtocolVersion unknown;
|
||||||
|
|
||||||
private final int id;
|
private final int id;
|
||||||
@ -64,6 +65,7 @@ public class ProtocolVersion {
|
|||||||
register(v1_12_2 = new ProtocolVersion(340, "1.12.2"));
|
register(v1_12_2 = new ProtocolVersion(340, "1.12.2"));
|
||||||
register(v1_13 = new ProtocolVersion(393, "1.13"));
|
register(v1_13 = new ProtocolVersion(393, "1.13"));
|
||||||
register(v1_13_1 = new ProtocolVersion(401, "1.13.1"));
|
register(v1_13_1 = new ProtocolVersion(401, "1.13.1"));
|
||||||
|
register(v1_13_2 = new ProtocolVersion(402, "1.13.2"));
|
||||||
register(unknown = new ProtocolVersion(-1, "UNKNOWN"));
|
register(unknown = new ProtocolVersion(-1, "UNKNOWN"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,8 +79,9 @@ public class ProtocolVersion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static ProtocolVersion getProtocol(int id) {
|
public static ProtocolVersion getProtocol(int id) {
|
||||||
if (versions.containsKey(id)) {
|
ProtocolVersion protocolVersion = versions.get(id);
|
||||||
return versions.get(id);
|
if (protocolVersion != null) {
|
||||||
|
return protocolVersion;
|
||||||
} else {
|
} else {
|
||||||
return new ProtocolVersion(id, "Unknown (" + id + ")");
|
return new ProtocolVersion(id, "Unknown (" + id + ")");
|
||||||
}
|
}
|
||||||
|
@ -76,8 +76,11 @@ public abstract class Type<T> implements ByteBufReader<T>, ByteBufWriter<T> {
|
|||||||
|
|
||||||
/* 1.13 Flat Item (no data) */
|
/* 1.13 Flat Item (no data) */
|
||||||
public static final Type<Item> FLAT_ITEM = new FlatItemType();
|
public static final Type<Item> FLAT_ITEM = new FlatItemType();
|
||||||
|
public static final Type<Item> FLAT_VAR_INT_ITEM = new FlatVarIntItemType();
|
||||||
public static final Type<Item[]> FLAT_ITEM_ARRAY = new FlatItemArrayType();
|
public static final Type<Item[]> FLAT_ITEM_ARRAY = new FlatItemArrayType();
|
||||||
|
public static final Type<Item[]> FLAT_VAR_INT_ITEM_ARRAY = new FlatVarIntItemArrayType();
|
||||||
public static final Type<Item[]> FLAT_ITEM_ARRAY_VAR_INT = new ArrayType<>(FLAT_ITEM);
|
public static final Type<Item[]> FLAT_ITEM_ARRAY_VAR_INT = new ArrayType<>(FLAT_ITEM);
|
||||||
|
public static final Type<Item[]> FLAT_VAR_INT_ITEM_ARRAY_VAR_INT = new ArrayType<>(FLAT_VAR_INT_ITEM);
|
||||||
|
|
||||||
/* Actual Class */
|
/* Actual Class */
|
||||||
|
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
package us.myles.ViaVersion.api.type.types.minecraft;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.item.Item;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
|
||||||
|
public class FlatVarIntItemArrayType extends BaseItemArrayType {
|
||||||
|
|
||||||
|
public FlatVarIntItemArrayType() {
|
||||||
|
super("Flat Item Array");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item[] read(ByteBuf buffer) throws Exception {
|
||||||
|
int amount = Type.SHORT.read(buffer);
|
||||||
|
Item[] array = new Item[amount];
|
||||||
|
for (int i = 0; i < amount; i++) {
|
||||||
|
array[i] = Type.FLAT_VAR_INT_ITEM.read(buffer);
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(ByteBuf buffer, Item[] object) throws Exception {
|
||||||
|
Type.SHORT.write(buffer, (short) object.length);
|
||||||
|
for (Item o : object) {
|
||||||
|
Type.FLAT_VAR_INT_ITEM.write(buffer, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package us.myles.ViaVersion.api.type.types.minecraft;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.item.Item;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
|
||||||
|
public class FlatVarIntItemType extends BaseItemType {
|
||||||
|
public FlatVarIntItemType() {
|
||||||
|
super("FlatVarIntItem");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item read(ByteBuf buffer) throws Exception {
|
||||||
|
boolean present = buffer.readBoolean();
|
||||||
|
if (!present) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Item item = new Item();
|
||||||
|
item.setId(Type.VAR_INT.read(buffer).shortValue()); //TODO Maybe we should consider changing id field type to int
|
||||||
|
item.setAmount(buffer.readByte());
|
||||||
|
item.setTag(Type.NBT.read(buffer));
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(ByteBuf buffer, Item object) throws Exception {
|
||||||
|
if (object == null) {
|
||||||
|
buffer.writeBoolean(false);
|
||||||
|
} else {
|
||||||
|
buffer.writeBoolean(true);
|
||||||
|
Type.VAR_INT.write(buffer, (int) object.getId());
|
||||||
|
buffer.writeByte(object.getAmount());
|
||||||
|
Type.NBT.write(buffer, object.getTag());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package us.myles.ViaVersion.api.type.types.version;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13_2;
|
||||||
|
import us.myles.ViaVersion.api.type.types.minecraft.MetaTypeTemplate;
|
||||||
|
|
||||||
|
public class Metadata1_13_2Type extends MetaTypeTemplate {
|
||||||
|
@Override
|
||||||
|
public Metadata read(ByteBuf buffer) throws Exception {
|
||||||
|
short index = buffer.readUnsignedByte();
|
||||||
|
|
||||||
|
if (index == 0xff) return null; //End of metadata
|
||||||
|
MetaType1_13_2 type = MetaType1_13_2.byId(buffer.readByte());
|
||||||
|
|
||||||
|
return new Metadata(index, type, type.getType().read(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(ByteBuf buffer, Metadata object) throws Exception {
|
||||||
|
if (object == null) {
|
||||||
|
buffer.writeByte(255);
|
||||||
|
} else {
|
||||||
|
buffer.writeByte(object.getId());
|
||||||
|
buffer.writeByte(object.getMetaType().getTypeID());
|
||||||
|
object.getMetaType().getType().write(buffer, object.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package us.myles.ViaVersion.api.type.types.version;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
|
||||||
|
import us.myles.ViaVersion.api.type.types.minecraft.MetaListTypeTemplate;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class MetadataList1_13_2Type extends MetaListTypeTemplate {
|
||||||
|
@Override
|
||||||
|
public List<Metadata> read(ByteBuf buffer) throws Exception {
|
||||||
|
List<Metadata> list = new ArrayList<>();
|
||||||
|
Metadata meta;
|
||||||
|
do {
|
||||||
|
meta = Types1_13_2.METADATA.read(buffer);
|
||||||
|
if (meta != null)
|
||||||
|
list.add(meta);
|
||||||
|
} while (meta != null);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(ByteBuf buffer, List<Metadata> object) throws Exception {
|
||||||
|
for (Metadata m : object)
|
||||||
|
Types1_13_2.METADATA.write(buffer, m);
|
||||||
|
|
||||||
|
// Write end of list
|
||||||
|
Types1_13_2.METADATA.write(buffer, null);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package us.myles.ViaVersion.api.type.types.version;
|
||||||
|
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Types1_13_2 {
|
||||||
|
/**
|
||||||
|
* Metadata list type for 1.13
|
||||||
|
*/
|
||||||
|
public static final Type<List<Metadata>> METADATA_LIST = new MetadataList1_13_2Type();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Metadata type for 1.13
|
||||||
|
*/
|
||||||
|
public static final Type<Metadata> METADATA = new Metadata1_13_2Type();
|
||||||
|
}
|
@ -42,8 +42,10 @@ public class BlockEntityRewriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String toNewIdentifier(String oldId) {
|
public static String toNewIdentifier(String oldId) {
|
||||||
if (oldToNewNames.containsKey(oldId))
|
String newName = oldToNewNames.get(oldId);
|
||||||
return oldToNewNames.get(oldId);
|
if (newName != null) {
|
||||||
|
return newName;
|
||||||
|
}
|
||||||
return oldId;
|
return oldId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -90,8 +90,9 @@ public class EntityIdRewriter {
|
|||||||
public static void toClient(CompoundTag tag) {
|
public static void toClient(CompoundTag tag) {
|
||||||
if (tag.get("id") instanceof StringTag) {
|
if (tag.get("id") instanceof StringTag) {
|
||||||
StringTag id = tag.get("id");
|
StringTag id = tag.get("id");
|
||||||
if (oldToNewNames.containsKey(id.getValue())) {
|
String newName = oldToNewNames.get(id.getValue());
|
||||||
id.setValue(oldToNewNames.get(id.getValue()));
|
if (newName != null) {
|
||||||
|
id.setValue(newName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -117,8 +118,9 @@ public class EntityIdRewriter {
|
|||||||
CompoundTag entityTag = item.getTag().get("EntityTag");
|
CompoundTag entityTag = item.getTag().get("EntityTag");
|
||||||
if (entityTag.get("id") instanceof StringTag) {
|
if (entityTag.get("id") instanceof StringTag) {
|
||||||
StringTag id = entityTag.get("id");
|
StringTag id = entityTag.get("id");
|
||||||
if (oldToNewNames.inverse().containsKey(id.getValue())) {
|
String newName = oldToNewNames.inverse().get(id.getValue());
|
||||||
id.setValue(oldToNewNames.inverse().get(id.getValue()));
|
if (newName != null) {
|
||||||
|
id.setValue(newName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,9 +33,7 @@ public class EntityTracker extends StoredObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Entity1_11Types.EntityType> get(int id) {
|
public Optional<Entity1_11Types.EntityType> get(int id) {
|
||||||
if (!has(id))
|
return Optional.fromNullable(clientEntityTypes.get(id));
|
||||||
return Optional.absent();
|
|
||||||
return Optional.of(clientEntityTypes.get(id));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addHologram(int entId) {
|
public void addHologram(int entId) {
|
||||||
|
@ -28,9 +28,7 @@ public class EntityTracker extends StoredObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Entity1_12Types.EntityType> get(int id) {
|
public Optional<Entity1_12Types.EntityType> get(int id) {
|
||||||
if (!has(id))
|
return Optional.fromNullable(clientEntityTypes.get(id));
|
||||||
return Optional.absent();
|
|
||||||
return Optional.of(clientEntityTypes.get(id));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,82 @@
|
|||||||
|
package us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1;
|
||||||
|
|
||||||
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.item.Item;
|
||||||
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketHandler;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketRemapper;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.packets.State;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.packets.EntityPackets;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.packets.InventoryPackets;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.packets.WorldPackets;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.types.Particle1_13_2Type;
|
||||||
|
|
||||||
|
public class Protocol1_13_2To1_13_1 extends Protocol {
|
||||||
|
public static final Particle1_13_2Type PARTICLE_TYPE = new Particle1_13_2Type();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void registerPackets() {
|
||||||
|
InventoryPackets.register(this);
|
||||||
|
WorldPackets.register(this);
|
||||||
|
EntityPackets.register(this);
|
||||||
|
|
||||||
|
//Edit Book
|
||||||
|
registerIncoming(State.PLAY, 0x0B, 0x0B, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.FLAT_ITEM, Type.FLAT_VAR_INT_ITEM);
|
||||||
|
map(Type.BOOLEAN);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Advancements
|
||||||
|
registerOutgoing(State.PLAY, 0x51, 0x51, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
handler(new PacketHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(PacketWrapper wrapper) throws Exception {
|
||||||
|
wrapper.passthrough(Type.BOOLEAN); // Reset/clear
|
||||||
|
int size = wrapper.passthrough(Type.VAR_INT); // Mapping size
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
wrapper.passthrough(Type.STRING); // Identifier
|
||||||
|
|
||||||
|
// Parent
|
||||||
|
if (wrapper.passthrough(Type.BOOLEAN))
|
||||||
|
wrapper.passthrough(Type.STRING);
|
||||||
|
|
||||||
|
// Display data
|
||||||
|
if (wrapper.passthrough(Type.BOOLEAN)) {
|
||||||
|
wrapper.passthrough(Type.STRING); // Title
|
||||||
|
wrapper.passthrough(Type.STRING); // Description
|
||||||
|
Item icon = wrapper.read(Type.FLAT_ITEM);
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, icon);
|
||||||
|
wrapper.passthrough(Type.VAR_INT); // Frame type
|
||||||
|
int flags = wrapper.passthrough(Type.INT); // Flags
|
||||||
|
if ((flags & 1) != 0)
|
||||||
|
wrapper.passthrough(Type.STRING); // Background texture
|
||||||
|
wrapper.passthrough(Type.FLOAT); // X
|
||||||
|
wrapper.passthrough(Type.FLOAT); // Y
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapper.passthrough(Type.STRING_ARRAY); // Criteria
|
||||||
|
|
||||||
|
int arrayLength = wrapper.passthrough(Type.VAR_INT);
|
||||||
|
for (int array = 0; array < arrayLength; array++) {
|
||||||
|
wrapper.passthrough(Type.STRING_ARRAY); // String array
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(UserConnection userConnection) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
package us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.packets;
|
||||||
|
|
||||||
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13_2;
|
||||||
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketHandler;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketRemapper;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.api.type.types.version.Types1_13;
|
||||||
|
import us.myles.ViaVersion.api.type.types.version.Types1_13_2;
|
||||||
|
import us.myles.ViaVersion.packets.State;
|
||||||
|
|
||||||
|
public class EntityPackets {
|
||||||
|
|
||||||
|
public static void register(Protocol protocol) {
|
||||||
|
// Spawn mob packet
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x3, 0x3, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.VAR_INT); // 0 - Entity ID
|
||||||
|
map(Type.UUID); // 1 - Entity UUID
|
||||||
|
map(Type.VAR_INT); // 2 - Entity Type
|
||||||
|
map(Type.DOUBLE); // 3 - X
|
||||||
|
map(Type.DOUBLE); // 4 - Y
|
||||||
|
map(Type.DOUBLE); // 5 - Z
|
||||||
|
map(Type.BYTE); // 6 - Yaw
|
||||||
|
map(Type.BYTE); // 7 - Pitch
|
||||||
|
map(Type.BYTE); // 8 - Head Pitch
|
||||||
|
map(Type.SHORT); // 9 - Velocity X
|
||||||
|
map(Type.SHORT); // 10 - Velocity Y
|
||||||
|
map(Type.SHORT); // 11 - Velocity Z
|
||||||
|
map(Types1_13.METADATA_LIST, Types1_13_2.METADATA_LIST); // 12 - Metadata
|
||||||
|
|
||||||
|
handler(new PacketHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(PacketWrapper wrapper) throws Exception {
|
||||||
|
for (Metadata metadata : wrapper.get(Types1_13_2.METADATA_LIST, 0)) {
|
||||||
|
if (metadata.getMetaType() == MetaType1_13.Slot) {
|
||||||
|
metadata.setMetaType(MetaType1_13_2.Slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Spawn player packet
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x05, 0x05, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.VAR_INT); // 0 - Entity ID
|
||||||
|
map(Type.UUID); // 1 - Player UUID
|
||||||
|
map(Type.DOUBLE); // 2 - X
|
||||||
|
map(Type.DOUBLE); // 3 - Y
|
||||||
|
map(Type.DOUBLE); // 4 - Z
|
||||||
|
map(Type.BYTE); // 5 - Yaw
|
||||||
|
map(Type.BYTE); // 6 - Pitch
|
||||||
|
map(Types1_13.METADATA_LIST, Types1_13_2.METADATA_LIST); // 7 - Metadata
|
||||||
|
|
||||||
|
handler(new PacketHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(PacketWrapper wrapper) throws Exception {
|
||||||
|
for (Metadata metadata : wrapper.get(Types1_13_2.METADATA_LIST, 0)) {
|
||||||
|
if (metadata.getMetaType() == MetaType1_13.Slot) {
|
||||||
|
metadata.setMetaType(MetaType1_13_2.Slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Metadata packet
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x3F, 0x3F, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.VAR_INT); // 0 - Entity ID
|
||||||
|
map(Types1_13.METADATA_LIST, Types1_13_2.METADATA_LIST); // 1 - Metadata list
|
||||||
|
|
||||||
|
handler(new PacketHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(PacketWrapper wrapper) throws Exception {
|
||||||
|
for (Metadata metadata : wrapper.get(Types1_13_2.METADATA_LIST, 0)) {
|
||||||
|
if (metadata.getMetaType() == MetaType1_13.Slot) {
|
||||||
|
metadata.setMetaType(MetaType1_13_2.Slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,151 @@
|
|||||||
|
package us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.packets;
|
||||||
|
|
||||||
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketHandler;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketRemapper;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.packets.State;
|
||||||
|
|
||||||
|
public class InventoryPackets {
|
||||||
|
|
||||||
|
public static void register(Protocol protocol) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
Outgoing packets
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Set slot packet
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x17, 0x17, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.BYTE); // 0 - Window ID
|
||||||
|
map(Type.SHORT); // 1 - Slot ID
|
||||||
|
map(Type.FLAT_ITEM, Type.FLAT_VAR_INT_ITEM); // 2 - Slot Value
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Window items packet
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x15, 0x15, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.UNSIGNED_BYTE); // 0 - Window ID
|
||||||
|
map(Type.FLAT_ITEM_ARRAY, Type.FLAT_VAR_INT_ITEM_ARRAY); // 1 - Window Values
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Plugin message
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x19, 0x19, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.STRING); // Channel
|
||||||
|
handler(new PacketHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(PacketWrapper wrapper) throws Exception {
|
||||||
|
String channel = wrapper.get(Type.STRING, 0);
|
||||||
|
if (channel.equals("minecraft:trader_list") || channel.equals("trader_list")) {
|
||||||
|
wrapper.passthrough(Type.INT); // Passthrough Window ID
|
||||||
|
|
||||||
|
int size = wrapper.passthrough(Type.UNSIGNED_BYTE);
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
// Input Item
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, wrapper.read(Type.FLAT_ITEM));
|
||||||
|
// Output Item
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, wrapper.read(Type.FLAT_ITEM));
|
||||||
|
|
||||||
|
boolean secondItem = wrapper.passthrough(Type.BOOLEAN); // Has second item
|
||||||
|
if (secondItem) {
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, wrapper.read(Type.FLAT_ITEM));
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapper.passthrough(Type.BOOLEAN); // Trade disabled
|
||||||
|
wrapper.passthrough(Type.INT); // Number of tools uses
|
||||||
|
wrapper.passthrough(Type.INT); // Maximum number of trade uses
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Entity Equipment Packet
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x42, 0x42, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.VAR_INT); // 0 - Entity ID
|
||||||
|
map(Type.VAR_INT); // 1 - Slot ID
|
||||||
|
map(Type.FLAT_ITEM, Type.FLAT_VAR_INT_ITEM); // 2 - Item
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Declare Recipes
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x54, 0x54, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
handler(new PacketHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(PacketWrapper wrapper) throws Exception {
|
||||||
|
int recipesNo = wrapper.passthrough(Type.VAR_INT);
|
||||||
|
for (int i = 0; i < recipesNo; i++) {
|
||||||
|
wrapper.passthrough(Type.STRING); // Id
|
||||||
|
String type = wrapper.passthrough(Type.STRING);
|
||||||
|
if (type.equals("crafting_shapeless")) {
|
||||||
|
wrapper.passthrough(Type.STRING); // Group
|
||||||
|
int ingredientsNo = wrapper.passthrough(Type.VAR_INT);
|
||||||
|
for (int i1 = 0; i1 < ingredientsNo; i1++) {
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT, wrapper.read(Type.FLAT_ITEM_ARRAY_VAR_INT));
|
||||||
|
}
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, wrapper.read(Type.FLAT_ITEM));
|
||||||
|
} else if (type.equals("crafting_shaped")) {
|
||||||
|
int ingredientsNo = wrapper.passthrough(Type.VAR_INT) * wrapper.passthrough(Type.VAR_INT);
|
||||||
|
wrapper.passthrough(Type.STRING); // Group
|
||||||
|
for (int i1 = 0; i1 < ingredientsNo; i1++) {
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT, wrapper.read(Type.FLAT_ITEM_ARRAY_VAR_INT));
|
||||||
|
}
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, wrapper.read(Type.FLAT_ITEM));
|
||||||
|
} else if (type.equals("smelting")) {
|
||||||
|
wrapper.passthrough(Type.STRING); // Group
|
||||||
|
// Ingredient start
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT, wrapper.read(Type.FLAT_ITEM_ARRAY_VAR_INT));
|
||||||
|
// Ingredient end
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, wrapper.read(Type.FLAT_ITEM));
|
||||||
|
wrapper.passthrough(Type.FLOAT); // EXP
|
||||||
|
wrapper.passthrough(Type.VAR_INT); // Cooking time
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Incoming packets
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Click window packet
|
||||||
|
protocol.registerIncoming(State.PLAY, 0x08, 0x08, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.UNSIGNED_BYTE); // 0 - Window ID
|
||||||
|
map(Type.SHORT); // 1 - Slot
|
||||||
|
map(Type.BYTE); // 2 - Button
|
||||||
|
map(Type.SHORT); // 3 - Action number
|
||||||
|
map(Type.VAR_INT); // 4 - Mode
|
||||||
|
map(Type.FLAT_VAR_INT_ITEM, Type.FLAT_ITEM); // 5 - Clicked Item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Creative Inventory Action
|
||||||
|
protocol.registerIncoming(State.PLAY, 0x24, 0x24, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.SHORT); // 0 - Slot
|
||||||
|
map(Type.FLAT_VAR_INT_ITEM, Type.FLAT_ITEM); // 1 - Clicked Item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.packets;
|
||||||
|
|
||||||
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketHandler;
|
||||||
|
import us.myles.ViaVersion.api.remapper.PacketRemapper;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.packets.State;
|
||||||
|
|
||||||
|
public class WorldPackets {
|
||||||
|
|
||||||
|
public static void register(Protocol protocol) {
|
||||||
|
//spawn particle
|
||||||
|
protocol.registerOutgoing(State.PLAY, 0x24, 0x24, new PacketRemapper() {
|
||||||
|
@Override
|
||||||
|
public void registerMap() {
|
||||||
|
map(Type.INT); // 0 - Particle ID
|
||||||
|
map(Type.BOOLEAN); // 1 - Long Distance
|
||||||
|
map(Type.FLOAT); // 2 - X
|
||||||
|
map(Type.FLOAT); // 3 - Y
|
||||||
|
map(Type.FLOAT); // 4 - Z
|
||||||
|
map(Type.FLOAT); // 5 - Offset X
|
||||||
|
map(Type.FLOAT); // 6 - Offset Y
|
||||||
|
map(Type.FLOAT); // 7 - Offset Z
|
||||||
|
map(Type.FLOAT); // 8 - Particle Data
|
||||||
|
map(Type.INT); // 9 - Particle Count
|
||||||
|
handler(new PacketHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(PacketWrapper wrapper) throws Exception {
|
||||||
|
int id = wrapper.get(Type.INT, 0);
|
||||||
|
if (id == 27) {
|
||||||
|
wrapper.write(Type.FLAT_VAR_INT_ITEM, wrapper.read(Type.FLAT_ITEM));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package us.myles.ViaVersion.protocols.protocol1_13_2to1_13_1.types;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.Particle;
|
||||||
|
|
||||||
|
public class Particle1_13_2Type extends Type<Particle> {
|
||||||
|
public Particle1_13_2Type() {
|
||||||
|
super("Particle", Particle.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(ByteBuf buffer, Particle object) throws Exception {
|
||||||
|
Type.VAR_INT.write(buffer, object.getId());
|
||||||
|
for (Particle.ParticleData data : object.getArguments())
|
||||||
|
data.getType().write(buffer, data.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Particle read(ByteBuf buffer) throws Exception {
|
||||||
|
int type = Type.VAR_INT.read(buffer);
|
||||||
|
Particle particle = new Particle(type);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
// Block / Falling Dust /
|
||||||
|
case 3:
|
||||||
|
case 20:
|
||||||
|
particle.getArguments().add(new Particle.ParticleData(Type.VAR_INT, Type.VAR_INT.read(buffer))); // Flat Block
|
||||||
|
break;
|
||||||
|
// Dust
|
||||||
|
case 11:
|
||||||
|
particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.read(buffer))); // Red 0 - 1
|
||||||
|
particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.read(buffer))); // Green 0 - 1
|
||||||
|
particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.read(buffer))); // Blue 0 - 1
|
||||||
|
particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.read(buffer)));// Scale 0.01 - 4
|
||||||
|
break;
|
||||||
|
// Item
|
||||||
|
case 27:
|
||||||
|
particle.getArguments().add(new Particle.ParticleData(Type.FLAT_VAR_INT_ITEM, Type.FLAT_VAR_INT_ITEM.read(buffer))); // Flat item
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return particle;
|
||||||
|
}
|
||||||
|
}
|
@ -46,11 +46,14 @@ public class EntityNameRewriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String rewrite(String entName) {
|
public static String rewrite(String entName) {
|
||||||
if (entityNames.containsKey(entName))
|
String entityName = entityNames.get(entName);
|
||||||
return entityNames.get(entName);
|
if (entityName != null) {
|
||||||
if (entityNames.containsKey("minecraft:" + entName))
|
return entityName;
|
||||||
return entityNames.get("minecraft:" + entName);
|
}
|
||||||
else
|
entityName = entityNames.get("minecraft:" + entName);
|
||||||
|
if (entityName != null) {
|
||||||
|
return entityName;
|
||||||
|
} else
|
||||||
return entName;
|
return entName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,15 +39,15 @@ public class BlockEntityProvider implements Provider {
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
String id = (String) tag.get("id").getValue();
|
String id = (String) tag.get("id").getValue();
|
||||||
|
BlockEntityHandler handler = handlers.get(id);
|
||||||
if (!handlers.containsKey(id)) {
|
if (handler == null) {
|
||||||
if (Via.getManager().isDebug()) {
|
if (Via.getManager().isDebug()) {
|
||||||
Via.getPlatform().getLogger().warning("Unhandled BlockEntity " + id + " full tag: " + tag);
|
Via.getPlatform().getLogger().warning("Unhandled BlockEntity " + id + " full tag: " + tag);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int newBlock = handlers.get(id).transform(user, tag);
|
int newBlock = handler.transform(user, tag);
|
||||||
|
|
||||||
if (sendUpdate && newBlock != -1)
|
if (sendUpdate && newBlock != -1)
|
||||||
sendBlockChange(user, position, newBlock);
|
sendBlockChange(user, position, newBlock);
|
||||||
|
@ -46,10 +46,6 @@ public class PaintingProvider implements Provider {
|
|||||||
// Handle older versions
|
// Handle older versions
|
||||||
if (!motive.startsWith("minecraft:"))
|
if (!motive.startsWith("minecraft:"))
|
||||||
motive = "minecraft:" + motive.toLowerCase();
|
motive = "minecraft:" + motive.toLowerCase();
|
||||||
|
return Optional.fromNullable(paintings.get(motive));
|
||||||
if (paintings.containsKey(motive))
|
|
||||||
return Optional.of(paintings.get(motive));
|
|
||||||
|
|
||||||
return Optional.absent();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -28,9 +28,7 @@ public class EntityTracker extends StoredObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Entity1_13Types.EntityType> get(int id) {
|
public Optional<Entity1_13Types.EntityType> get(int id) {
|
||||||
if (!has(id))
|
return Optional.fromNullable(clientEntityTypes.get(id));
|
||||||
return Optional.absent();
|
|
||||||
return Optional.of(clientEntityTypes.get(id));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -57,8 +57,9 @@ public class FakeTileEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static CompoundTag getFromBlock(int x, int y, int z, int block) {
|
public static CompoundTag getFromBlock(int x, int y, int z, int block) {
|
||||||
if (tileEntities.containsKey(block)) {
|
CompoundTag originalTag = tileEntities.get(block);
|
||||||
CompoundTag tag = tileEntities.get(block).clone();
|
if (originalTag != null) {
|
||||||
|
CompoundTag tag = originalTag.clone();
|
||||||
tag.put(new IntTag("x", x));
|
tag.put(new IntTag("x", x));
|
||||||
tag.put(new IntTag("y", y));
|
tag.put(new IntTag("y", y));
|
||||||
tag.put(new IntTag("z", z));
|
tag.put(new IntTag("z", z));
|
||||||
|
@ -230,8 +230,9 @@ public class ItemRewriter {
|
|||||||
tag = new CompoundTag("tag");
|
tag = new CompoundTag("tag");
|
||||||
}
|
}
|
||||||
CompoundTag entityTag = new CompoundTag("EntityTag");
|
CompoundTag entityTag = new CompoundTag("EntityTag");
|
||||||
if (ENTTIY_ID_TO_NAME.containsKey((int) item.getData())) {
|
String entityName = ENTTIY_ID_TO_NAME.get((int) item.getData());
|
||||||
StringTag id = new StringTag("id", ENTTIY_ID_TO_NAME.get((int) item.getData()));
|
if (entityName != null) {
|
||||||
|
StringTag id = new StringTag("id", entityName);
|
||||||
entityTag.put(id);
|
entityTag.put(id);
|
||||||
tag.put(entityTag);
|
tag.put(entityTag);
|
||||||
}
|
}
|
||||||
@ -379,12 +380,14 @@ public class ItemRewriter {
|
|||||||
if (oldID >= 16384) {
|
if (oldID >= 16384) {
|
||||||
oldID -= 8192;
|
oldID -= 8192;
|
||||||
}
|
}
|
||||||
if (POTION_INDEX.containsKey(oldID)) {
|
|
||||||
return POTION_INDEX.get(oldID);
|
Integer index = POTION_INDEX.get(oldID);
|
||||||
|
if (index != null) {
|
||||||
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
oldID = POTION_NAME_TO_ID.get(potionNameFromDamage((short) oldID));
|
oldID = POTION_NAME_TO_ID.get(potionNameFromDamage((short) oldID));
|
||||||
return POTION_INDEX.containsKey(oldID) ? POTION_INDEX.get(oldID) : 0;
|
return (index = POTION_INDEX.get(oldID)) != null ? index : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void registerEntity(Integer id, String name) {
|
private static void registerEntity(Integer id, String name) {
|
||||||
|
@ -173,11 +173,7 @@ public enum MetaIndex {
|
|||||||
|
|
||||||
private static Optional<MetaIndex> getIndex(Entity1_10Types.EntityType type, int index) {
|
private static Optional<MetaIndex> getIndex(Entity1_10Types.EntityType type, int index) {
|
||||||
Pair pair = new Pair<>(type, index);
|
Pair pair = new Pair<>(type, index);
|
||||||
if (metadataRewrites.containsKey(pair)) {
|
return Optional.fromNullable(metadataRewrites.get(pair));
|
||||||
return Optional.of(metadataRewrites.get(pair));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Optional.absent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MetaIndex searchIndex(Entity1_10Types.EntityType type, int index) {
|
public static MetaIndex searchIndex(Entity1_10Types.EntityType type, int index) {
|
||||||
|
@ -5,6 +5,7 @@ import us.myles.ViaVersion.api.PacketWrapper;
|
|||||||
import us.myles.ViaVersion.api.Pair;
|
import us.myles.ViaVersion.api.Pair;
|
||||||
import us.myles.ViaVersion.api.Triple;
|
import us.myles.ViaVersion.api.Triple;
|
||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
|
import us.myles.ViaVersion.api.entities.Entity1_10Types;
|
||||||
import us.myles.ViaVersion.api.minecraft.item.Item;
|
import us.myles.ViaVersion.api.minecraft.item.Item;
|
||||||
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
|
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
|
||||||
import us.myles.ViaVersion.api.protocol.Protocol;
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
@ -184,8 +185,9 @@ public class EntityPackets {
|
|||||||
List<Metadata> metadataList = wrapper.get(Types1_9.METADATA_LIST, 0);
|
List<Metadata> metadataList = wrapper.get(Types1_9.METADATA_LIST, 0);
|
||||||
int entityID = wrapper.get(Type.VAR_INT, 0);
|
int entityID = wrapper.get(Type.VAR_INT, 0);
|
||||||
EntityTracker tracker = wrapper.user().get(EntityTracker.class);
|
EntityTracker tracker = wrapper.user().get(EntityTracker.class);
|
||||||
if (tracker.getClientEntityTypes().containsKey(entityID)) {
|
Entity1_10Types.EntityType type = tracker.getClientEntityTypes().get(entityID);
|
||||||
MetadataRewriter.transform(tracker.getClientEntityTypes().get(entityID), metadataList);
|
if (type != null) {
|
||||||
|
MetadataRewriter.transform(type, metadataList);
|
||||||
} else {
|
} else {
|
||||||
// Buffer
|
// Buffer
|
||||||
tracker.addMetadataToBuffer(entityID, metadataList);
|
tracker.addMetadataToBuffer(entityID, metadataList);
|
||||||
|
@ -214,8 +214,9 @@ public class SpawnPackets {
|
|||||||
List<Metadata> metadataList = wrapper.get(Types1_9.METADATA_LIST, 0);
|
List<Metadata> metadataList = wrapper.get(Types1_9.METADATA_LIST, 0);
|
||||||
int entityID = wrapper.get(Type.VAR_INT, 0);
|
int entityID = wrapper.get(Type.VAR_INT, 0);
|
||||||
EntityTracker tracker = wrapper.user().get(EntityTracker.class);
|
EntityTracker tracker = wrapper.user().get(EntityTracker.class);
|
||||||
if (tracker.getClientEntityTypes().containsKey(entityID)) {
|
Entity1_10Types.EntityType type = tracker.getClientEntityTypes().get(entityID);
|
||||||
MetadataRewriter.transform(tracker.getClientEntityTypes().get(entityID), metadataList);
|
if (type != null) {
|
||||||
|
MetadataRewriter.transform(type, metadataList);
|
||||||
} else {
|
} else {
|
||||||
Via.getPlatform().getLogger().warning("Unable to find entity for metadata, entity ID: " + entityID);
|
Via.getPlatform().getLogger().warning("Unable to find entity for metadata, entity ID: " + entityID);
|
||||||
metadataList.clear();
|
metadataList.clear();
|
||||||
@ -319,8 +320,9 @@ public class SpawnPackets {
|
|||||||
List<Metadata> metadataList = wrapper.get(Types1_9.METADATA_LIST, 0);
|
List<Metadata> metadataList = wrapper.get(Types1_9.METADATA_LIST, 0);
|
||||||
int entityID = wrapper.get(Type.VAR_INT, 0);
|
int entityID = wrapper.get(Type.VAR_INT, 0);
|
||||||
EntityTracker tracker = wrapper.user().get(EntityTracker.class);
|
EntityTracker tracker = wrapper.user().get(EntityTracker.class);
|
||||||
if (tracker.getClientEntityTypes().containsKey(entityID)) {
|
Entity1_10Types.EntityType type = tracker.getClientEntityTypes().get(entityID);
|
||||||
MetadataRewriter.transform(tracker.getClientEntityTypes().get(entityID), metadataList);
|
if (type != null) {
|
||||||
|
MetadataRewriter.transform(type, metadataList);
|
||||||
} else {
|
} else {
|
||||||
Via.getPlatform().getLogger().warning("Unable to find entity for metadata, entity ID: " + entityID);
|
Via.getPlatform().getLogger().warning("Unable to find entity for metadata, entity ID: " + entityID);
|
||||||
metadataList.clear();
|
metadataList.clear();
|
||||||
|
@ -284,9 +284,7 @@ public enum SoundEffect {
|
|||||||
|
|
||||||
public static SoundEffect getByName(String name) {
|
public static SoundEffect getByName(String name) {
|
||||||
name = name.toLowerCase();
|
name = name.toLowerCase();
|
||||||
if (effects.containsKey(name))
|
return effects.get(name);
|
||||||
return effects.get(name);
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,7 @@ public class CommandBlockStorage extends StoredObject {
|
|||||||
|
|
||||||
public void unloadChunk(int x, int z) {
|
public void unloadChunk(int x, int z) {
|
||||||
Pair<Integer, Integer> chunkPos = new Pair<>(x, z);
|
Pair<Integer, Integer> chunkPos = new Pair<>(x, z);
|
||||||
if (storedCommandBlocks.containsKey(chunkPos))
|
storedCommandBlocks.remove(chunkPos);
|
||||||
storedCommandBlocks.remove(chunkPos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addOrUpdateBlock(Position position, CompoundTag tag) {
|
public void addOrUpdateBlock(Position position, CompoundTag tag) {
|
||||||
@ -54,19 +53,18 @@ public class CommandBlockStorage extends StoredObject {
|
|||||||
public Optional<CompoundTag> getCommandBlock(Position position) {
|
public Optional<CompoundTag> getCommandBlock(Position position) {
|
||||||
Pair<Integer, Integer> chunkCoords = getChunkCoords(position);
|
Pair<Integer, Integer> chunkCoords = getChunkCoords(position);
|
||||||
|
|
||||||
if (!storedCommandBlocks.containsKey(chunkCoords))
|
|
||||||
return Optional.absent();
|
|
||||||
|
|
||||||
Map<Position, CompoundTag> blocks = storedCommandBlocks.get(chunkCoords);
|
Map<Position, CompoundTag> blocks = storedCommandBlocks.get(chunkCoords);
|
||||||
|
if (blocks == null)
|
||||||
if (!blocks.containsKey(position))
|
|
||||||
return Optional.absent();
|
return Optional.absent();
|
||||||
|
|
||||||
CompoundTag tag = blocks.get(position).clone();
|
CompoundTag tag = blocks.get(position);
|
||||||
|
if (tag == null)
|
||||||
|
return Optional.absent();
|
||||||
|
|
||||||
|
tag = tag.clone();
|
||||||
tag.put(new ByteTag("powered", (byte) 0));
|
tag.put(new ByteTag("powered", (byte) 0));
|
||||||
tag.put(new ByteTag("auto", (byte) 0));
|
tag.put(new ByteTag("auto", (byte) 0));
|
||||||
tag.put(new ByteTag("conditionMet", (byte) 0));
|
tag.put(new ByteTag("conditionMet", (byte) 0));
|
||||||
|
|
||||||
return Optional.of(tag);
|
return Optional.of(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,13 +59,13 @@ public class EntityTracker extends StoredObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public UUID getEntityUUID(int id) {
|
public UUID getEntityUUID(int id) {
|
||||||
if (uuidMap.containsKey(id)) {
|
UUID uuid = uuidMap.get(id);
|
||||||
return uuidMap.get(id);
|
if (uuid == null) {
|
||||||
} else {
|
uuid = UUID.randomUUID();
|
||||||
UUID uuid = UUID.randomUUID();
|
|
||||||
uuidMap.put(id, uuid);
|
uuidMap.put(id, uuid);
|
||||||
return uuid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSecondHand(Item item) {
|
public void setSecondHand(Item item) {
|
||||||
@ -117,11 +117,11 @@ public class EntityTracker extends StoredObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void handleMetadata(int entityID, List<Metadata> metadataList) {
|
public void handleMetadata(int entityID, List<Metadata> metadataList) {
|
||||||
if (!clientEntityTypes.containsKey(entityID)) {
|
Entity1_10Types.EntityType type = clientEntityTypes.get(entityID);
|
||||||
|
if (type == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity1_10Types.EntityType type = clientEntityTypes.get(entityID);
|
|
||||||
for (Metadata metadata : new ArrayList<>(metadataList)) {
|
for (Metadata metadata : new ArrayList<>(metadataList)) {
|
||||||
// Fix: wither (crash fix)
|
// Fix: wither (crash fix)
|
||||||
if (type == Entity1_10Types.EntityType.WITHER) {
|
if (type == Entity1_10Types.EntityType.WITHER) {
|
||||||
@ -272,21 +272,23 @@ public class EntityTracker extends StoredObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addMetadataToBuffer(int entityID, List<Metadata> metadataList) {
|
public void addMetadataToBuffer(int entityID, List<Metadata> metadataList) {
|
||||||
if (metadataBuffer.containsKey(entityID)) {
|
final List<Metadata> metadata = metadataBuffer.get(entityID);
|
||||||
metadataBuffer.get(entityID).addAll(metadataList);
|
if (metadata != null) {
|
||||||
|
metadata.addAll(metadataList);
|
||||||
} else {
|
} else {
|
||||||
metadataBuffer.put(entityID, metadataList);
|
metadataBuffer.put(entityID, metadataList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendMetadataBuffer(int entityID) {
|
public void sendMetadataBuffer(int entityID) {
|
||||||
if (metadataBuffer.containsKey(entityID)) {
|
List<Metadata> metadataList = metadataBuffer.get(entityID);
|
||||||
|
if (metadataList != null) {
|
||||||
PacketWrapper wrapper = new PacketWrapper(0x39, null, getUser());
|
PacketWrapper wrapper = new PacketWrapper(0x39, null, getUser());
|
||||||
wrapper.write(Type.VAR_INT, entityID);
|
wrapper.write(Type.VAR_INT, entityID);
|
||||||
wrapper.write(Types1_9.METADATA_LIST, metadataBuffer.get(entityID));
|
wrapper.write(Types1_9.METADATA_LIST, metadataList);
|
||||||
MetadataRewriter.transform(getClientEntityTypes().get(entityID), metadataBuffer.get(entityID));
|
MetadataRewriter.transform(getClientEntityTypes().get(entityID), metadataList);
|
||||||
handleMetadata(entityID, metadataBuffer.get(entityID));
|
handleMetadata(entityID, metadataList);
|
||||||
if (metadataBuffer.get(entityID).size() > 0) {
|
if (metadataList.size() > 0) {
|
||||||
try {
|
try {
|
||||||
wrapper.send(Protocol1_9TO1_8.class);
|
wrapper.send(Protocol1_9TO1_8.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -14,7 +14,7 @@ import java.util.Map;
|
|||||||
import java.util.concurrent.ConcurrentSkipListMap;
|
import java.util.concurrent.ConcurrentSkipListMap;
|
||||||
|
|
||||||
public abstract class Config implements ConfigurationProvider {
|
public abstract class Config implements ConfigurationProvider {
|
||||||
private static ThreadLocal<Yaml> yaml = new ThreadLocal<Yaml>() {
|
private static final ThreadLocal<Yaml> YAML = new ThreadLocal<Yaml>() {
|
||||||
@Override
|
@Override
|
||||||
protected Yaml initialValue() {
|
protected Yaml initialValue() {
|
||||||
DumperOptions options = new DumperOptions();
|
DumperOptions options = new DumperOptions();
|
||||||
@ -58,7 +58,7 @@ public abstract class Config implements ConfigurationProvider {
|
|||||||
Map<String, Object> config = null;
|
Map<String, Object> config = null;
|
||||||
if (location.exists()) {
|
if (location.exists()) {
|
||||||
try (FileInputStream input = new FileInputStream(location)) {
|
try (FileInputStream input = new FileInputStream(location)) {
|
||||||
config = (Map<String, Object>) yaml.get().load(input);
|
config = (Map<String, Object>) YAML.get().load(input);
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -71,7 +71,7 @@ public abstract class Config implements ConfigurationProvider {
|
|||||||
|
|
||||||
Map<String, Object> defaults = config;
|
Map<String, Object> defaults = config;
|
||||||
try (InputStream stream = jarConfigFile.openStream()) {
|
try (InputStream stream = jarConfigFile.openStream()) {
|
||||||
defaults = (Map<String, Object>) yaml.get().load(stream);
|
defaults = (Map<String, Object>) YAML.get().load(stream);
|
||||||
for (String option : unsupported) {
|
for (String option : unsupported) {
|
||||||
defaults.remove(option);
|
defaults.remove(option);
|
||||||
}
|
}
|
||||||
@ -97,7 +97,7 @@ public abstract class Config implements ConfigurationProvider {
|
|||||||
|
|
||||||
public synchronized void saveConfig(File location, Map<String, Object> config) {
|
public synchronized void saveConfig(File location, Map<String, Object> config) {
|
||||||
try {
|
try {
|
||||||
commentStore.writeComments(yaml.get().dump(config), location);
|
commentStore.writeComments(YAML.get().dump(config), location);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -128,33 +128,37 @@ public abstract class Config implements ConfigurationProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <T> T get(String key, Class<T> clazz, T def) {
|
public <T> T get(String key, Class<T> clazz, T def) {
|
||||||
if (this.config.containsKey(key)) {
|
Object o = this.config.get(key);
|
||||||
return (T) this.config.get(key);
|
if (o != null) {
|
||||||
|
return (T) o;
|
||||||
} else {
|
} else {
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getBoolean(String key, boolean def) {
|
public boolean getBoolean(String key, boolean def) {
|
||||||
if (this.config.containsKey(key)) {
|
Object o = this.config.get(key);
|
||||||
return (boolean) this.config.get(key);
|
if (o != null) {
|
||||||
|
return (boolean) o;
|
||||||
} else {
|
} else {
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getString(String key, String def) {
|
public String getString(String key, String def) {
|
||||||
if (this.config.containsKey(key)) {
|
final Object o = this.config.get(key);
|
||||||
return (String) this.config.get(key);
|
if (o != null) {
|
||||||
|
return (String) o;
|
||||||
} else {
|
} else {
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getInt(String key, int def) {
|
public int getInt(String key, int def) {
|
||||||
if (this.config.containsKey(key)) {
|
Object o = this.config.get(key);
|
||||||
if (this.config.get(key) instanceof Number) {
|
if (o != null) {
|
||||||
return ((Number) this.config.get(key)).intValue();
|
if (o instanceof Number) {
|
||||||
|
return ((Number) o).intValue();
|
||||||
} else {
|
} else {
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
@ -164,9 +168,10 @@ public abstract class Config implements ConfigurationProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getDouble(String key, double def) {
|
public double getDouble(String key, double def) {
|
||||||
if (this.config.containsKey(key)) {
|
Object o = this.config.get(key);
|
||||||
if (this.config.get(key) instanceof Number) {
|
if (o != null) {
|
||||||
return ((Number) this.config.get(key)).doubleValue();
|
if (o instanceof Number) {
|
||||||
|
return ((Number) o).doubleValue();
|
||||||
} else {
|
} else {
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
@ -176,8 +181,9 @@ public abstract class Config implements ConfigurationProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<Integer> getIntegerList(String key) {
|
public List<Integer> getIntegerList(String key) {
|
||||||
if (this.config.containsKey(key)) {
|
Object o = this.config.get(key);
|
||||||
return (List<Integer>) this.config.get(key);
|
if (o != null) {
|
||||||
|
return (List<Integer>) o;
|
||||||
} else {
|
} else {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>viaversion-parent</artifactId>
|
<artifactId>viaversion-parent</artifactId>
|
||||||
<groupId>us.myles</groupId>
|
<groupId>us.myles</groupId>
|
||||||
<version>1.5.1-SNAPSHOT</version>
|
<version>1.5.3-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<name>viaversion-jar</name>
|
<name>viaversion-jar</name>
|
||||||
|
2
pom.xml
2
pom.xml
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>us.myles</groupId>
|
<groupId>us.myles</groupId>
|
||||||
<artifactId>viaversion-parent</artifactId>
|
<artifactId>viaversion-parent</artifactId>
|
||||||
<version>1.5.1-SNAPSHOT</version>
|
<version>1.5.3-SNAPSHOT</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<name>viaversion-parent</name>
|
<name>viaversion-parent</name>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>viaversion-parent</artifactId>
|
<artifactId>viaversion-parent</artifactId>
|
||||||
<groupId>us.myles</groupId>
|
<groupId>us.myles</groupId>
|
||||||
<version>1.5.1-SNAPSHOT</version>
|
<version>1.5.3-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>viaversion-parent</artifactId>
|
<artifactId>viaversion-parent</artifactId>
|
||||||
<groupId>us.myles</groupId>
|
<groupId>us.myles</groupId>
|
||||||
<version>1.5.1-SNAPSHOT</version>
|
<version>1.5.3-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -33,8 +33,6 @@ public class HandItemCache implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Item getHandItem(UUID player) {
|
public static Item getHandItem(UUID player) {
|
||||||
if (!handCache.containsKey(player))
|
|
||||||
return null;
|
|
||||||
return handCache.get(player);
|
return handCache.get(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren