Skip to content

Commit 138ab2c

Browse files
authored
Merge pull request #824 from GeyserMC/feature/1.21
1.21
2 parents 97b68ed + f9cc9ee commit 138ab2c

31 files changed

+419
-93
lines changed

protocol/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ plugins {
22
id("mcprotocollib.publish-conventions")
33
}
44

5-
version = "1.20.6-2-SNAPSHOT"
5+
version = "1.21-SNAPSHOT"
66
description = "MCProtocolLib is a simple library for communicating with Minecraft clients and servers."
77

88
dependencies {

protocol/src/main/java/org/geysermc/mcprotocollib/protocol/MinecraftProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ public Class<? extends Packet> getServerboundClass(int id) {
250250

251251
public static NbtMap loadNetworkCodec() {
252252
try (InputStream inputStream = Objects.requireNonNull(MinecraftProtocol.class.getClassLoader().getResourceAsStream("networkCodec.nbt"))) {
253-
return (NbtMap) NbtUtils.createGZIPReader(inputStream).readTag();
253+
return (NbtMap) NbtUtils.createGZIPReader(inputStream).readTag(512);
254254
} catch (Exception e) {
255255
throw new AssertionError("Unable to load network codec.", e);
256256
}

protocol/src/main/java/org/geysermc/mcprotocollib/protocol/codec/MinecraftCodec.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import org.geysermc.mcprotocollib.protocol.data.game.level.sound.BuiltinSound;
88
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundCookieRequestPacket;
99
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundCustomPayloadPacket;
10+
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundCustomReportDetailsPacket;
1011
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundDisconnectPacket;
1112
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundKeepAlivePacket;
1213
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundPingPacket;
1314
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundResourcePackPopPacket;
1415
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundResourcePackPushPacket;
16+
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundServerLinksPacket;
1517
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundStoreCookiePacket;
1618
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundTransferPacket;
1719
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket;
@@ -223,9 +225,9 @@ public class MinecraftCodec {
223225
}
224226

225227
public static final PacketCodec CODEC = PacketCodec.builder()
226-
.protocolVersion(766)
228+
.protocolVersion(767)
227229
.helper(() -> new MinecraftCodecHelper(LEVEL_EVENTS, SOUND_NAMES))
228-
.minecraftVersion("1.20.6")
230+
.minecraftVersion("1.21")
229231
.state(ProtocolState.HANDSHAKE, PacketStateCodec.builder()
230232
.registerServerboundPacket(ClientIntentionPacket.class, ClientIntentionPacket::new)
231233
)
@@ -262,6 +264,8 @@ public class MinecraftCodec {
262264
.registerClientboundPacket(ClientboundUpdateEnabledFeaturesPacket.class, ClientboundUpdateEnabledFeaturesPacket::new)
263265
.registerClientboundPacket(ClientboundUpdateTagsPacket.class, ClientboundUpdateTagsPacket::new)
264266
.registerClientboundPacket(ClientboundSelectKnownPacks.class, ClientboundSelectKnownPacks::new)
267+
.registerClientboundPacket(ClientboundCustomReportDetailsPacket.class, ClientboundCustomReportDetailsPacket::new)
268+
.registerClientboundPacket(ClientboundServerLinksPacket.class, ClientboundServerLinksPacket::new)
265269
.registerServerboundPacket(ServerboundClientInformationPacket.class, ServerboundClientInformationPacket::new)
266270
.registerServerboundPacket(ServerboundCookieResponsePacket.class, ServerboundCookieResponsePacket::new)
267271
.registerServerboundPacket(ServerboundCustomPayloadPacket.class, ServerboundCustomPayloadPacket::new)
@@ -393,6 +397,8 @@ public class MinecraftCodec {
393397
.registerClientboundPacket(ClientboundUpdateRecipesPacket.class, ClientboundUpdateRecipesPacket::new)
394398
.registerClientboundPacket(ClientboundUpdateTagsPacket.class, ClientboundUpdateTagsPacket::new)
395399
.registerClientboundPacket(ClientboundProjectilePowerPacket.class, ClientboundProjectilePowerPacket::new)
400+
.registerClientboundPacket(ClientboundCustomReportDetailsPacket.class, ClientboundCustomReportDetailsPacket::new)
401+
.registerClientboundPacket(ClientboundServerLinksPacket.class, ClientboundServerLinksPacket::new)
396402
.registerServerboundPacket(ServerboundAcceptTeleportationPacket.class, ServerboundAcceptTeleportationPacket::new)
397403
.registerServerboundPacket(ServerboundBlockEntityTagQueryPacket.class, ServerboundBlockEntityTagQueryPacket::new)
398404
.registerServerboundPacket(ServerboundChangeDifficultyPacket.class, ServerboundChangeDifficultyPacket::new)

protocol/src/main/java/org/geysermc/mcprotocollib/protocol/codec/MinecraftCodecHelper.java

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.geysermc.mcprotocollib.network.codec.BasePacketCodecHelper;
2222
import org.geysermc.mcprotocollib.protocol.data.DefaultComponentSerializer;
2323
import org.geysermc.mcprotocollib.protocol.data.game.Holder;
24+
import org.geysermc.mcprotocollib.protocol.data.game.chat.ChatType;
25+
import org.geysermc.mcprotocollib.protocol.data.game.chat.ChatTypeDecoration;
2426
import org.geysermc.mcprotocollib.protocol.data.game.chat.numbers.BlankFormat;
2527
import org.geysermc.mcprotocollib.protocol.data.game.chat.numbers.FixedFormat;
2628
import org.geysermc.mcprotocollib.protocol.data.game.chat.numbers.NumberFormat;
@@ -42,9 +44,11 @@
4244
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.EntityMetadata;
4345
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.GlobalPos;
4446
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.MetadataType;
47+
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.PaintingVariant;
4548
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose;
4649
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.SnifferState;
4750
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.VillagerData;
51+
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.WolfVariant;
4852
import org.geysermc.mcprotocollib.protocol.data.game.entity.object.Direction;
4953
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.BlockBreakStage;
5054
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
@@ -92,6 +96,7 @@
9296
import java.util.HashMap;
9397
import java.util.List;
9498
import java.util.Map;
99+
import java.util.Set;
95100
import java.util.UUID;
96101
import java.util.function.BiConsumer;
97102
import java.util.function.Function;
@@ -477,12 +482,56 @@ public void writePose(ByteBuf buf, Pose pose) {
477482
this.writeEnum(buf, pose);
478483
}
479484

480-
public PaintingType readPaintingType(ByteBuf buf) {
481-
return PaintingType.from(this.readVarInt(buf));
485+
public Holder<WolfVariant> readWolfVariant(ByteBuf buf) {
486+
return this.readHolder(buf, input -> {
487+
Key wildTexture = this.readResourceLocation(input);
488+
Key tameTexture = this.readResourceLocation(input);
489+
Key angryTexture = this.readResourceLocation(input);
490+
Key biomeLocation = null;
491+
int[] biomeHolders = null;
492+
493+
int length = this.readVarInt(input) - 1;
494+
if (length == -1) {
495+
biomeLocation = this.readResourceLocation(input);
496+
} else {
497+
biomeHolders = new int[length];
498+
for (int j = 0; j < length; j++) {
499+
biomeHolders[j] = this.readVarInt(input);
500+
}
501+
}
502+
return new WolfVariant(wildTexture, tameTexture, angryTexture, biomeLocation, biomeHolders);
503+
});
504+
}
505+
506+
public void writeWolfVariant(ByteBuf buf, Holder<WolfVariant> variantHolder) {
507+
this.writeHolder(buf, variantHolder, (output, variant) -> {
508+
this.writeResourceLocation(output, variant.wildTexture());
509+
this.writeResourceLocation(output, variant.tameTexture());
510+
this.writeResourceLocation(output, variant.angryTexture());
511+
if (variant.biomeLocation() != null) {
512+
this.writeVarInt(output, 0);
513+
this.writeResourceLocation(output, variant.biomeLocation());
514+
} else {
515+
this.writeVarInt(output, variant.biomeHolders().length + 1);
516+
for (int holder : variant.biomeHolders()) {
517+
this.writeVarInt(output, holder);
518+
}
519+
}
520+
});
482521
}
483522

484-
public void writePaintingType(ByteBuf buf, PaintingType type) {
485-
this.writeEnum(buf, type);
523+
public Holder<PaintingVariant> readPaintingVariant(ByteBuf buf) {
524+
return this.readHolder(buf, input -> {
525+
return new PaintingVariant(this.readVarInt(input), this.readVarInt(input), this.readResourceLocation(input));
526+
});
527+
}
528+
529+
public void writePaintingVariant(ByteBuf buf, Holder<PaintingVariant> variantHolder) {
530+
this.writeHolder(buf, variantHolder, (output, variant) -> {
531+
this.writeVarInt(buf, variant.width());
532+
this.writeVarInt(buf, variant.height());
533+
this.writeResourceLocation(buf, variant.assetId());
534+
});
486535
}
487536

488537
public SnifferState readSnifferState(ByteBuf buf) {
@@ -717,6 +766,39 @@ public void writeNumberFormat(ByteBuf buf, NumberFormat numberFormat) {
717766
}
718767
}
719768

769+
public ChatType readChatType(ByteBuf buf) {
770+
return new ChatType(readChatTypeDecoration(buf), readChatTypeDecoration(buf));
771+
}
772+
773+
public void writeChatType(ByteBuf buf, ChatType chatType) {
774+
this.writeChatTypeDecoration(buf, chatType.chat());
775+
this.writeChatTypeDecoration(buf, chatType.narration());
776+
}
777+
778+
public ChatTypeDecoration readChatTypeDecoration(ByteBuf buf) {
779+
String translationKey = this.readString(buf);
780+
781+
int size = this.readVarInt(buf);
782+
List<ChatTypeDecoration.Parameter> parameters = new ArrayList<>(size);
783+
for (int i = 0; i < size; i++) {
784+
parameters.add(ChatTypeDecoration.Parameter.VALUES[this.readVarInt(buf)]);
785+
}
786+
787+
NbtMap style = this.readCompoundTag(buf);
788+
return new ChatType.ChatTypeDecorationImpl(translationKey, parameters, style);
789+
}
790+
791+
public void writeChatTypeDecoration(ByteBuf buf, ChatTypeDecoration decoration) {
792+
this.writeString(buf, decoration.translationKey());
793+
794+
this.writeVarInt(buf, decoration.parameters().size());
795+
for (ChatTypeDecoration.Parameter parameter : decoration.parameters()) {
796+
this.writeVarInt(buf, parameter.ordinal());
797+
}
798+
799+
this.writeAnyTag(buf, decoration.style());
800+
}
801+
720802
public PositionSource readPositionSource(ByteBuf buf) {
721803
PositionSourceType type = PositionSourceType.from(this.readVarInt(buf));
722804
return switch (type) {

protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/Holder.java

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.geysermc.mcprotocollib.protocol.data.game;
22

33
import java.util.function.Consumer;
4+
import java.util.function.IntConsumer;
5+
import java.util.function.IntFunction;
46

57
/**
68
* Represents an object that could either be a network ID, or a custom-defined one.
@@ -22,9 +24,14 @@ static <T> Holder<T> ofCustom(T object) {
2224

2325
T custom();
2426

25-
Holder<T> ifId(Consumer<Holder<T>> action);
27+
Holder<T> ifId(IntConsumer action);
2628

27-
Holder<T> ifCustom(Consumer<Holder<T>> action);
29+
Holder<T> ifCustom(Consumer<T> action);
30+
31+
/**
32+
* Returns the holder as an object, or else looks up the item in the registry.
33+
*/
34+
T getOrCompute(IntFunction<T> supplier);
2835

2936
record IdHolder<T>(int id) implements Holder<T> {
3037
@Override
@@ -43,16 +50,21 @@ public T custom() {
4350
}
4451

4552
@Override
46-
public Holder<T> ifId(Consumer<Holder<T>> action) {
47-
action.accept(this);
53+
public Holder<T> ifId(IntConsumer action) {
54+
action.accept(id);
4855
return this;
4956
}
5057

5158
@Override
52-
public Holder<T> ifCustom(Consumer<Holder<T>> action) {
59+
public Holder<T> ifCustom(Consumer<T> action) {
5360
// no-op
5461
return this;
5562
}
63+
64+
@Override
65+
public T getOrCompute(IntFunction<T> supplier) {
66+
return supplier.apply(id);
67+
}
5668
}
5769

5870
record CustomHolder<T>(T object) implements Holder<T> {
@@ -77,14 +89,19 @@ public T custom() {
7789
}
7890

7991
@Override
80-
public Holder<T> ifId(Consumer<Holder<T>> action) {
92+
public Holder<T> ifId(IntConsumer action) {
8193
return this;
8294
}
8395

8496
@Override
85-
public Holder<T> ifCustom(Consumer<Holder<T>> action) {
86-
action.accept(this);
97+
public Holder<T> ifCustom(Consumer<T> action) {
98+
action.accept(object);
8799
return this;
88100
}
101+
102+
@Override
103+
public T getOrCompute(IntFunction<T> supplier) {
104+
return object;
105+
}
89106
}
90107
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.geysermc.mcprotocollib.protocol.data.game;
2+
3+
import net.kyori.adventure.text.Component;
4+
import org.jetbrains.annotations.Nullable;
5+
6+
public record ServerLink(@Nullable ServerLinkType knownType, @Nullable Component unknownType, String link) {
7+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.geysermc.mcprotocollib.protocol.data.game;
2+
3+
public enum ServerLinkType {
4+
BUG_REPORT,
5+
COMMUNITY_GUIDELINES,
6+
SUPPORT,
7+
STATUS,
8+
FEEDBACK,
9+
COMMUNITY,
10+
WEBSITE,
11+
FORUMS,
12+
NEWS,
13+
ANNOUNCEMENTS;
14+
15+
private static final ServerLinkType[] VALUES = values();
16+
17+
public static ServerLinkType from(int id) {
18+
return VALUES[id];
19+
}
20+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.geysermc.mcprotocollib.protocol.data.game.chat;
2+
3+
import org.cloudburstmc.nbt.NbtMap;
4+
5+
import java.util.List;
6+
7+
public record ChatType(ChatTypeDecoration chat, ChatTypeDecoration narration) {
8+
public record ChatTypeDecorationImpl(String translationKey,
9+
List<ChatTypeDecoration.Parameter> parameters,
10+
NbtMap style) implements ChatTypeDecoration {
11+
}
12+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.geysermc.mcprotocollib.protocol.data.game.chat;
2+
3+
import org.cloudburstmc.nbt.NbtMap;
4+
5+
import java.util.List;
6+
7+
// Here for implementation if one wants to cache the Style tag while we don't have DFU Codecs.
8+
public interface ChatTypeDecoration {
9+
String translationKey();
10+
11+
List<Parameter> parameters();
12+
13+
NbtMap style();
14+
15+
enum Parameter {
16+
CONTENT,
17+
SENDER,
18+
TARGET;
19+
20+
public static final Parameter[] VALUES = values();
21+
}
22+
}

protocol/src/main/java/org/geysermc/mcprotocollib/protocol/data/game/entity/attribute/AttributeModifier.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,18 @@
22

33
import lombok.Data;
44
import lombok.NonNull;
5+
import net.kyori.adventure.key.Key;
56

67
import java.util.UUID;
78

89
@Data
910
public class AttributeModifier {
10-
/**
11-
* Use {@link ModifierType} to determine built-in modifiers.
12-
*/
13-
private final @NonNull UUID uuid;
11+
private final @NonNull Key id;
1412
private final double amount;
1513
private final @NonNull ModifierOperation operation;
1614

17-
public AttributeModifier(@NonNull UUID uuid, double amount, @NonNull ModifierOperation operation) {
18-
this.uuid = uuid;
15+
public AttributeModifier(@NonNull Key id, double amount, @NonNull ModifierOperation operation) {
16+
this.id = id;
1917
this.amount = amount;
2018
this.operation = operation;
2119
}

0 commit comments

Comments
 (0)