Skip to content

Commit

Permalink
Merge pull request #626 from mircokroon/1_20_2_support
Browse files Browse the repository at this point in the history
1.20.2 + 1.20.3 support
  • Loading branch information
mircokroon authored Feb 8, 2024
2 parents 344488b + 0f9cedc commit 954977d
Show file tree
Hide file tree
Showing 26 changed files with 439 additions and 60 deletions.
2 changes: 2 additions & 0 deletions src/main/java/config/Version.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ public enum Version {
V1_19(759, 3105),
V1_19_3(761, 3218),
V1_20(763, 3463),
V1_20_2(764, 3578),
V1_20_3(765, 3698),
ANY(0, 0);

public final int dataVersion;
Expand Down
18 changes: 2 additions & 16 deletions src/main/java/game/NetworkMode.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,6 @@ public enum NetworkMode {
HANDSHAKE,
STATUS,
LOGIN,
GAME;

@Override
public String toString() {
switch (this) {
case HANDSHAKE:
return "HANDSHAKE";
case STATUS:
return "STATUS";
case LOGIN:
return "LOGIN";
case GAME:
return "GAME";
}
return "";
}
GAME,
CONFIGURATION;
}
4 changes: 2 additions & 2 deletions src/main/java/game/data/chunk/version/Chunk_1_18.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public void readChunkColumn(DataTypeProvider dataProvider) {
}
}

private void findBlockEntities(ChunkSection section, int sectionY) {
protected void findBlockEntities(ChunkSection section, int sectionY) {
BlockEntityRegistry blockEntities = RegistryManager.getInstance().getBlockEntityRegistry();
GlobalPalette globalPalette = GlobalPaletteProvider.getGlobalPalette(getDataVersion());

Expand All @@ -151,7 +151,7 @@ private void findBlockEntities(ChunkSection section, int sectionY) {
}
}

private boolean containsBlockEntities(Palette p) {
protected boolean containsBlockEntities(Palette p) {
BlockEntityRegistry blockEntities = RegistryManager.getInstance().getBlockEntityRegistry();
for (SpecificTag tag : p.toNbt()) {
if (blockEntities.isBlockEntity(tag.get("Name").stringValue())) {
Expand Down
14 changes: 10 additions & 4 deletions src/main/java/game/data/dimension/DimensionCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import game.data.chunk.palette.StateProvider;
import se.llbit.nbt.*;

import java.io.*;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
import java.util.HashMap;
Expand All @@ -16,6 +16,7 @@
*/
public class DimensionCodec {
public static final Gson GSON;

static {
/*
* To convert the properties to JSON, we need to register adapters so that GSON knows how to turn our NBT object
Expand Down Expand Up @@ -56,23 +57,28 @@ public class DimensionCodec {
private final Map<Integer, DimensionType> dimensionTypesByHash;
private final Map<String, DimensionType> dimensionTypesByName;
private final Map<String, Biome> biomes;

private DimensionCodec() {
this.dimensions = new HashMap<>();
this.dimensionTypesByHash = new HashMap<>();
this.dimensionTypesByName = new HashMap<>();
this.biomes = new HashMap<>();
}

public static DimensionCodec fromNbt(String[] dimensionNames, SpecificTag tag) {
public static DimensionCodec fromNbt(SpecificTag tag) {
DimensionCodec codec = new DimensionCodec();

codec.readDimensions(dimensionNames);
codec.readDimensionTypes(tag.get("minecraft:dimension_type").asCompound().get("value").asList());
codec.readBiomes(tag.get("minecraft:worldgen/biome").asCompound().get("value").asList());

return codec;
}

public DimensionCodec setDimensionNames(String[] dimensionNames) {
this.readDimensions(dimensionNames);
return this;
}

public Collection<Dimension> getDimensions() {
return dimensions.values();
}
Expand All @@ -99,7 +105,7 @@ private void readDimensionTypes(ListTag dimensionList) {
String[] parts = identifier.split(":");
String namespace = parts[0];
String name = parts[1];

DimensionType type = new DimensionType(namespace, name, d);
this.dimensionTypesByHash.put(type.getSignature(), type);
this.dimensionTypesByName.put(type.getName(), type);
Expand Down
79 changes: 66 additions & 13 deletions src/main/java/game/data/entity/EntityRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@

import static util.ExceptionHandling.attempt;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
Expand All @@ -18,11 +14,12 @@
import game.data.coordinates.CoordinateDim2D;
import game.data.entity.specific.Villager;
import packets.DataTypeProvider;
import packets.UUID;
import se.llbit.nbt.SpecificTag;

public class EntityRegistry {

private final Map<Integer, PlayerEntity> players;
private final Map<UUID, PlayerEntity> players;
private final Map<CoordinateDim2D, Set<Entity>> perChunk;
private final Map<Integer, Entity> entities;
private final WorldManager worldManager;
Expand Down Expand Up @@ -73,16 +70,71 @@ public void addEntity(DataTypeProvider provider, Function<DataTypeProvider, Enti
});

if (ent instanceof Villager villager) {
WorldManager.getInstance().getVillagerManager().loadPreviousTradeAt(villager);
villager.registerOnTradeUpdate((pos) -> markUnsaved(pos.globalToDimChunk()));
}
}));
}

public void addPlayer(DataTypeProvider provider) {
executor.execute(() -> attempt(() -> {
int entId = provider.readVarInt();
players.put(entId, PlayerEntity.parse(provider));
PlayerEntity player = PlayerEntity.parse(provider);
players.put(player.getUUID(), player);
}));
}

public void updatePlayerAction(DataTypeProvider provider) {
executor.execute(() -> attempt(() -> {
byte actions = provider.readNext();
int playerCnt = provider.readVarInt();

for (int i = 0; i < playerCnt; i++) {
UUID uuid = provider.readUUID();

if ((actions & 0x01) > 0) {
PlayerEntity player = new PlayerEntity(uuid);
players.put(uuid, player);

String name = provider.readString();
int properties = provider.readVarInt();
for (int j = 0; j < properties; j++) {
provider.readString();
provider.readString();
boolean signed = provider.readBoolean();
if (signed) provider.readString();
}
}

if ((actions & 0x02) > 0) {
boolean signature = provider.readBoolean();
if (signature) {
provider.readUUID();
provider.readLong();
int encKeySz = provider.readVarInt();
provider.readByteArray(encKeySz);
int pubKeySz = provider.readVarInt();
provider.readByteArray(pubKeySz);
}
}

if ((actions & 0x04) > 0) {
provider.readVarInt();
}

if ((actions & 0x08) > 0) {
provider.readBoolean();
}

if ((actions & 0x10) > 0) {
provider.readVarInt();
}

if ((actions & 0x20) > 0) {
boolean displayName = provider.readBoolean();
if (displayName) {
provider.readChat();
}
}
}
}));
}

Expand Down Expand Up @@ -139,12 +191,14 @@ public void updatePositionAbsolute(DataTypeProvider provider) {
}

public IMovableEntity getMovableEntity(int entId) {
IMovableEntity ent = players.get(entId);
Entity tmpEnt = entities.get(entId);
if (tmpEnt == null) return null;
IMovableEntity ent = players.get(tmpEnt.uuid);
if (ent != null) {
return ent;
}

return entities.get(entId);
return tmpEnt;
}

public List<SpecificTag> getEntitiesNbt(CoordinateDim2D location) {
Expand Down Expand Up @@ -183,9 +237,8 @@ public void destroyEntities(DataTypeProvider provider) {
while (count-- > 0) {
int id = provider.readVarInt();
if (entities.containsKey(id)) {
players.remove(entities.get(id).uuid);
entities.remove(id);
} else {
players.remove(id);
}
}
}
Expand Down
11 changes: 9 additions & 2 deletions src/main/java/game/data/entity/PlayerEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ public class PlayerEntity implements IMovableEntity {
private boolean hasRequestedName = false;
private String name;

PlayerEntity(UUID uuid) {
this.uuid = uuid;
}

public static PlayerEntity parse(DataTypeProvider provider) {
PlayerEntity ent = new PlayerEntity();
ent.uuid = provider.readUUID();
PlayerEntity ent = new PlayerEntity(provider.readUUID());
ent.readPosition(provider);

return ent;
Expand Down Expand Up @@ -86,4 +89,8 @@ public String getName() {
}
return name;
}

public UUID getUUID() {
return uuid;
}
}
35 changes: 35 additions & 0 deletions src/main/java/game/protocol/ConfigurationProtocol.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package game.protocol;

import config.Config;
import config.Version;

import java.util.HashMap;
import java.util.Map;

public class ConfigurationProtocol extends Protocol {
private final Map<Integer, String> clientBound;
private final Map<Integer, String> serverBound;

public ConfigurationProtocol() {
clientBound = new HashMap<>();
serverBound = new HashMap<>();

if (Config.versionReporter().isAtLeast(Version.V1_20_2)) {
serverBound.put(0x02, "FinishConfiguration");

clientBound.put(0x05, "RegistryData");
} else {
serverBound.put(0x03, "FinishConfiguration");
}
}

@Override
protected String clientBound(int packet) {
return clientBound.getOrDefault(packet, "UNKNOWN");
}

@Override
protected String serverBound(int packet) {
return serverBound.getOrDefault(packet, "UNKNOWN");
}
}
6 changes: 2 additions & 4 deletions src/main/java/game/protocol/HandshakeProtocol.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
import java.util.Map;

public class HandshakeProtocol extends Protocol {
private String version;
private Map<Integer, String> clientBound;
private Map<Integer, String> serverBound;
private final Map<Integer, String> clientBound;
private final Map<Integer, String> serverBound;

public HandshakeProtocol() {
version = "LOGIN";
clientBound = new HashMap<>();
serverBound = new HashMap<>();

Expand Down
6 changes: 2 additions & 4 deletions src/main/java/game/protocol/LoginProtocol.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
import java.util.Map;

public class LoginProtocol extends Protocol {
private String version;
private Map<Integer, String> clientBound;
private Map<Integer, String> serverBound;
private final Map<Integer, String> clientBound;
private final Map<Integer, String> serverBound;

public LoginProtocol() {
version = "LOGIN";
clientBound = new HashMap<>();
serverBound = new HashMap<>();

Expand Down
6 changes: 2 additions & 4 deletions src/main/java/game/protocol/StatusProtocol.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
import java.util.Map;

public class StatusProtocol extends Protocol {
private String version;
private Map<Integer, String> clientBound;
private Map<Integer, String> serverBound;
private final Map<Integer, String> clientBound;
private final Map<Integer, String> serverBound;

public StatusProtocol() {
version = "LOGIN";
clientBound = new HashMap<>();
serverBound = new HashMap<>();
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/packets/DataTypeProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import game.data.coordinates.CoordinateDouble3D;
import packets.version.DataTypeProvider_1_13;
import packets.version.DataTypeProvider_1_14;
import packets.version.DataTypeProvider_1_20_2;
import se.llbit.nbt.NamedTag;
import se.llbit.nbt.SpecificTag;

Expand Down Expand Up @@ -37,6 +38,7 @@ public DataTypeProvider(byte[] finalFullPacket) {

public static DataTypeProvider ofPacket(byte[] finalFullPacket) {
return Config.versionReporter().select(DataTypeProvider.class,
Option.of(Version.V1_20_2, () -> new DataTypeProvider_1_20_2(finalFullPacket)),
Option.of(Version.V1_14, () -> new DataTypeProvider_1_14(finalFullPacket)),
Option.of(Version.V1_13, () -> new DataTypeProvider_1_13(finalFullPacket)),
Option.of(Version.ANY, () -> new DataTypeProvider(finalFullPacket))
Expand Down Expand Up @@ -223,7 +225,7 @@ public double readDouble() {
public UUID readUUID() {
return new UUID(readLong(), readLong());
}

public UUID readOptUUID() {
if (readBoolean()) {
return readUUID();
Expand Down
1 change: 1 addition & 0 deletions src/main/java/packets/builder/PacketBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ public void writeBoolean(boolean val) {

/**
* Writes an NBT tag. We need to wrap this in a NamedTag, as the named tag is not written itself.
* TODO: update on 1.20.2
*/
public void writeNbt(SpecificTag nbt) {
try {
Expand Down
Loading

0 comments on commit 954977d

Please sign in to comment.