Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
be01c28
Bump snakeyaml from 1.31 to 1.32
dependabot[bot] Dec 14, 2022
f012f16
Merge pull request #5 from Syodo-Development/1.21.30
Buddelbubi Sep 20, 2024
d10dd40
Update ProtocolCodecs.java
Buddelbubi Oct 21, 2024
06b6fa0
Add support for 1.20.40
Alemiz112 Oct 22, 2024
cfc4f11
Add support for 1.20.40
Buddelbubi Oct 23, 2024
dfed930
Merge remote-tracking branch 'upstream/master'
Buddelbubi Oct 23, 2024
4e645e7
Add support for MCBE 1.21.50
Alemiz112 Dec 4, 2024
15fce29
Missed version here
Alemiz112 Dec 4, 2024
e37a322
Set world template fields
Alemiz112 Dec 4, 2024
94476df
Next is v2.0.4
Alemiz112 Dec 4, 2024
71e1e06
Merge remote-tracking branch 'upstream/master'
Buddelbubi Dec 4, 2024
9ecb8cf
fix: fix NPE on early packet send for versions before 1.20.60
Encritary Dec 21, 2024
df1b45d
Update README.md
Buddelbubi Jan 7, 2025
4184b92
?
Buddelbubi Jan 11, 2025
143727b
Add support for 1.21.60
irrld Feb 12, 2025
b6b93d2
Handle ItemComponentPacket to load item definitions after 1.21.60
irrld Feb 12, 2025
a188f38
Fix upload artifact actions (#331)
irrld Feb 12, 2025
d0899b9
Rewrite MovementPredictionSyncPacket
irrld Feb 12, 2025
c62113a
Add support for 1.21.60 (#330)
Alemiz112 Feb 12, 2025
bbbf12e
Fix warnings with build actions
irrld Feb 12, 2025
6faccfe
Fix warnings with build actions (#332)
Alemiz112 Feb 12, 2025
ebacdeb
Fix 1.21.60 protocol codec (#333)
irrld Feb 12, 2025
57fc062
Merge remote-tracking branch 'upstream/master'
Buddelbubi Feb 21, 2025
ef474ed
updated lombok and changed filename
Buddelbubi Feb 21, 2025
66cea5f
Update ProxiedPlayer.java
Buddelbubi Feb 21, 2025
bba15cd
Added support for 1.21.70
irrld Mar 27, 2025
c14fc24
Added 1.21.80 support
irrld May 6, 2025
f987bed
Move ItemComponentPacket handler to AbstractDownstreamHandler
irrld May 7, 2025
cb96ebc
Added support for 1.21.70 and 1.21.80 (#336)
Alemiz112 May 13, 2025
da192af
fix: EventPriority documentation
TobiasGrether May 17, 2025
57a0600
Merge remote-tracking branch 'upstream/master'
Buddelbubi May 26, 2025
a1de737
Fixed maven
Buddelbubi Jun 12, 2025
a3ae592
Fixed Proxy Command injection
Buddelbubi Jun 14, 2025
02e52e1
Added 1.21.90 support
irrld Jun 16, 2025
adf448b
Added support for TokenPayload
irrld Jun 19, 2025
f010105
Added 1.21.93 support
irrld Jul 3, 2025
36cde93
Added 1.21.90 support (#339)
Alemiz112 Jul 8, 2025
96fd869
fix: fix NPE on early packet send for versions before 1.20.60 (#326)
Alemiz112 Jul 8, 2025
77bcb83
Added 1.21.100 support
irrld Aug 5, 2025
6ee2762
Merge remote-tracking branch 'upstream/master'
Buddelbubi Aug 5, 2025
23b6b1e
Code fixes
Buddelbubi Aug 5, 2025
3154ce3
Removed spamming message when using AnyVersion Plugin on PNX
Buddelbubi Aug 18, 2025
27bce81
Add UpdateEquipPacket support to protocol handling
Zwuiix-cmd Sep 15, 2025
15fab6e
Pass through packet violation down to the server
Alemiz112 Sep 15, 2025
40a25fc
Update README.md
irrld Sep 28, 2025
0e432ee
Added 1.21.111 support (#349)
irrld Oct 1, 2025
f3ed2ff
Merge remote-tracking branch 'upstream/master'
Buddelbubi Oct 6, 2025
506c15a
Update HandshakeEntry.java
Buddelbubi Oct 6, 2025
45734ae
Added v1.21.120 support
irrld Oct 28, 2025
3ad5402
Add missing packets to HANDLED_PACKETS
irrld Oct 28, 2025
fb6cdae
Added v1.21.120 support (#355)
irrld Oct 28, 2025
d04630b
Bump snakeyaml from 1.31 to 1.32 (#246)
irrld Oct 28, 2025
bd355d7
Entity ids might be negative
irrld Oct 28, 2025
802d71e
Correctly remove the server from pendingServers in all branches
irrld Oct 28, 2025
641c087
Merge pull request #359 from irrld/master
irrld Oct 28, 2025
be96175
Load camera preset definitions
irrld Oct 29, 2025
e47d392
Merge pull request #360 from irrld/master
irrld Oct 29, 2025
2ff8742
Add option to always send certificate payload to downstream
irrld Oct 30, 2025
13f8f35
Merge remote-tracking branch 'upstream/master'
Buddelbubi Nov 2, 2025
1175258
Update protocol library
irrld Nov 5, 2025
6a0f059
Fix build error
irrld Nov 5, 2025
4104943
Replace the base image with eclipse temurin
irrld Nov 5, 2025
d63a5b0
Merge pull request #7 from WaterdogPE/master
Buddelbubi Nov 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/actions/build/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ runs:
distribution: adopt-hotspot

- name: Setup maven repo
uses: s4u/maven-settings-action@v2.6.0
uses: s4u/maven-settings-action@v3.1.0
if: ${{ inputs.perform_deploy == 'true' }}
with:
servers: |
Expand All @@ -56,7 +56,7 @@ runs:
shell: bash

- name: Upload artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: waterdog
path: target/Waterdog.jar
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM openjdk:17-jdk-slim
FROM eclipse-temurin:17-jdk-jammy

EXPOSE 19132/tcp
EXPOSE 19132/udp
Expand Down
4 changes: 1 addition & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ If you haven't used WaterdogPE before, we recommend you to take a look at our [s
*Please note that the config from the old Waterdog (Bungee) is not compatible with WaterdogPE*

### Supported Software
Our focus lies on PowerNukkitX 2.0 since its the only server software that's worth using. (Besides Nukkit Mot maybe?)

You can find list of currently supported/unsupported software [here](https://docs.waterdog.dev/books/waterdogpe-setup/page/software-compatibility).
Our focus lies on PowerNukkitX since its the only server software that's worth using.

## Compiling

Expand Down
14 changes: 4 additions & 10 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
</description>
<groupId>xyz.syodo.software</groupId>
<artifactId>syodogpe</artifactId>
<version>2.0.0</version>
<version>2.0.4</version>
<packaging>jar</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
<raklib.version>1.0.0.CR3-SNAPSHOT</raklib.version>
<protocol.version>3.0.0.Beta5-SNAPSHOT</protocol.version>
<protocol.version>3.0.0.Beta11-SNAPSHOT</protocol.version>
<log4j2.version>2.17.1</log4j2.version>
<jline.version>3.23.0</jline.version>
<netty.version>4.1.101.Final</netty.version>
Expand Down Expand Up @@ -67,7 +67,7 @@
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.31</version>
<version>1.32</version>
<scope>compile</scope>
</dependency>
<dependency>
Expand All @@ -85,7 +85,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<version>1.18.34</version>
<scope>compile</scope>
</dependency>
<dependency>
Expand Down Expand Up @@ -135,12 +135,6 @@
<version>${jline.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.1.0-jre</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.minecrell</groupId>
<artifactId>terminalconsoleappender</artifactId>
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/dev/waterdog/waterdogpe/VersionInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ public class VersionInfo {

public static final boolean DEFAULT_DEBUG = true;

private final String baseVersion = "2.0.2";
private final String buildVersion = "syo";
private final String author = "WaterdogTEAM, Syodo Development";
private final String baseVersion = "2.0.4";
private final String buildVersion = "#build";
private final String author = "WaterdogTEAM";
private final int metricsId = 15678;
private final int latestProtocolVersion;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
/**
* Represents the Priority of an event.
* Default event priority, if not specific otherwise, is NORMAL.
* HIGHEST is called first,
* LOWEST is called last.
* LOWEST is called first,
* HIGHEST is called last.
*/
public enum EventPriority {
LOWEST,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,20 @@
@AsyncEvent
public class PlayerDisconnectedEvent extends PlayerEvent {

private final String reason;
private final CharSequence reason;

public PlayerDisconnectedEvent(ProxiedPlayer player, String reason) {
public PlayerDisconnectedEvent(ProxiedPlayer player, CharSequence reason) {
super(player);

this.reason = reason;
}


public String getReason() {
return this.getReason(String.class);
}

public <T extends CharSequence> T getReason(Class<T> type) {
return type.cast(this.reason);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import lombok.Setter;

import java.security.KeyPair;
import java.util.UUID;

/**
* Called right when we decoded the player's LoginPacket data in the handshake(HandshakeUpstreamHandler).
Expand All @@ -32,13 +33,20 @@ public class PreClientDataSetEvent extends Event {

private final ProxiedConnection connection;
private final JsonObject clientData;
private final JsonObject extraData;
@Getter
private final String xuid;
@Getter
private final UUID uuid;
@Getter
private final String displayName;
@Setter
private KeyPair keyPair;

public PreClientDataSetEvent(JsonObject clientData, JsonObject extraData, KeyPair keyPair, ProxiedConnection playerSession) {
public PreClientDataSetEvent(JsonObject clientData, String xuid, UUID uuid, String displayName, KeyPair keyPair, ProxiedConnection playerSession) {
this.clientData = clientData;
this.extraData = extraData;
this.xuid = xuid;
this.uuid = uuid;
this.displayName = displayName;
this.connection = playerSession;
this.keyPair = keyPair;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public void sendPacketImmediately(BedrockPacket packet) {
}

@Override
public void disconnect(String reason, boolean hideReason) {
public void disconnect(CharSequence reason, boolean hideReason) {
this.checkForClosed();

DisconnectPacket packet = new DisconnectPacket();
Expand Down Expand Up @@ -128,8 +128,10 @@ public BedrockPacketHandler getPacketHandler() {
return this.packetHandler;
}

public void addDisconnectListener(Consumer<String> listener) {
this.getPeer().getChannel().closeFuture().addListener(future -> listener.accept(this.getDisconnectReason()));
public void addDisconnectListener(Consumer<CharSequence> listener) {
this.getPeer().getChannel().closeFuture().addListener(future -> {
listener.accept(this.getDisconnectReason());
});
}

public int getSubClientId() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,8 @@ public void sendPacket(BedrockBatchWrapper wrapper) {
private void sendPacket0(BedrockBatchWrapper wrapper) {
if (!(wrapper.getAlgorithm() instanceof PacketCompressionAlgorithm)) {
wrapper.setCompressed(null); // Do not allow using unsupported algorithms when sending to client
} else if (this.version.isBefore(ProtocolVersion.MINECRAFT_PE_1_20_60) &&
!Objects.equals(wrapper.getAlgorithm(), this.compressionStrategy.getDefaultCompression().getAlgorithm())) {
} else if (this.version.isBefore(ProtocolVersion.MINECRAFT_PE_1_20_60) && (this.compressionStrategy == null ||
!Objects.equals(wrapper.getAlgorithm(), this.compressionStrategy.getDefaultCompression().getAlgorithm()))) {
wrapper.setCompressed(null); // Before 1.20.60 dynamic compression is not supported
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,20 @@ public class ProtocolCodecs {
HANDLED_PACKETS.add(LevelChunkPacket.class);
HANDLED_PACKETS.add(ClientCheatAbilityPacket.class);
HANDLED_PACKETS.add(ToastRequestPacket.class);
HANDLED_PACKETS.add(MovementEffectPacket.class);
HANDLED_PACKETS.add(PlaySoundPacket.class);
HANDLED_PACKETS.add(PlayerAuthInputPacket.class);
HANDLED_PACKETS.add(ModalFormRequestPacket.class);
HANDLED_PACKETS.add(ModalFormResponsePacket.class);
HANDLED_PACKETS.add(BlockEntityDataPacket.class);

HANDLED_PACKETS.add(InventoryTransactionPacket.class);
HANDLED_PACKETS.add(ClientboundCloseFormPacket.class);
HANDLED_PACKETS.add(UpdateEquipPacket.class);
HANDLED_PACKETS.add(CameraInstructionPacket.class);
HANDLED_PACKETS.add(MovementPredictionSyncPacket.class);
HANDLED_PACKETS.add(PlayerUpdateEntityOverridesPacket.class);
HANDLED_PACKETS.add(PlayerLocationPacket.class);
HANDLED_PACKETS.add(CameraPresetsPacket.class);
}

private static final List<ProtocolCodecUpdater> UPDATERS = new ObjectArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,16 @@
import org.cloudburstmc.protocol.bedrock.codec.v686.Bedrock_v686;
import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712;
import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766;
import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776;
import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786;
import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800;
import org.cloudburstmc.protocol.bedrock.codec.v818.Bedrock_v818;
import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819;
import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827;
import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844;
import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859;

@ToString(exclude = {"defaultCodec", "bedrockCodec"})
public enum ProtocolVersion {
Expand Down Expand Up @@ -112,7 +122,20 @@ public enum ProtocolVersion {
MINECRAFT_PE_1_21_0(685, Bedrock_v685.CODEC),
MINECRAFT_PE_1_21_2(686, Bedrock_v686.CODEC),
MINECRAFT_PE_1_21_20(712, Bedrock_v712.CODEC),
MINECRAFT_PE_1_21_30(729, Bedrock_v729.CODEC);
MINECRAFT_PE_1_21_30(729, Bedrock_v729.CODEC),
MINECRAFT_PE_1_21_40(748, Bedrock_v748.CODEC),
MINECRAFT_PE_1_21_50_29(765, 766, Bedrock_v766.CODEC),
MINECRAFT_PE_1_21_50(766, Bedrock_v766.CODEC),
MINECRAFT_PE_1_21_60(776, Bedrock_v776.CODEC),
MINECRAFT_PE_1_21_70(786, Bedrock_v786.CODEC),
MINECRAFT_PE_1_21_80(800, Bedrock_v800.CODEC),
MINECRAFT_PE_1_21_90(818, Bedrock_v818.CODEC),
MINECRAFT_PE_1_21_93(819, Bedrock_v819.CODEC),
MINECRAFT_PE_1_21_100(827, Bedrock_v827.CODEC),
MINECRAFT_PE_1_21_110(843, 844, Bedrock_v844.CODEC),
MINECRAFT_PE_1_21_111(844, Bedrock_v844.CODEC),
MINECRAFT_PE_1_21_120(859, Bedrock_v859.CODEC),
;

private static final ProtocolVersion[] VALUES = values();
private static final Int2ObjectMap<ProtocolVersion> VERSIONS = new Int2ObjectOpenHashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.cloudburstmc.protocol.bedrock.netty.BedrockPacketWrapper;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler;
import org.cloudburstmc.protocol.bedrock.packet.DisconnectPacket;
import org.cloudburstmc.protocol.common.PacketSignal;
import org.cloudburstmc.protocol.common.util.Preconditions;

Expand All @@ -53,7 +54,11 @@ public void onBedrockBatch(ProxiedConnection source, BedrockBatchWrapper batch)
while (iterator.hasNext()) {
BedrockPacketWrapper wrapper = iterator.next();
if (wrapper.getPacket() == null) {
this.decodePacket(wrapper, source.getPacketDirection());
try {
this.decodePacket(wrapper, source.getPacketDirection());
} catch (Exception e) {
source.sendPacket(new DisconnectPacket());
}
}

PacketSignal signal = this.handlePacket(wrapper.getPacket());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,21 @@
import dev.waterdog.waterdogpe.network.protocol.rewrite.RewriteMaps;
import dev.waterdog.waterdogpe.player.ProxiedPlayer;
import dev.waterdog.waterdogpe.network.protocol.Signals;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper;
import org.cloudburstmc.protocol.bedrock.data.camera.CameraPreset;
import org.cloudburstmc.protocol.bedrock.data.command.CommandData;
import org.cloudburstmc.protocol.bedrock.data.command.CommandEnumConstraint;
import org.cloudburstmc.protocol.bedrock.data.command.CommandEnumData;
import org.cloudburstmc.protocol.bedrock.data.command.*;
import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition;
import org.cloudburstmc.protocol.bedrock.data.definitions.SimpleNamedDefinition;
import org.cloudburstmc.protocol.bedrock.netty.BedrockBatchWrapper;
import org.cloudburstmc.protocol.bedrock.packet.*;
import org.cloudburstmc.protocol.common.NamedDefinition;
import org.cloudburstmc.protocol.common.PacketSignal;
import org.cloudburstmc.protocol.common.SimpleDefinitionRegistry;

import java.util.*;
import java.util.function.Consumer;
Expand All @@ -42,6 +53,18 @@ public AbstractDownstreamHandler(ProxiedPlayer player, ClientConnection connecti
this.connection = connection;
}

@Override
public PacketSignal handle(ItemComponentPacket packet) {
if (!this.player.acceptItemComponentPacket()) {
return Signals.CANCEL;
}
player.setAcceptItemComponentPacket(false);
if (this.player.getProtocol().isAfterOrEqual(ProtocolVersion.MINECRAFT_PE_1_21_60)) {
setItemDefinitions(packet.getItems());
}
return PacketSignal.UNHANDLED;
}

@Override
public void sendProxiedBatch(BedrockBatchWrapper batch) {
if (this.player.getConnection().isConnected()) {
Expand All @@ -68,6 +91,7 @@ public PacketSignal handle(AvailableCommandsPacket packet) {

for (Command command : this.player.getProxy().getCommandMap().getCommands().values()) {
if (command.getPermission() == null || this.player.hasPermission(command.getPermission())) {
packet.getCommands().stream().filter(commandData -> commandData.getName().equalsIgnoreCase(command.getName())).findFirst().ifPresent(commandData -> packet.getCommands().remove(commandData));
packet.getCommands().add(command.getCommandData());
}
}
Expand All @@ -80,7 +104,6 @@ public PacketSignal handle(AvailableCommandsPacket packet) {
ListIterator<CommandData> iterator = packet.getCommands().listIterator();
while (iterator.hasNext()) {
CommandData command = iterator.next();

if (command.getAliases() != null) {
continue;
}
Expand All @@ -96,6 +119,16 @@ public PacketSignal handle(AvailableCommandsPacket packet) {
Collections.emptyList(),
command.getOverloads()));
}

for(CommandData command : packet.getCommands()) {
for(CommandOverloadData overload : command.getOverloads()) {
for(CommandParamData param : overload.getOverloads()) {
if(param.getType() == null) {
param.setType(CommandParam.UNKNOWN);
}
}
}
}
return PacketSignal.HANDLED;
}

Expand All @@ -119,6 +152,12 @@ public PacketSignal handle(ClientCacheMissResponsePacket packet) {
return PacketSignal.UNHANDLED;
}

@Override
public PacketSignal handle(CameraPresetsPacket packet) {
setCameraPresetDefinitions(packet.getPresets());
return PacketSignal.UNHANDLED;
}

protected PacketSignal onPlayStatus(PlayStatusPacket packet, Consumer<String> failedTask, ClientConnection connection) {
String message;
switch (packet.getStatus()) {
Expand Down Expand Up @@ -148,4 +187,32 @@ public RewriteMaps getRewriteMaps() {
public ClientConnection getConnection() {
return connection;
}

protected void setItemDefinitions(Collection<ItemDefinition> definitions) {
BedrockCodecHelper codecHelper = this.player.getConnection()
.getPeer()
.getCodecHelper();
SimpleDefinitionRegistry.Builder<ItemDefinition> itemRegistry = SimpleDefinitionRegistry.builder();
IntSet runtimeIds = new IntOpenHashSet();
for (ItemDefinition definition : definitions) {
if (runtimeIds.add(definition.getRuntimeId())) {
itemRegistry.add(definition);
} else {
player.getLogger().warning("[{}|{}] has duplicate item definition: {}", this.player.getName(), this.connection.getServerInfo().getServerName(), definition);
}
}
codecHelper.setItemDefinitions(itemRegistry.build());
}

protected void setCameraPresetDefinitions(Collection<CameraPreset> presets) {
BedrockCodecHelper codecHelper = this.player.getConnection()
.getPeer()
.getCodecHelper();
SimpleDefinitionRegistry.Builder<NamedDefinition> registry = SimpleDefinitionRegistry.builder();
int id = 0;
for (CameraPreset preset : presets) {
registry.add(new SimpleNamedDefinition(preset.getIdentifier(), id++));
}
codecHelper.setCameraPresetDefinitions(registry.build());
}
}
Loading