Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-26 16:12:42 +01:00
Merge branch 'master' into dev
Dieser Commit ist enthalten in:
Commit
fd8879b46d
@ -56,7 +56,7 @@ public class BungeeDecodeHandler extends MessageToMessageDecoder<ByteBuf> {
|
|||||||
|
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
bytebuf = newPacket;
|
bytebuf = newPacket;
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
// Clear Buffer
|
// Clear Buffer
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
// Release Packet, be free!
|
// Release Packet, be free!
|
||||||
|
@ -60,7 +60,7 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder<ByteBuf> {
|
|||||||
ProtocolInfo protInfo = info.get(ProtocolInfo.class);
|
ProtocolInfo protInfo = info.get(ProtocolInfo.class);
|
||||||
protInfo.getPipeline().transform(Direction.OUTGOING, protInfo.getState(), wrapper);
|
protInfo.getPipeline().transform(Direction.OUTGOING, protInfo.getState(), wrapper);
|
||||||
wrapper.writeToBuffer(bytebuf);
|
wrapper.writeToBuffer(bytebuf);
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
throw e;
|
throw e;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -9,7 +9,12 @@ import java.util.Map;
|
|||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum BlockFace {
|
public enum BlockFace {
|
||||||
NORTH(0, 0, -1, EnumAxis.Z), SOUTH(0, 0, 1, EnumAxis.Z), EAST(1, 0, 0, EnumAxis.X), WEST(-1, 0, 0, EnumAxis.X), TOP(0, 1, 0, EnumAxis.Y), BOTTOM(0, -1, 0, EnumAxis.Y);
|
NORTH(0, 0, -1, EnumAxis.Z),
|
||||||
|
SOUTH(0, 0, 1, EnumAxis.Z),
|
||||||
|
EAST(1, 0, 0, EnumAxis.X),
|
||||||
|
WEST(-1, 0, 0, EnumAxis.X),
|
||||||
|
TOP(0, 1, 0, EnumAxis.Y),
|
||||||
|
BOTTOM(0, -1, 0, EnumAxis.Y);
|
||||||
|
|
||||||
private static Map<BlockFace, BlockFace> opposites = new HashMap<>();
|
private static Map<BlockFace, BlockFace> opposites = new HashMap<>();
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import us.myles.ViaVersion.api.PacketWrapper;
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
import us.myles.ViaVersion.api.Pair;
|
import us.myles.ViaVersion.api.Pair;
|
||||||
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
import us.myles.ViaVersion.api.platform.providers.ViaProviders;
|
import us.myles.ViaVersion.api.platform.providers.ViaProviders;
|
||||||
import us.myles.ViaVersion.api.remapper.PacketRemapper;
|
import us.myles.ViaVersion.api.remapper.PacketRemapper;
|
||||||
@ -14,6 +15,7 @@ import us.myles.ViaVersion.packets.State;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public abstract class Protocol {
|
public abstract class Protocol {
|
||||||
private final Map<Pair<State, Integer>, ProtocolPacket> incoming = new HashMap<>();
|
private final Map<Pair<State, Integer>, ProtocolPacket> incoming = new HashMap<>();
|
||||||
@ -104,7 +106,10 @@ public abstract class Protocol {
|
|||||||
public void registerIncoming(State state, int oldPacketID, int newPacketID, PacketRemapper packetRemapper, boolean override) {
|
public void registerIncoming(State state, int oldPacketID, int newPacketID, PacketRemapper packetRemapper, boolean override) {
|
||||||
ProtocolPacket protocolPacket = new ProtocolPacket(state, oldPacketID, newPacketID, packetRemapper);
|
ProtocolPacket protocolPacket = new ProtocolPacket(state, oldPacketID, newPacketID, packetRemapper);
|
||||||
Pair<State, Integer> pair = new Pair<>(state, newPacketID);
|
Pair<State, Integer> pair = new Pair<>(state, newPacketID);
|
||||||
if (!override && incoming.containsKey(pair)) throw new IllegalArgumentException(pair + " already registered");
|
if (!override && incoming.containsKey(pair)) {
|
||||||
|
Via.getPlatform().getLogger().log(Level.WARNING, pair + " already registered!" +
|
||||||
|
" If this override is intentional, set override to true. Stacktrace: ", new Exception());
|
||||||
|
}
|
||||||
incoming.put(pair, protocolPacket);
|
incoming.put(pair, protocolPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +139,10 @@ public abstract class Protocol {
|
|||||||
public void registerOutgoing(State state, int oldPacketID, int newPacketID, PacketRemapper packetRemapper, boolean override) {
|
public void registerOutgoing(State state, int oldPacketID, int newPacketID, PacketRemapper packetRemapper, boolean override) {
|
||||||
ProtocolPacket protocolPacket = new ProtocolPacket(state, oldPacketID, newPacketID, packetRemapper);
|
ProtocolPacket protocolPacket = new ProtocolPacket(state, oldPacketID, newPacketID, packetRemapper);
|
||||||
Pair<State, Integer> pair = new Pair<>(state, oldPacketID);
|
Pair<State, Integer> pair = new Pair<>(state, oldPacketID);
|
||||||
if (!override && outgoing.containsKey(pair)) throw new IllegalArgumentException(pair + " already registered");
|
if (!override && outgoing.containsKey(pair)) {
|
||||||
|
Via.getPlatform().getLogger().log(Level.WARNING, pair + " already registered!" +
|
||||||
|
" If override is intentional, set override to true. Stacktrace: ", new Exception());
|
||||||
|
}
|
||||||
outgoing.put(pair, protocolPacket);
|
outgoing.put(pair, protocolPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,9 +4,7 @@ import io.netty.buffer.ByteBuf;
|
|||||||
import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection;
|
import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection;
|
||||||
import us.myles.ViaVersion.api.type.Type;
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
import java.nio.ShortBuffer;
|
|
||||||
|
|
||||||
public class ChunkSectionType1_8 extends Type<ChunkSection> {
|
public class ChunkSectionType1_8 extends Type<ChunkSection> {
|
||||||
|
|
||||||
@ -19,12 +17,10 @@ public class ChunkSectionType1_8 extends Type<ChunkSection> {
|
|||||||
ChunkSection chunkSection = new ChunkSection();
|
ChunkSection chunkSection = new ChunkSection();
|
||||||
chunkSection.clearPalette();
|
chunkSection.clearPalette();
|
||||||
|
|
||||||
byte[] blockData = new byte[ChunkSection.SIZE * 2];
|
ByteBuf littleEndianView = buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
buffer.readBytes(blockData);
|
|
||||||
ShortBuffer blockBuf = ByteBuffer.wrap(blockData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
|
|
||||||
|
|
||||||
for (int i = 0; i < ChunkSection.SIZE; i++) {
|
for (int i = 0; i < ChunkSection.SIZE; i++) {
|
||||||
int mask = blockBuf.get();
|
int mask = littleEndianView.readShort();
|
||||||
int type = mask >> 4;
|
int type = mask >> 4;
|
||||||
int data = mask & 0xF;
|
int data = mask & 0xF;
|
||||||
chunkSection.setBlock(i, type, data);
|
chunkSection.setBlock(i, type, data);
|
||||||
|
@ -135,9 +135,9 @@ public class Protocol1_12To1_11_1 extends Protocol {
|
|||||||
if (section == null)
|
if (section == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (int x = 0; x < 16; x++) {
|
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
int block = section.getBlockId(x, y, z);
|
int block = section.getBlockId(x, y, z);
|
||||||
// Is this a bed?
|
// Is this a bed?
|
||||||
if (block == 26) {
|
if (block == 26) {
|
||||||
|
@ -6,6 +6,7 @@ import com.google.gson.JsonObject;
|
|||||||
import us.myles.ViaVersion.api.PacketWrapper;
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
|
import us.myles.ViaVersion.api.minecraft.BlockChangeRecord;
|
||||||
import us.myles.ViaVersion.api.minecraft.BlockFace;
|
import us.myles.ViaVersion.api.minecraft.BlockFace;
|
||||||
import us.myles.ViaVersion.api.minecraft.Position;
|
import us.myles.ViaVersion.api.minecraft.Position;
|
||||||
import us.myles.ViaVersion.api.minecraft.chunks.Chunk;
|
import us.myles.ViaVersion.api.minecraft.chunks.Chunk;
|
||||||
@ -27,15 +28,15 @@ public class ConnectionData {
|
|||||||
static Set<Integer> occludingStates = new HashSet<>();
|
static Set<Integer> occludingStates = new HashSet<>();
|
||||||
|
|
||||||
public static void update(UserConnection user, Position position) {
|
public static void update(UserConnection user, Position position) {
|
||||||
for (int x = -1; x <= 1; x++) {
|
for (BlockFace face : BlockFace.values()) {
|
||||||
for (int z = -1; z <= 1; z++) {
|
Position pos = new Position(
|
||||||
for (int y = -1; y <= 1; y++) {
|
position.getX() + face.getModX(),
|
||||||
if (Math.abs(x) + Math.abs(y) + Math.abs(z) != 1) continue;
|
position.getY() + face.getModY(),
|
||||||
Position pos = new Position(position.getX() + x, position.getY() + y, position.getZ() + z);
|
position.getZ() + face.getModZ()
|
||||||
|
);
|
||||||
int blockState = Via.getManager().getProviders().get(BlockConnectionProvider.class).getBlockdata(user, pos);
|
int blockState = Via.getManager().getProviders().get(BlockConnectionProvider.class).getBlockdata(user, pos);
|
||||||
if (!connects(blockState)) continue;
|
if (!connects(blockState)) continue;
|
||||||
int newBlockState = connect(user, pos, blockState);
|
int newBlockState = connect(user, pos, blockState);
|
||||||
if (newBlockState == blockState) continue;
|
|
||||||
|
|
||||||
PacketWrapper blockUpdatePacket = new PacketWrapper(0x0B, null, user);
|
PacketWrapper blockUpdatePacket = new PacketWrapper(0x0B, null, user);
|
||||||
blockUpdatePacket.write(Type.POSITION, pos);
|
blockUpdatePacket.write(Type.POSITION, pos);
|
||||||
@ -47,7 +48,89 @@ public class ConnectionData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void updateChunkSectionNeighbours(UserConnection user, int chunkX, int chunkZ, int chunkSectionY) {
|
||||||
|
for (int chunkDeltaX = -1; chunkDeltaX <= 1; chunkDeltaX++) {
|
||||||
|
for (int chunkDeltaZ = -1; chunkDeltaZ <= 1; chunkDeltaZ++) {
|
||||||
|
if (Math.abs(chunkDeltaX) + Math.abs(chunkDeltaZ) == 0) continue;
|
||||||
|
|
||||||
|
ArrayList<BlockChangeRecord> updates = new ArrayList<>();
|
||||||
|
|
||||||
|
if (Math.abs(chunkDeltaX) + Math.abs(chunkDeltaZ) == 2) { // Corner
|
||||||
|
for (int blockY = chunkSectionY * 16; blockY < chunkSectionY * 16 + 16; blockY++) {
|
||||||
|
int blockPosX = chunkDeltaX == 1 ? 0 : 15;
|
||||||
|
int blockPosZ = chunkDeltaZ == 1 ? 0 : 15;
|
||||||
|
updateBlock(user,
|
||||||
|
new Position(
|
||||||
|
(long) ((chunkX + chunkDeltaX) << 4) + blockPosX,
|
||||||
|
(long) blockY,
|
||||||
|
(long) ((chunkZ + chunkDeltaZ) << 4) + blockPosZ
|
||||||
|
),
|
||||||
|
updates
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
for (int blockY = chunkSectionY * 16; blockY < chunkSectionY * 16 + 16; blockY++) {
|
||||||
|
int xStart;
|
||||||
|
int xEnd;
|
||||||
|
int zStart;
|
||||||
|
int zEnd;
|
||||||
|
if (chunkDeltaX == 1) {
|
||||||
|
xStart = 0;
|
||||||
|
xEnd = 2;
|
||||||
|
zStart = 0;
|
||||||
|
zEnd = 16;
|
||||||
|
} else if (chunkDeltaX == -1) {
|
||||||
|
xStart = 14;
|
||||||
|
xEnd = 16;
|
||||||
|
zStart = 0;
|
||||||
|
zEnd = 16;
|
||||||
|
} else if (chunkDeltaZ == 1) {
|
||||||
|
xStart = 0;
|
||||||
|
xEnd = 16;
|
||||||
|
zStart = 0;
|
||||||
|
zEnd = 2;
|
||||||
|
} else {
|
||||||
|
xStart = 0;
|
||||||
|
xEnd = 16;
|
||||||
|
zStart = 14;
|
||||||
|
zEnd = 16;
|
||||||
|
}
|
||||||
|
for (int blockX = xStart; blockX < xEnd; blockX++) {
|
||||||
|
for (int blockZ = zStart; blockZ < zEnd; blockZ++) {
|
||||||
|
updateBlock(user,
|
||||||
|
new Position(
|
||||||
|
(long) ((chunkX + chunkDeltaX) << 4) + blockX,
|
||||||
|
(long) blockY,
|
||||||
|
(long) ((chunkZ + chunkDeltaZ) << 4) + blockZ),
|
||||||
|
updates
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!updates.isEmpty()) {
|
||||||
|
PacketWrapper wrapper = new PacketWrapper(0x0F, null, user);
|
||||||
|
wrapper.write(Type.INT, chunkX + chunkDeltaX);
|
||||||
|
wrapper.write(Type.INT, chunkZ + chunkDeltaZ);
|
||||||
|
wrapper.write(Type.BLOCK_CHANGE_RECORD_ARRAY, updates.toArray(new BlockChangeRecord[0]));
|
||||||
|
try {
|
||||||
|
wrapper.send(Protocol1_13To1_12_2.class);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateBlock(UserConnection user, Position pos, List<BlockChangeRecord> records) {
|
||||||
|
int blockState = Via.getManager().getProviders().get(BlockConnectionProvider.class).getBlockdata(user, pos);
|
||||||
|
if (!connects(blockState)) return;
|
||||||
|
int newBlockState = connect(user, pos, blockState);
|
||||||
|
|
||||||
|
records.add(new BlockChangeRecord((short) (((pos.getX() & 0xF) << 4) | (pos.getZ() & 0xF)), pos.getY().shortValue(), newBlockState));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BlockConnectionProvider getProvider() {
|
public static BlockConnectionProvider getProvider() {
|
||||||
@ -93,29 +176,19 @@ public class ConnectionData {
|
|||||||
|
|
||||||
long yOff = i << 4;
|
long yOff = i << 4;
|
||||||
|
|
||||||
for (int x = 0; x < 16; x++) {
|
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
int block = section.getFlatBlock(x, y, z);
|
int block = section.getFlatBlock(x, y, z);
|
||||||
|
|
||||||
if (ConnectionData.connects(block)) {
|
if (ConnectionData.connects(block)) {
|
||||||
block = ConnectionData.connect(user, new Position(xOff + x, yOff + y, zOff + z), block);
|
block = ConnectionData.connect(user, new Position(xOff + x, yOff + y, zOff + z), block);
|
||||||
section.setFlatBlock(x, y, z, block);
|
section.setFlatBlock(x, y, z, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x == 0) {
|
|
||||||
update(user, new Position(xOff - 1, yOff + y, zOff + z));
|
|
||||||
} else if (x == 15) {
|
|
||||||
update(user, new Position(xOff + 16, yOff + y, zOff + z));
|
|
||||||
}
|
|
||||||
if (z == 0) {
|
|
||||||
update(user, new Position(xOff + x, yOff + y, zOff - 1));
|
|
||||||
} else if (z == 15) {
|
|
||||||
update(user, new Position(xOff + x, yOff + y, zOff + 16));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
updateChunkSectionNeighbours(user, chunk.getX(), chunk.getZ(), i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,21 +292,36 @@ public class WorldPackets {
|
|||||||
if (section == null)
|
if (section == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
boolean willStoreAnyBlock = false;
|
|
||||||
|
|
||||||
for (int p = 0; p < section.getPaletteSize(); p++) {
|
for (int p = 0; p < section.getPaletteSize(); p++) {
|
||||||
int old = section.getPaletteEntry(p);
|
int old = section.getPaletteEntry(p);
|
||||||
int newId = toNewId(old);
|
int newId = toNewId(old);
|
||||||
if (storage.isWelcome(newId) || (Via.getConfig().isServersideBlockConnections() && ConnectionData.needStoreBlocks() && ConnectionData.isWelcome(newId))) {
|
|
||||||
willStoreAnyBlock = true;
|
|
||||||
}
|
|
||||||
section.setPaletteEntry(p, newId);
|
section.setPaletteEntry(p, newId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (willStoreAnyBlock) {
|
boolean willSaveToStorage = false;
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int p = 0; p < section.getPaletteSize(); p++) {
|
||||||
|
int newId = section.getPaletteEntry(p);
|
||||||
|
if (storage.isWelcome(newId)) {
|
||||||
|
willSaveToStorage = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean willSaveConnection = false;
|
||||||
|
if (ConnectionData.needStoreBlocks() && Via.getConfig().isServersideBlockConnections()) {
|
||||||
|
for (int p = 0; p < section.getPaletteSize(); p++) {
|
||||||
|
int newId = section.getPaletteEntry(p);
|
||||||
|
if (ConnectionData.isWelcome(newId)) {
|
||||||
|
willSaveConnection = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (willSaveToStorage) {
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
int block = section.getFlatBlock(x, y, z);
|
int block = section.getFlatBlock(x, y, z);
|
||||||
if (storage.isWelcome(block)) {
|
if (storage.isWelcome(block)) {
|
||||||
storage.store(new Position(
|
storage.store(new Position(
|
||||||
@ -315,7 +330,17 @@ public class WorldPackets {
|
|||||||
(long) (z + (chunk.getZ() << 4))
|
(long) (z + (chunk.getZ() << 4))
|
||||||
), block);
|
), block);
|
||||||
}
|
}
|
||||||
if (Via.getConfig().isServersideBlockConnections() && ConnectionData.isWelcome(block)) {
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (willSaveConnection) {
|
||||||
|
for (int y = 0; y < 16; y++) {
|
||||||
|
for (int z = 0; z < 16; z++) {
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
|
int block = section.getFlatBlock(x, y, z);
|
||||||
|
if (ConnectionData.isWelcome(block)) {
|
||||||
ConnectionData.getProvider().storeBlock(wrapper.user(), (long) (x + (chunk.getX() << 4)),
|
ConnectionData.getProvider().storeBlock(wrapper.user(), (long) (x + (chunk.getX() << 4)),
|
||||||
(long) (y + (i << 4)),
|
(long) (y + (i << 4)),
|
||||||
(long) (z + (chunk.getZ() << 4)),
|
(long) (z + (chunk.getZ() << 4)),
|
||||||
|
@ -29,7 +29,11 @@ public class BannerHandler implements BlockEntityProvider.BlockEntityHandler {
|
|||||||
|
|
||||||
int blockId = storage.get(position).getOriginal();
|
int blockId = storage.get(position).getOriginal();
|
||||||
|
|
||||||
int color = (int) tag.get("Base").getValue();
|
Tag base = tag.get("Base");
|
||||||
|
int color = 0;
|
||||||
|
if (base != null) {
|
||||||
|
color = ((Number) tag.get("Base").getValue()).intValue();
|
||||||
|
}
|
||||||
// Standing banner
|
// Standing banner
|
||||||
if (blockId >= BANNER_START && blockId <= BANNER_STOP) {
|
if (blockId >= BANNER_START && blockId <= BANNER_STOP) {
|
||||||
blockId += ((15 - color) * 16);
|
blockId += ((15 - color) * 16);
|
||||||
@ -43,8 +47,10 @@ public class BannerHandler implements BlockEntityProvider.BlockEntityHandler {
|
|||||||
if (tag.get("Patterns") instanceof ListTag) {
|
if (tag.get("Patterns") instanceof ListTag) {
|
||||||
for (Tag pattern : (ListTag) tag.get("Patterns")) {
|
for (Tag pattern : (ListTag) tag.get("Patterns")) {
|
||||||
if (pattern instanceof CompoundTag) {
|
if (pattern instanceof CompoundTag) {
|
||||||
IntTag c = ((CompoundTag) pattern).get("Color");
|
Tag c = ((CompoundTag) pattern).get("Color");
|
||||||
c.setValue(15 - c.getValue()); // Invert color id
|
if (c instanceof IntTag) {
|
||||||
|
((IntTag)c).setValue(15 - (int) c.getValue()); // Invert color id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,10 @@ public class BedHandler implements BlockEntityProvider.BlockEntityHandler {
|
|||||||
// RED_BED + FIRST_BED
|
// RED_BED + FIRST_BED
|
||||||
int blockId = storage.get(position).getOriginal() - 972 + 748;
|
int blockId = storage.get(position).getOriginal() - 972 + 748;
|
||||||
|
|
||||||
int color = (int) tag.get("color").getValue();
|
Tag color = tag.get("color");
|
||||||
blockId += (color * 16);
|
if (color != null) {
|
||||||
|
blockId += (((Number) color.getValue()).intValue() * 16);
|
||||||
|
}
|
||||||
|
|
||||||
return blockId;
|
return blockId;
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,12 @@ public class SkullHandler implements BlockEntityProvider.BlockEntityHandler {
|
|||||||
int id = storage.get(position).getOriginal();
|
int id = storage.get(position).getOriginal();
|
||||||
|
|
||||||
if (id >= SKULL_WALL_START && id <= SKULL_END) {
|
if (id >= SKULL_WALL_START && id <= SKULL_END) {
|
||||||
id += (byte) tag.get("SkullType").getValue() * 20;
|
Tag skullType = tag.get("SkullType");
|
||||||
|
if (skullType != null) {
|
||||||
|
id += ((Number) tag.get("SkullType").getValue()).intValue() * 20;
|
||||||
|
}
|
||||||
if (tag.contains("Rot")) {
|
if (tag.contains("Rot")) {
|
||||||
id += (byte) tag.get("Rot").getValue();
|
id += ((Number) tag.get("Rot").getValue()).intValue();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Via.getPlatform().getLogger().warning("Why does this block have the skull block entity? " + tag);
|
Via.getPlatform().getLogger().warning("Why does this block have the skull block entity? " + tag);
|
||||||
|
@ -91,7 +91,7 @@ public class BlockConnectionStorage extends StoredObject {
|
|||||||
|
|
||||||
public void unloadChunk(int x, int z) {
|
public void unloadChunk(int x, int z) {
|
||||||
for (int y = 0; y < 256; y += 16) {
|
for (int y = 0; y < 256; y += 16) {
|
||||||
blockStorage.remove(getChunkSectionIndex(x, y, z));
|
blockStorage.remove(getChunkSectionIndex(x << 4, y, z << 4));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,9 +85,9 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol {
|
|||||||
if (section == null)
|
if (section == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (int x = 0; x < 16; x++) {
|
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
int block = section.getBlockId(x, y, z);
|
int block = section.getBlockId(x, y, z);
|
||||||
if (FakeTileEntity.hasBlock(block)) {
|
if (FakeTileEntity.hasBlock(block)) {
|
||||||
tags.add(FakeTileEntity.getFromBlock(x + (chunk.getX() << 4), y + (i << 4), z + (chunk.getZ() << 4), block));
|
tags.add(FakeTileEntity.getFromBlock(x + (chunk.getX() << 4), y + (i << 4), z + (chunk.getZ() << 4), block));
|
||||||
|
@ -57,7 +57,7 @@ public class SpongeDecodeHandler extends ByteToMessageDecoder {
|
|||||||
|
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
bytebuf = newPacket;
|
bytebuf = newPacket;
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
// Clear Buffer
|
// Clear Buffer
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
// Release Packet, be free!
|
// Release Packet, be free!
|
||||||
|
@ -53,7 +53,7 @@ public class SpongeEncodeHandler extends MessageToByteEncoder {
|
|||||||
ProtocolInfo protInfo = info.get(ProtocolInfo.class);
|
ProtocolInfo protInfo = info.get(ProtocolInfo.class);
|
||||||
protInfo.getPipeline().transform(Direction.OUTGOING, protInfo.getState(), wrapper);
|
protInfo.getPipeline().transform(Direction.OUTGOING, protInfo.getState(), wrapper);
|
||||||
wrapper.writeToBuffer(bytebuf);
|
wrapper.writeToBuffer(bytebuf);
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
throw e;
|
throw e;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -53,7 +53,7 @@ public class VelocityDecodeHandler extends MessageToMessageDecoder<ByteBuf> {
|
|||||||
|
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
bytebuf = newPacket;
|
bytebuf = newPacket;
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
// Clear Buffer
|
// Clear Buffer
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
// Release Packet, be free!
|
// Release Packet, be free!
|
||||||
|
@ -65,7 +65,7 @@ public class VelocityEncodeHandler extends MessageToMessageEncoder<ByteBuf> {
|
|||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
bytebuf.release();
|
bytebuf.release();
|
||||||
bytebuf = newPacket;
|
bytebuf = newPacket;
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
bytebuf.clear();
|
bytebuf.clear();
|
||||||
bytebuf.release();
|
bytebuf.release();
|
||||||
newPacket.release();
|
newPacket.release();
|
||||||
|
@ -4,11 +4,25 @@ import io.netty.channel.ChannelInitializer;
|
|||||||
import us.myles.ViaVersion.VelocityPlugin;
|
import us.myles.ViaVersion.VelocityPlugin;
|
||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.platform.ViaInjector;
|
import us.myles.ViaVersion.api.platform.ViaInjector;
|
||||||
|
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
|
||||||
import us.myles.ViaVersion.util.ReflectionUtil;
|
import us.myles.ViaVersion.util.ReflectionUtil;
|
||||||
import us.myles.ViaVersion.velocity.handlers.VelocityChannelInitializer;
|
import us.myles.ViaVersion.velocity.handlers.VelocityChannelInitializer;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
|
||||||
public class VelocityViaInjector implements ViaInjector {
|
public class VelocityViaInjector implements ViaInjector {
|
||||||
|
public static Method getPlayerInfoForwardingMode;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
getPlayerInfoForwardingMode = Class.forName("com.velocitypowered.proxy.config.VelocityConfiguration").getMethod("getPlayerInfoForwardingMode");
|
||||||
|
} catch (NoSuchMethodException | ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void inject() throws Exception {
|
public void inject() throws Exception {
|
||||||
Object connectionManager = ReflectionUtil.get(VelocityPlugin.PROXY, "cm", Object.class);
|
Object connectionManager = ReflectionUtil.get(VelocityPlugin.PROXY, "cm", Object.class);
|
||||||
@ -30,6 +44,12 @@ public class VelocityViaInjector implements ViaInjector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int getLowestSupportedProtocolVersion() {
|
public static int getLowestSupportedProtocolVersion() {
|
||||||
|
try {
|
||||||
|
if (getPlayerInfoForwardingMode != null
|
||||||
|
&& ((Enum<?>) getPlayerInfoForwardingMode.invoke(VelocityPlugin.PROXY.getConfiguration()))
|
||||||
|
.name().equals("MODERN")) return ProtocolVersion.v1_13.getId();
|
||||||
|
} catch (IllegalAccessException | InvocationTargetException ignored) {
|
||||||
|
}
|
||||||
return com.velocitypowered.api.network.ProtocolVersion.MINIMUM_VERSION.getProtocol();
|
return com.velocitypowered.api.network.ProtocolVersion.MINIMUM_VERSION.getProtocol();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package us.myles.ViaVersion.velocity.providers;
|
package us.myles.ViaVersion.velocity.providers;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import us.myles.ViaVersion.VelocityPlugin;
|
||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
|
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
|
||||||
@ -8,32 +8,41 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
|||||||
import us.myles.ViaVersion.protocols.base.VersionProvider;
|
import us.myles.ViaVersion.protocols.base.VersionProvider;
|
||||||
import us.myles.ViaVersion.velocity.platform.VelocityViaInjector;
|
import us.myles.ViaVersion.velocity.platform.VelocityViaInjector;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
public class VelocityVersionProvider extends VersionProvider {
|
public class VelocityVersionProvider extends VersionProvider {
|
||||||
private static final List<Integer> VELOCITY_PROTOCOLS = com.velocitypowered.api.network.ProtocolVersion.SUPPORTED_VERSIONS.stream()
|
|
||||||
.map(com.velocitypowered.api.network.ProtocolVersion::getProtocol)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getServerProtocol(UserConnection user) throws Exception {
|
public int getServerProtocol(UserConnection user) throws Exception {
|
||||||
int playerVersion = user.get(ProtocolInfo.class).getProtocolVersion();
|
int playerVersion = user.get(ProtocolInfo.class).getProtocolVersion();
|
||||||
|
|
||||||
|
IntStream versions = com.velocitypowered.api.network.ProtocolVersion.SUPPORTED_VERSIONS.stream()
|
||||||
|
.mapToInt(com.velocitypowered.api.network.ProtocolVersion::getProtocol);
|
||||||
|
|
||||||
|
// Modern forwarding mode needs 1.13 Login plugin message
|
||||||
|
if (VelocityViaInjector.getPlayerInfoForwardingMode != null
|
||||||
|
&& ((Enum<?>) VelocityViaInjector.getPlayerInfoForwardingMode.invoke(VelocityPlugin.PROXY.getConfiguration()))
|
||||||
|
.name().equals("MODERN")) {
|
||||||
|
versions = versions.filter(ver -> ver >= ProtocolVersion.v1_13.getId());
|
||||||
|
}
|
||||||
|
int[] compatibleProtocols = versions.toArray();
|
||||||
|
|
||||||
// Bungee supports it
|
// Bungee supports it
|
||||||
if (Collections.binarySearch(VELOCITY_PROTOCOLS, playerVersion) >= 0)
|
if (Arrays.binarySearch(compatibleProtocols, playerVersion) >= 0)
|
||||||
return playerVersion;
|
return playerVersion;
|
||||||
|
|
||||||
// Older than bungee supports, get the lowest version
|
// Older than bungee supports, get the lowest version
|
||||||
if (playerVersion < VELOCITY_PROTOCOLS.get(0)) {
|
if (playerVersion < compatibleProtocols[0]) {
|
||||||
return VelocityViaInjector.getLowestSupportedProtocolVersion();
|
return compatibleProtocols[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop through all protocols to get the closest protocol id that bungee supports (and that viaversion does too)
|
// Loop through all protocols to get the closest protocol id that bungee supports (and that viaversion does too)
|
||||||
|
|
||||||
// TODO: This needs a better fix, i.e checking ProtocolRegistry to see if it would work.
|
// TODO: This needs a better fix, i.e checking ProtocolRegistry to see if it would work.
|
||||||
// This is more of a workaround for snapshot support by bungee.
|
// This is more of a workaround for snapshot support by bungee.
|
||||||
for (Integer protocol : Lists.reverse(VELOCITY_PROTOCOLS)) {
|
for (int i = compatibleProtocols.length - 1; i >= 0; i--) {
|
||||||
|
int protocol = compatibleProtocols[i];
|
||||||
if (playerVersion > protocol && ProtocolVersion.isRegistered(protocol))
|
if (playerVersion > protocol && ProtocolVersion.isRegistered(protocol))
|
||||||
return protocol;
|
return protocol;
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren