forked from GeyserMC/Geyser
BedrockRespawnTranslator: prevent some respawn bugs (#1346)
This commit is contained in:
parent
a5b00e09a1
commit
9bb52afc8a
1 changed files with 27 additions and 6 deletions
|
@ -28,7 +28,10 @@ package org.geysermc.connector.network.translators.bedrock;
|
||||||
import com.github.steveice10.mc.protocol.data.game.ClientRequest;
|
import com.github.steveice10.mc.protocol.data.game.ClientRequest;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientRequestPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientRequestPacket;
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.RespawnPacket;
|
import com.nukkitx.protocol.bedrock.packet.RespawnPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket;
|
||||||
|
import org.geysermc.connector.entity.PlayerEntity;
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
import org.geysermc.connector.network.translators.PacketTranslator;
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
import org.geysermc.connector.network.translators.Translator;
|
import org.geysermc.connector.network.translators.Translator;
|
||||||
|
@ -39,12 +42,30 @@ public class BedrockRespawnTranslator extends PacketTranslator<RespawnPacket> {
|
||||||
@Override
|
@Override
|
||||||
public void translate(RespawnPacket packet, GeyserSession session) {
|
public void translate(RespawnPacket packet, GeyserSession session) {
|
||||||
if (packet.getState() == RespawnPacket.State.CLIENT_READY) {
|
if (packet.getState() == RespawnPacket.State.CLIENT_READY) {
|
||||||
if (!session.isSpawned()) { // Otherwise when immediate respawn is on the client never loads
|
// Previously we only sent the respawn packet before the server finished loading
|
||||||
|
// The message included was 'Otherwise when immediate respawn is on the client never loads'
|
||||||
|
// But I assume the new if statement below fixes that problem
|
||||||
RespawnPacket respawnPacket = new RespawnPacket();
|
RespawnPacket respawnPacket = new RespawnPacket();
|
||||||
respawnPacket.setRuntimeEntityId(0);
|
respawnPacket.setRuntimeEntityId(0);
|
||||||
respawnPacket.setPosition(Vector3f.ZERO);
|
respawnPacket.setPosition(Vector3f.ZERO);
|
||||||
respawnPacket.setState(RespawnPacket.State.SERVER_READY);
|
respawnPacket.setState(RespawnPacket.State.SERVER_READY);
|
||||||
session.sendUpstreamPacket(respawnPacket);
|
session.sendUpstreamPacket(respawnPacket);
|
||||||
|
|
||||||
|
if (session.isSpawned()) {
|
||||||
|
// Client might be stuck; resend spawn information
|
||||||
|
PlayerEntity entity = session.getPlayerEntity();
|
||||||
|
if (entity == null) return;
|
||||||
|
SetEntityDataPacket entityDataPacket = new SetEntityDataPacket();
|
||||||
|
entityDataPacket.setRuntimeEntityId(entity.getGeyserId());
|
||||||
|
entityDataPacket.getMetadata().putAll(entity.getMetadata());
|
||||||
|
session.sendUpstreamPacket(entityDataPacket);
|
||||||
|
|
||||||
|
MovePlayerPacket movePlayerPacket = new MovePlayerPacket();
|
||||||
|
movePlayerPacket.setRuntimeEntityId(entity.getGeyserId());
|
||||||
|
movePlayerPacket.setPosition(entity.getPosition());
|
||||||
|
movePlayerPacket.setRotation(entity.getBedrockRotation());
|
||||||
|
movePlayerPacket.setMode(MovePlayerPacket.Mode.RESPAWN);
|
||||||
|
session.sendUpstreamPacket(movePlayerPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientRequestPacket javaRespawnPacket = new ClientRequestPacket(ClientRequest.RESPAWN);
|
ClientRequestPacket javaRespawnPacket = new ClientRequestPacket(ClientRequest.RESPAWN);
|
||||||
|
|
Loading…
Reference in a new issue