Skip to content

Commit 8935b34

Browse files
committed
Ensure players aren't floating in their beds; improve Bedrock sleeping notifications
1 parent 63e60bc commit 8935b34

File tree

5 files changed

+50
-12
lines changed

5 files changed

+50
-12
lines changed

core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@
4242
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
4343
import org.cloudburstmc.protocol.bedrock.data.entity.EntityLinkData;
4444
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
45-
import org.cloudburstmc.protocol.bedrock.packet.*;
45+
import org.cloudburstmc.protocol.bedrock.packet.AddPlayerPacket;
46+
import org.cloudburstmc.protocol.bedrock.packet.MovePlayerPacket;
47+
import org.cloudburstmc.protocol.bedrock.packet.SetEntityDataPacket;
48+
import org.cloudburstmc.protocol.bedrock.packet.SetEntityLinkPacket;
49+
import org.cloudburstmc.protocol.bedrock.packet.UpdateAttributesPacket;
4650
import org.geysermc.geyser.api.entity.type.player.GeyserPlayerEntity;
4751
import org.geysermc.geyser.entity.EntityDefinitions;
4852
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
@@ -278,7 +282,13 @@ public void updateRotation(float yaw, float pitch, float headYaw, boolean isOnGr
278282

279283
@Override
280284
public void setPosition(Vector3f position) {
281-
super.setPosition(position.add(0, definition.offset(), 0));
285+
if (this.bedPosition != null) {
286+
// As of Bedrock 1.21.22 and Fabric 1.21.1
287+
// Messes with Bedrock if we send this to the client itself, though.
288+
super.setPosition(position.up(0.2f));
289+
} else {
290+
super.setPosition(position.add(0, definition.offset(), 0));
291+
}
282292
}
283293

284294
@Override

core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public void setPosition(Vector3f position) {
140140
if (valid) { // Don't update during session init
141141
session.getCollisionManager().updatePlayerBoundingBox(position);
142142
}
143-
super.setPosition(position);
143+
this.position = position.add(0, definition.offset(), 0);
144144
}
145145

146146
/**

core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.cloudburstmc.protocol.bedrock.BedrockDisconnectReasons;
3030
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
3131
import org.cloudburstmc.protocol.bedrock.codec.compat.BedrockCompat;
32-
import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622;
3332
import org.cloudburstmc.protocol.bedrock.data.ExperimentData;
3433
import org.cloudburstmc.protocol.bedrock.data.PacketCompressionAlgorithm;
3534
import org.cloudburstmc.protocol.bedrock.data.ResourcePackType;

core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockMovePlayerTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void translate(GeyserSession session, MovePlayerPacket packet) {
6161

6262
if (entity.getBedPosition() != null) {
6363
// https://github.com/GeyserMC/Geyser/issues/5001
64-
// Bedrock 1.20.22 started sending a MovePlayerPacket as soon as it got into a bed.
64+
// Bedrock 1.21.22 started sending a MovePlayerPacket as soon as it got into a bed.
6565
// This trips up Fabric.
6666
return;
6767
}

core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaSystemChatTranslator.java

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,56 @@
2525

2626
package org.geysermc.geyser.translator.protocol.java;
2727

28-
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket;
2928
import net.kyori.adventure.text.TranslatableComponent;
29+
import org.cloudburstmc.nbt.NbtMap;
30+
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
31+
import org.cloudburstmc.protocol.bedrock.packet.LevelEventGenericPacket;
3032
import org.cloudburstmc.protocol.bedrock.packet.TextPacket;
3133
import org.geysermc.geyser.session.GeyserSession;
3234
import org.geysermc.geyser.text.ChatColor;
3335
import org.geysermc.geyser.text.GeyserLocale;
3436
import org.geysermc.geyser.translator.protocol.PacketTranslator;
3537
import org.geysermc.geyser.translator.protocol.Translator;
3638
import org.geysermc.geyser.translator.text.MessageTranslator;
39+
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket;
3740

3841
@Translator(packet = ClientboundSystemChatPacket.class)
3942
public class JavaSystemChatTranslator extends PacketTranslator<ClientboundSystemChatPacket> {
4043

4144
@Override
4245
public void translate(GeyserSession session, ClientboundSystemChatPacket packet) {
43-
if (packet.getContent() instanceof TranslatableComponent component && component.key().equals("chat.disabled.missingProfileKey")) {
44-
// We likely got this message as a response to a player trying to chat
45-
// As there SHOULD be no false flags for this, print every time it shows up in chat.
46-
if (Boolean.parseBoolean(System.getProperty("Geyser.PrintSecureChatInformation", "true"))) {
47-
session.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.chat.secure_info_1", session.locale()));
48-
session.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.chat.secure_info_2", session.locale(), "https://geysermc.link/secure-chat"));
46+
if (packet.getContent() instanceof TranslatableComponent component) {
47+
if (component.key().equals("chat.disabled.missingProfileKey")) {
48+
// We likely got this message as a response to a player trying to chat
49+
// As there SHOULD be no false flags for this, print every time it shows up in chat.
50+
if (Boolean.parseBoolean(System.getProperty("Geyser.PrintSecureChatInformation", "true"))) {
51+
session.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.chat.secure_info_1", session.locale()));
52+
session.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.chat.secure_info_2", session.locale(), "https://geysermc.link/secure-chat"));
53+
}
54+
} else if (component.key().equals("sleep.players_sleeping")) {
55+
if (component.arguments().size() == 2) {
56+
// Hack FYI, but it allows Bedrock players to easily understand this information
57+
// without it being covered up or saying the night is being slept through.
58+
int numPlayersSleeping = ((Number) component.arguments().get(0).value()).intValue();
59+
int totalPlayersNeeded = ((Number) component.arguments().get(1).value()).intValue();
60+
LevelEventGenericPacket sleepInfoPacket = new LevelEventGenericPacket();
61+
sleepInfoPacket.setType(LevelEvent.SLEEPING_PLAYERS);
62+
sleepInfoPacket.setTag(NbtMap.builder()
63+
.putInt("ableToSleep", totalPlayersNeeded)
64+
.putInt("overworldPlayerCount", totalPlayersNeeded)
65+
.putInt("sleepingPlayerCount", numPlayersSleeping)
66+
.build());
67+
session.sendUpstreamPacket(sleepInfoPacket);
68+
}
69+
} else if (component.key().equals("sleep.skipping_night")) {
70+
LevelEventGenericPacket sleepInfoPacket = new LevelEventGenericPacket();
71+
sleepInfoPacket.setType(LevelEvent.SLEEPING_PLAYERS);
72+
sleepInfoPacket.setTag(NbtMap.builder()
73+
.putInt("ableToSleep", 1)
74+
.putInt("overworldPlayerCount", 1)
75+
.putInt("sleepingPlayerCount", 1)
76+
.build());
77+
session.sendUpstreamPacket(sleepInfoPacket);
4978
}
5079
}
5180

0 commit comments

Comments
 (0)