diff --git a/README.md b/README.md
index 7f9ba1cbf..07bc30ce3 100644
--- a/README.md
+++ b/README.md
@@ -11,9 +11,9 @@ Geyser is a bridge between Minecraft: Bedrock Edition and Minecraft: Java Editio
## What is Geyser?
Geyser is a proxy, bridging the gap between Minecraft: Bedrock Edition and Minecraft: Java Edition servers.
-The ultimate goal of this project is to allow Minecraft: Bedrock Edition users to join Minecraft: Java Edition servers as seamlessly as possible.
+The ultimate goal of this project is to allow Minecraft: Bedrock Edition users to join Minecraft: Java Edition servers as seamlessly as possible. **Please note, this project is still a work in progress and should not be used on production. Expect bugs!**
-### Please note, this project is still a work in progress and should not be used on production. Expect bugs!
+### Currently supporting Minecraft Bedrock v1.14.X and Minecraft Java v1.15.2.
## Setting Up
Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set up Geyser.
@@ -35,7 +35,6 @@ Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set
- Block Particles
- Block Entities ([`block-entities`](https://github.com/GeyserMC/Geyser/tree/block-entities))
- Some Entity Flags
-- Proper Movement
- Support to be Ran as a Plugin ([`plugin`](https://github.com/GeyserMC/Geyser/tree/plugin))
## Compiling
diff --git a/connector/pom.xml b/connector/pom.xml
index d97c03c36..31bbcc4b6 100644
--- a/connector/pom.xml
+++ b/connector/pom.xml
@@ -39,7 +39,7 @@
com.nukkitx.protocol
bedrock-v389
- 2.4.4
+ 2.5.1
compile
diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java
index 37c64db36..177d0d7a9 100644
--- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java
+++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java
@@ -30,7 +30,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.MetadataType;
import com.github.steveice10.mc.protocol.data.message.TextMessage;
import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.EntityData;
-import com.nukkitx.protocol.bedrock.data.EntityDataDictionary;
+import com.nukkitx.protocol.bedrock.data.EntityDataMap;
import com.nukkitx.protocol.bedrock.data.EntityFlag;
import com.nukkitx.protocol.bedrock.data.EntityFlags;
import com.nukkitx.protocol.bedrock.packet.*;
@@ -67,7 +67,6 @@ public class Entity {
protected Vector3f rotation;
protected float scale = 1;
- protected boolean movePending;
protected EntityType entityType;
@@ -75,20 +74,20 @@ public class Entity {
protected LongSet passengers = new LongOpenHashSet();
protected Map attributes = new HashMap<>();
- protected EntityDataDictionary metadata = new EntityDataDictionary();
+ protected EntityDataMap metadata = new EntityDataMap();
public Entity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) {
this.entityId = entityId;
this.geyserId = geyserId;
this.entityType = entityType;
- this.position = position;
this.motion = motion;
this.rotation = rotation;
this.valid = false;
- this.movePending = false;
this.dimension = 0;
+ setPosition(position);
+
metadata.put(EntityData.SCALE, 1f);
metadata.put(EntityData.MAX_AIR, (short) 400);
metadata.put(EntityData.AIR, (short) 0);
@@ -134,25 +133,40 @@ public class Entity {
return true;
}
- public void moveRelative(double relX, double relY, double relZ, float yaw, float pitch) {
- moveRelative(relX, relY, relZ, Vector3f.from(yaw, pitch, yaw));
+ public void moveRelative(GeyserSession session, double relX, double relY, double relZ, float yaw, float pitch, boolean isOnGround) {
+ moveRelative(session, relX, relY, relZ, Vector3f.from(yaw, pitch, yaw), isOnGround);
}
- public void moveRelative(double relX, double relY, double relZ, Vector3f rotation) {
+ public void moveRelative(GeyserSession session, double relX, double relY, double relZ, Vector3f rotation, boolean isOnGround) {
setRotation(rotation);
this.position = Vector3f.from(position.getX() + relX, position.getY() + relY, position.getZ() + relZ);
- this.movePending = true;
+
+ MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
+ moveEntityPacket.setRuntimeEntityId(geyserId);
+ moveEntityPacket.setPosition(position);
+ moveEntityPacket.setRotation(getBedrockRotation());
+ moveEntityPacket.setOnGround(isOnGround);
+ moveEntityPacket.setTeleported(false);
+
+ session.getUpstream().sendPacket(moveEntityPacket);
}
- public void moveAbsolute(Vector3f position, float yaw, float pitch) {
- moveAbsolute(position, Vector3f.from(yaw, pitch, yaw));
+ public void moveAbsolute(GeyserSession session, Vector3f position, float yaw, float pitch, boolean isOnGround) {
+ moveAbsolute(session, position, Vector3f.from(yaw, pitch, yaw), isOnGround);
}
- public void moveAbsolute(Vector3f position, Vector3f rotation) {
+ public void moveAbsolute(GeyserSession session, Vector3f position, Vector3f rotation, boolean isOnGround) {
setPosition(position);
setRotation(rotation);
- this.movePending = true;
+ MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket();
+ moveEntityPacket.setRuntimeEntityId(geyserId);
+ moveEntityPacket.setPosition(position);
+ moveEntityPacket.setRotation(getBedrockRotation());
+ moveEntityPacket.setOnGround(isOnGround);
+ moveEntityPacket.setTeleported(false);
+
+ session.getUpstream().sendPacket(moveEntityPacket);
}
public void updateBedrockAttributes(GeyserSession session) {
@@ -218,14 +232,6 @@ public class Entity {
session.getUpstream().sendPacket(entityDataPacket);
}
- public void setPosition(Vector3f position) {
- if (is(PlayerEntity.class)) {
- this.position = position.add(0, entityType.getOffset(), 0);
- return;
- }
- this.position = position;
- }
-
/**
* x = Pitch, y = HeadYaw, z = Yaw
*/
diff --git a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java
index 9d8786e3b..56d59ec3d 100644
--- a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java
+++ b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java
@@ -27,7 +27,10 @@ package org.geysermc.connector.entity;
import com.github.steveice10.mc.auth.data.GameProfile;
import com.nukkitx.math.vector.Vector3f;
+import com.nukkitx.protocol.bedrock.data.CommandPermission;
+import com.nukkitx.protocol.bedrock.data.PlayerPermission;
import com.nukkitx.protocol.bedrock.packet.AddPlayerPacket;
+import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket;
import com.nukkitx.protocol.bedrock.packet.PlayerListPacket;
import lombok.Getter;
@@ -76,11 +79,8 @@ public class PlayerEntity extends LivingEntity {
addPlayerPacket.setRotation(getBedrockRotation());
addPlayerPacket.setMotion(motion);
addPlayerPacket.setHand(hand);
- addPlayerPacket.setPlayerFlags(0);
- addPlayerPacket.setCommandPermission(0);
- addPlayerPacket.setWorldFlags(0);
- addPlayerPacket.setPlayerPermission(0);
- addPlayerPacket.setCustomFlags(0);
+ addPlayerPacket.getAdventureSettings().setCommandPermission(CommandPermission.NORMAL);
+ addPlayerPacket.getAdventureSettings().setPlayerPermission(PlayerPermission.VISITOR);
addPlayerPacket.setDeviceId("");
addPlayerPacket.setPlatformChatId("");
addPlayerPacket.getMetadata().putAll(metadata);
@@ -96,7 +96,7 @@ public class PlayerEntity extends LivingEntity {
if (getLastSkinUpdate() == -1) {
if (playerList) {
PlayerListPacket playerList = new PlayerListPacket();
- playerList.setType(PlayerListPacket.Type.ADD);
+ playerList.setAction(PlayerListPacket.Action.ADD);
playerList.getEntries().add(SkinUtils.buildDefaultEntry(profile, geyserId));
session.getUpstream().sendPacket(playerList);
}
@@ -112,10 +112,44 @@ public class PlayerEntity extends LivingEntity {
// remove from playerlist if player isn't on playerlist
GeyserConnector.getInstance().getGeneralThreadPool().execute(() -> {
PlayerListPacket playerList = new PlayerListPacket();
- playerList.setType(PlayerListPacket.Type.REMOVE);
+ playerList.setAction(PlayerListPacket.Action.REMOVE);
playerList.getEntries().add(new PlayerListPacket.Entry(uuid));
session.getUpstream().sendPacket(playerList);
});
}
}
+
+ @Override
+ public void moveAbsolute(GeyserSession session, Vector3f position, Vector3f rotation, boolean isOnGround) {
+ setPosition(position);
+ setRotation(rotation);
+
+ MovePlayerPacket movePlayerPacket = new MovePlayerPacket();
+ movePlayerPacket.setRuntimeEntityId(geyserId);
+ movePlayerPacket.setPosition(this.position);
+ movePlayerPacket.setRotation(getBedrockRotation());
+ movePlayerPacket.setOnGround(isOnGround);
+ movePlayerPacket.setMode(MovePlayerPacket.Mode.NORMAL);
+
+ session.getUpstream().sendPacket(movePlayerPacket);
+ }
+
+ @Override
+ public void moveRelative(GeyserSession session, double relX, double relY, double relZ, Vector3f rotation, boolean isOnGround) {
+ setRotation(rotation);
+ this.position = Vector3f.from(position.getX() + relX, position.getY() + relY, position.getZ() + relZ);
+
+ MovePlayerPacket movePlayerPacket = new MovePlayerPacket();
+ movePlayerPacket.setRuntimeEntityId(geyserId);
+ movePlayerPacket.setPosition(position);
+ movePlayerPacket.setRotation(getBedrockRotation());
+ movePlayerPacket.setOnGround(isOnGround);
+ movePlayerPacket.setMode(MovePlayerPacket.Mode.NORMAL);
+ session.getUpstream().sendPacket(movePlayerPacket);
+ }
+
+ @Override
+ public void setPosition(Vector3f position) {
+ this.position = position.add(0, entityType.getOffset(), 0);
+ }
}
diff --git a/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java b/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java
index 6dd77d739..1beb8ab8f 100644
--- a/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java
+++ b/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java
@@ -43,7 +43,7 @@ public class ArmorStandEntity extends LivingEntity {
public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession session) {
if (entityMetadata.getType() == MetadataType.BYTE) {
byte xd = (byte) entityMetadata.getValue();
- if((xd & 0x01) == 0x01 && !(metadata.get(EntityData.SCALE).equals(0.0f))) {
+ if ((xd & 0x01) == 0x01 && (metadata.get(EntityData.SCALE) != null && !metadata.get(EntityData.SCALE).equals(0.0f))) {
metadata.put(EntityData.SCALE, .55f);
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java
index 313e7adcf..91b3ebd40 100644
--- a/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java
+++ b/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java
@@ -192,11 +192,6 @@ public class LoggingPacketHandler implements BedrockPacketHandler {
return defaultHandler(packet);
}
- @Override
- public boolean handle(LevelSoundEvent3Packet packet) {
- return defaultHandler(packet);
- }
-
@Override
public boolean handle(MapInfoRequestPacket packet) {
return defaultHandler(packet);
diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
index ab3b2c041..330ef0ac5 100644
--- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
+++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
@@ -35,14 +35,16 @@ import com.github.steveice10.packetlib.Client;
import com.github.steveice10.packetlib.event.session.*;
import com.github.steveice10.packetlib.packet.Packet;
import com.github.steveice10.packetlib.tcp.TcpSessionFactory;
+import com.nukkitx.math.GenericMath;
+import com.nukkitx.math.TrigMath;
import com.nukkitx.math.vector.Vector2f;
-import com.nukkitx.math.vector.Vector2i;
import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.nbt.tag.CompoundTag;
import com.nukkitx.protocol.bedrock.BedrockServerSession;
import com.nukkitx.protocol.bedrock.data.GamePublishSetting;
-import com.nukkitx.protocol.bedrock.data.GameRule;
+import com.nukkitx.protocol.bedrock.data.GameRuleData;
+import com.nukkitx.protocol.bedrock.data.PlayerPermission;
import com.nukkitx.protocol.bedrock.packet.*;
import lombok.Getter;
@@ -71,6 +73,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
@Getter
public class GeyserSession implements CommandSender {
@@ -93,9 +96,6 @@ public class GeyserSession implements CommandSender {
private DataCache javaPacketCache;
- @Setter
- private Vector2i lastChunkPosition = null;
- @Setter
private int renderDistance;
private boolean loggedIn;
@@ -108,6 +108,13 @@ public class GeyserSession implements CommandSender {
@Setter
private GameMode gameMode = GameMode.SURVIVAL;
+ private final AtomicInteger pendingDimSwitches = new AtomicInteger(0);
+ @Setter
+ private boolean sprinting;
+
+ @Setter
+ private boolean jumping;
+
@Setter
private boolean switchingDimension = false;
private boolean manyDimPackets = false;
@@ -321,6 +328,16 @@ public class GeyserSession implements CommandSender {
windowCache.showWindow(window, id);
}
+ public void setRenderDistance(int renderDistance) {
+ renderDistance = GenericMath.ceil(++renderDistance * TrigMath.SQRT_OF_TWO); //square to circle
+ if (renderDistance > 32) renderDistance = 32; // <3 u ViaVersion but I don't like crashing clients x)
+ this.renderDistance = renderDistance;
+
+ ChunkRadiusUpdatedPacket chunkRadiusUpdatedPacket = new ChunkRadiusUpdatedPacket();
+ chunkRadiusUpdatedPacket.setRadius(renderDistance);
+ upstream.sendPacket(chunkRadiusUpdatedPacket);
+ }
+
public InetSocketAddress getSocketAddress() {
return this.upstream.getAddress();
}
@@ -351,7 +368,7 @@ public class GeyserSession implements CommandSender {
startGamePacket.setLightningLevel(0);
startGamePacket.setMultiplayerGame(true);
startGamePacket.setBroadcastingToLan(true);
- startGamePacket.getGamerules().add(new GameRule<>("showcoordinates", true));
+ startGamePacket.getGamerules().add(new GameRuleData<>("showcoordinates", true));
startGamePacket.setPlatformBroadcastMode(GamePublishSetting.PUBLIC);
startGamePacket.setXblBroadcastMode(GamePublishSetting.PUBLIC);
startGamePacket.setCommandsEnabled(true);
@@ -359,7 +376,7 @@ public class GeyserSession implements CommandSender {
startGamePacket.setBonusChestEnabled(false);
startGamePacket.setStartingWithMap(false);
startGamePacket.setTrustingPlayers(true);
- startGamePacket.setDefaultPlayerPermission(1);
+ startGamePacket.setDefaultPlayerPermission(PlayerPermission.OPERATOR);
startGamePacket.setServerChunkTickRange(4);
startGamePacket.setBehaviorPackLocked(false);
startGamePacket.setResourcePackLocked(false);
diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java
index 2834cb909..bbd714e2f 100644
--- a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java
+++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java
@@ -55,7 +55,6 @@ public class EntityCache {
}
public void spawnEntity(Entity entity) {
- entity.moveAbsolute(entity.getPosition(), entity.getRotation().getX(), entity.getRotation().getY());
cacheEntity(entity);
entity.spawnEntity(session);
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java
index 2abeebb8e..1268e3273 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java
@@ -27,10 +27,7 @@ package org.geysermc.connector.network.translators;
import com.github.steveice10.mc.protocol.packet.ingame.server.*;
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.*;
-import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerActionAckPacket;
-import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket;
-import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket;
-import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerSetExperiencePacket;
+import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.*;
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.*;
import com.github.steveice10.mc.protocol.packet.ingame.server.scoreboard.ServerDisplayScoreboardPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.scoreboard.ServerScoreboardObjectivePacket;
@@ -129,8 +126,7 @@ public class TranslatorsInit {
Registry.registerJava(ServerPlayerHealthPacket.class, new JavaPlayerHealthTranslator());
Registry.registerJava(ServerPlayerActionAckPacket.class, new JavaPlayerActionAckTranslator());
- // FIXME: This translator messes with allowing flight in creative mode. Will need to be addressed later
- // Registry.registerJava(ServerPlayerAbilitiesPacket.class, new JavaPlayerAbilitiesTranslator());
+ Registry.registerJava(ServerPlayerAbilitiesPacket.class, new JavaPlayerAbilitiesTranslator());
Registry.registerJava(ServerNotifyClientPacket.class, new JavaNotifyClientTranslator());
Registry.registerJava(ServerChunkDataPacket.class, new JavaChunkDataTranslator());
@@ -146,6 +142,9 @@ public class TranslatorsInit {
Registry.registerJava(ServerMultiBlockChangePacket.class, new JavaMultiBlockChangeTranslator());
Registry.registerJava(ServerUnloadChunkPacket.class, new JavaUnloadChunkTranslator());
+ Registry.registerJava(ServerUpdateViewPositionPacket.class, new JavaUpdateViewPositionTranslator());
+ Registry.registerJava(ServerUpdateViewDistancePacket.class, new JavaUpdateViewDistanceTranslator());
+
Registry.registerJava(ServerOpenWindowPacket.class, new OpenWindowPacketTranslator());
Registry.registerBedrock(AnimatePacket.class, new BedrockAnimateTranslator());
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java
index e5bec6983..98a580ee3 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java
@@ -40,6 +40,8 @@ import org.geysermc.connector.entity.Entity;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.PacketTranslator;
+import java.util.concurrent.TimeUnit;
+
public class BedrockActionTranslator extends PacketTranslator {
@Override
@@ -80,10 +82,12 @@ public class BedrockActionTranslator extends PacketTranslator {
+ session.setJumping(false);
+ }, 1, TimeUnit.SECONDS);
break;
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java
index 67d398f6f..ab73e9bb1 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java
@@ -44,12 +44,12 @@ public class BedrockInteractTranslator extends PacketTranslator
return;
switch (packet.getAction()) {
- case 1:
+ case INTERACT:
ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
InteractAction.INTERACT, Hand.MAIN_HAND);
session.getDownstream().getSession().send(interactPacket);
break;
- case 2:
+ case DAMAGE:
ClientPlayerInteractEntityPacket attackPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
InteractAction.ATTACK, Hand.MAIN_HAND);
session.getDownstream().getSession().send(attackPacket);
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java
index 120689763..0f13eff8b 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java
@@ -26,6 +26,7 @@
package org.geysermc.connector.network.translators.bedrock;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket;
+import com.nukkitx.math.GenericMath;
import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket;
import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket;
@@ -43,7 +44,7 @@ public class BedrockMovePlayerTranslator extends PacketTranslator 0) return;
if (!session.getUpstream().isInitialized()) {
MoveEntityAbsolutePacket moveEntityBack = new MoveEntityAbsolutePacket();
@@ -63,16 +64,15 @@ public class BedrockMovePlayerTranslator extends PacketTranslator {
@Override
public void translate(RespawnPacket packet, GeyserSession session) {
- if (packet.getSpawnState() == RespawnPacket.State.CLIENT_READY) {
+ if (packet.getState() == RespawnPacket.State.CLIENT_READY) {
RespawnPacket respawnPacket = new RespawnPacket();
respawnPacket.setRuntimeEntityId(0);
respawnPacket.setPosition(Vector3f.ZERO);
- respawnPacket.setSpawnState(RespawnPacket.State.SERVER_SEARCHING);
+ respawnPacket.setState(RespawnPacket.State.SERVER_SEARCHING);
session.getUpstream().sendPacket(respawnPacket);
ClientRequestPacket javaRespawnPacket = new ClientRequestPacket(ClientRequest.RESPAWN);
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java
index 4c0bc819a..8308db2ed 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java
@@ -66,7 +66,7 @@ public class BlockTranslator {
Map blockStateMap = new HashMap<>();
for (CompoundTag tag : blocksTag.getValue()) {
- if (blockStateMap.putIfAbsent(tag.getAsCompound("block"), tag) != null) {
+ if (blockStateMap.putIfAbsent(tag.getCompound("block"), tag) != null) {
throw new AssertionError("Duplicate block states in Bedrock palette");
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GenericInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GenericInventoryTranslator.java
index 8f74c4ddd..754d05c67 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GenericInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GenericInventoryTranslator.java
@@ -67,8 +67,8 @@ public class GenericInventoryTranslator extends InventoryTranslator {
public void updateSlot(GeyserSession session, Inventory inventory, int slot) {
InventorySlotPacket slotPacket = new InventorySlotPacket();
slotPacket.setContainerId(inventory.getId());
- slotPacket.setSlot(TranslatorsInit.getItemTranslator().translateToBedrock(inventory.getItems()[slot]));
- slotPacket.setInventorySlot(slot);
+ slotPacket.setItem(TranslatorsInit.getItemTranslator().translateToBedrock(inventory.getItems()[slot]));
+ slotPacket.setSlot(slot);
session.getUpstream().sendPacket(slotPacket);
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java
index c918c0d5b..bfde6f74c 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java
@@ -46,7 +46,7 @@ public class JavaBossBarTranslator extends PacketTranslator
long entityId = session.getEntityCache().addBossBar(packet.getUuid());
addBossEntity(session, entityId);
- bossEventPacket.setType(BossEventPacket.Type.SHOW);
+ bossEventPacket.setAction(BossEventPacket.Action.SHOW);
bossEventPacket.setBossUniqueEntityId(entityId);
bossEventPacket.setTitle(MessageUtils.getBedrockMessage(packet.getTitle()));
bossEventPacket.setHealthPercentage(packet.getHealth());
@@ -55,15 +55,15 @@ public class JavaBossBarTranslator extends PacketTranslator
bossEventPacket.setDarkenSky(0);
break;
case UPDATE_TITLE:
- bossEventPacket.setType(BossEventPacket.Type.TITLE);
+ bossEventPacket.setAction(BossEventPacket.Action.TITLE);
bossEventPacket.setTitle(MessageUtils.getBedrockMessage(packet.getTitle()));
break;
case UPDATE_HEALTH:
- bossEventPacket.setType(BossEventPacket.Type.HEALTH_PERCENTAGE);
+ bossEventPacket.setAction(BossEventPacket.Action.HEALTH_PERCENTAGE);
bossEventPacket.setHealthPercentage(packet.getHealth());
break;
case REMOVE:
- bossEventPacket.setType(BossEventPacket.Type.HIDE);
+ bossEventPacket.setAction(BossEventPacket.Action.HIDE);
removeBossEntity(session, session.getEntityCache().removeBossBar(packet.getUuid()));
break;
case UPDATE_STYLE:
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java
index 97cf35e5c..51758011e 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java
@@ -27,10 +27,12 @@ package org.geysermc.connector.network.translators.java;
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket;
+import com.nukkitx.protocol.bedrock.data.PlayerPermission;
import com.nukkitx.protocol.bedrock.packet.*;
import org.geysermc.connector.entity.PlayerEntity;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.PacketTranslator;
+import org.geysermc.connector.utils.ChunkUtils;
import org.geysermc.connector.utils.DimensionUtils;
public class JavaJoinGameTranslator extends PacketTranslator {
@@ -42,7 +44,7 @@ public class JavaJoinGameTranslator extends PacketTranslator 32) session.setRenderDistance(32); // <3 u ViaVersion but I don't like crashing clients x)
-
- ChunkRadiusUpdatedPacket chunkRadiusPacket = new ChunkRadiusUpdatedPacket();
- chunkRadiusPacket.setRadius(session.getRenderDistance());
- session.getUpstream().sendPacket(chunkRadiusPacket);
+ session.setRenderDistance(packet.getViewDistance());
if (DimensionUtils.javaToBedrock(packet.getDimension()) != entity.getDimension()) {
- DimensionUtils.switchDimension(session, packet.getDimension(), false);
+ ChunkUtils.sendEmptyChunks(session, entity.getPosition().toInt(), 3, true);
+ DimensionUtils.switchDimension(session, packet.getDimension());
}
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java
index 8a6432e51..285f9d855 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java
@@ -51,14 +51,15 @@ public class JavaRespawnTranslator extends PacketTranslator
session.setGameMode(packet.getGamemode());
if (entity.getDimension() != DimensionUtils.javaToBedrock(packet.getDimension())) {
- DimensionUtils.switchDimension(session, packet.getDimension(), false);
+ DimensionUtils.switchDimension(session, packet.getDimension());
} else {
- // Handled in JavaPlayerPositionRotationTranslator
- session.setSpawned(false);
if (session.isManyDimPackets()) { //reloading world
int fakeDim = entity.getDimension() == 0 ? -1 : 0;
- DimensionUtils.switchDimension(session, fakeDim, true);
- DimensionUtils.switchDimension(session, packet.getDimension(), false);
+ DimensionUtils.switchDimension(session, fakeDim);
+ DimensionUtils.switchDimension(session, packet.getDimension());
+ } else {
+ // Handled in JavaPlayerPositionRotationTranslator
+ session.setSpawned(false);
}
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityHeadLookTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityHeadLookTranslator.java
index 1fee09a4d..c03c75837 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityHeadLookTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityHeadLookTranslator.java
@@ -28,7 +28,9 @@ package org.geysermc.connector.network.translators.java.entity;
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityHeadLookPacket;
import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket;
+import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket;
import org.geysermc.connector.entity.Entity;
+import org.geysermc.connector.entity.type.EntityType;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.PacketTranslator;
@@ -45,12 +47,19 @@ public class JavaEntityHeadLookTranslator extends PacketTranslator {
@Override
@@ -42,7 +46,7 @@ public class JavaPlayerAbilitiesTranslator extends PacketTranslator playerFlags = new HashSet<>();
+ playerFlags.add(AdventureSettingsPacket.Flag.AUTO_JUMP);
+ if (packet.isCanFly())
+ playerFlags.add(AdventureSettingsPacket.Flag.MAY_FLY);
- playerFlags = setPlayerFlag(0x20, true, playerFlags); // auto jump
- playerFlags = setPlayerFlag(0x40, packet.isCanFly(), playerFlags); // can fly
- playerFlags = setPlayerFlag(0x200, packet.isFlying(), playerFlags); // is flying
+ if (packet.isFlying())
+ playerFlags.add(AdventureSettingsPacket.Flag.FLYING);
AdventureSettingsPacket adventureSettingsPacket = new AdventureSettingsPacket();
- adventureSettingsPacket.setPlayerPermission(1);
+ adventureSettingsPacket.setPlayerPermission(PlayerPermission.OPERATOR);
adventureSettingsPacket.setUniqueEntityId(entity.getGeyserId());
- adventureSettingsPacket.setPlayerFlags(playerFlags);
+ adventureSettingsPacket.getFlags().addAll(playerFlags);
session.getUpstream().sendPacket(adventureSettingsPacket);
}
-
- private int setPlayerFlag(int flag, boolean value, int playerFlags) {
- if (value) {
- return playerFlags | flag;
- } else {
- return playerFlags & ~flag;
- }
- }
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java
index c39a95dbf..48f20dbdd 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java
@@ -41,7 +41,7 @@ public class JavaPlayerListEntryTranslator extends PacketTranslator 1.5 || (yDis < 1.45 || yDis > (session.isJumping() ? 4.3 : (session.isSprinting() ? 2.5 : 1.9))) || zDis > 1.5) {
+ entity.moveAbsolute(session, Vector3f.from(packet.getX(), packet.getY(), packet.getZ()), packet.getYaw(), packet.getPitch(), true);
+ }
+ }
ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId());
session.getDownstream().getSession().send(teleportConfirmPacket);
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java
index ace157220..f570bb0b0 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java
@@ -25,12 +25,12 @@
package org.geysermc.connector.network.translators.java.world;
+import com.github.steveice10.mc.protocol.data.game.chunk.Chunk;
+import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerChunkDataPacket;
-import com.nukkitx.math.vector.Vector2i;
-import com.nukkitx.math.vector.Vector3f;
+import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.network.VarInts;
import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket;
-import com.nukkitx.protocol.bedrock.packet.NetworkChunkPublisherUpdatePacket;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -46,52 +46,63 @@ public class JavaChunkDataTranslator extends PacketTranslator {
- Vector2i chunkPos = session.getLastChunkPosition();
- Vector3f position = session.getPlayerEntity().getPosition();
- Vector2i newChunkPos = Vector2i.from(position.getFloorX() >> 4, position.getFloorZ() >> 4);
-
- if (chunkPos == null || !chunkPos.equals(newChunkPos)) {
- NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket();
- chunkPublisherUpdatePacket.setPosition(position.toInt());
- chunkPublisherUpdatePacket.setRadius(session.getRenderDistance() << 4);
- session.getUpstream().sendPacket(chunkPublisherUpdatePacket);
-
- session.setLastChunkPosition(newChunkPos);
- }
-
try {
- ChunkUtils.ChunkData chunkData = ChunkUtils.translateToBedrock(packet.getColumn());
- ByteBuf byteBuf = Unpooled.buffer(32);
- ChunkSection[] sections = chunkData.sections;
+ if (packet.getColumn().getBiomeData() != null) { //Full chunk
+ ChunkUtils.ChunkData chunkData = ChunkUtils.translateToBedrock(packet.getColumn());
+ ByteBuf byteBuf = Unpooled.buffer(32);
+ ChunkSection[] sections = chunkData.sections;
- int sectionCount = sections.length - 1;
- while (sectionCount >= 0 && sections[sectionCount].isEmpty()) {
- sectionCount--;
+ int sectionCount = sections.length - 1;
+ while (sectionCount >= 0 && sections[sectionCount].isEmpty()) {
+ sectionCount--;
+ }
+ sectionCount++;
+
+ for (int i = 0; i < sectionCount; i++) {
+ ChunkSection section = chunkData.sections[i];
+ section.writeToNetwork(byteBuf);
+ }
+
+ byte[] bedrockBiome = BiomeTranslator.toBedrockBiome(packet.getColumn().getBiomeData());
+
+ byteBuf.writeBytes(bedrockBiome); // Biomes - 256 bytes
+ byteBuf.writeByte(0); // Border blocks - Edu edition only
+ VarInts.writeUnsignedInt(byteBuf, 0); // extra data length, 0 for now
+
+ byte[] payload = new byte[byteBuf.writerIndex()];
+ byteBuf.readBytes(payload);
+
+ LevelChunkPacket levelChunkPacket = new LevelChunkPacket();
+ levelChunkPacket.setSubChunksLength(sectionCount);
+ levelChunkPacket.setCachingEnabled(false);
+ levelChunkPacket.setChunkX(packet.getColumn().getX());
+ levelChunkPacket.setChunkZ(packet.getColumn().getZ());
+ levelChunkPacket.setData(payload);
+ session.getUpstream().sendPacket(levelChunkPacket);
+ } else {
+ final int xOffset = packet.getColumn().getX() << 4;
+ final int zOffset = packet.getColumn().getZ() << 4;
+ Chunk[] chunks = packet.getColumn().getChunks();
+ for (int i = 0; i < chunks.length; i++) {
+ Chunk chunk = chunks[i];
+ if (chunk == null) continue;
+ final int yOffset = i * 16;
+ for (int x = 0; x < 16; x++) {
+ for (int y = 0; y < 16; y++) {
+ for (int z = 0; z < 16; z++) {
+ BlockState blockState = chunk.get(x, y, z);
+ Vector3i pos = Vector3i.from(
+ x + xOffset,
+ y + yOffset,
+ z + zOffset);
+ ChunkUtils.updateBlock(session, blockState, pos);
+ }
+ }
+ }
+ }
}
- sectionCount++;
-
- for (int i = 0; i < sectionCount; i++) {
- ChunkSection section = chunkData.sections[i];
- section.writeToNetwork(byteBuf);
- }
-
- byte[] bedrockBiome = BiomeTranslator.toBedrockBiome(packet.getColumn().getBiomeData());
-
- byteBuf.writeBytes(bedrockBiome); // Biomes - 256 bytes
- byteBuf.writeByte(0); // Border blocks - Edu edition only
- VarInts.writeUnsignedInt(byteBuf, 0); // extra data length, 0 for now
-
- byte[] payload = new byte[byteBuf.writerIndex()];
- byteBuf.readBytes(payload);
-
- LevelChunkPacket levelChunkPacket = new LevelChunkPacket();
- levelChunkPacket.setSubChunksLength(sectionCount);
- levelChunkPacket.setCachingEnabled(false);
- levelChunkPacket.setChunkX(packet.getColumn().getX());
- levelChunkPacket.setChunkZ(packet.getColumn().getZ());
- levelChunkPacket.setData(payload);
- session.getUpstream().sendPacket(levelChunkPacket);
} catch (Exception ex) {
ex.printStackTrace();
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java
index da2e8a153..490a66437 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java
@@ -31,13 +31,17 @@ import com.github.steveice10.mc.protocol.data.game.world.notify.EnterCreditsValu
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientRequestPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerNotifyClientPacket;
import com.nukkitx.math.vector.Vector3f;
-import com.nukkitx.protocol.bedrock.data.EntityDataDictionary;
+import com.nukkitx.protocol.bedrock.data.EntityDataMap;
import com.nukkitx.protocol.bedrock.data.EntityFlag;
+import com.nukkitx.protocol.bedrock.data.LevelEventType;
+import com.nukkitx.protocol.bedrock.data.PlayerPermission;
import com.nukkitx.protocol.bedrock.packet.*;
import org.geysermc.connector.entity.Entity;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.PacketTranslator;
+import java.util.HashSet;
+import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
public class JavaNotifyClientTranslator extends PacketTranslator {
@@ -51,27 +55,34 @@ public class JavaNotifyClientTranslator extends PacketTranslator playerFlags = new HashSet<>();
GameMode gameMode = (GameMode) packet.getValue();
- playerFlags = setPlayerFlag(0x01, gameMode == GameMode.ADVENTURE, playerFlags); // world immutable
- playerFlags = setPlayerFlag(0x20, true, playerFlags); // auto jump
- playerFlags = setPlayerFlag(0x40, gameMode == GameMode.CREATIVE || gameMode == GameMode.SPECTATOR, playerFlags); // can fly
- playerFlags = setPlayerFlag(0x80, gameMode == GameMode.SPECTATOR, playerFlags); // no clip
- playerFlags = setPlayerFlag(0x200, gameMode == GameMode.SPECTATOR, playerFlags); // is flying
+ if (gameMode == GameMode.ADVENTURE)
+ playerFlags.add(AdventureSettingsPacket.Flag.IMMUTABLE_WORLD);
+
+ if (gameMode == GameMode.CREATIVE)
+ playerFlags.add(AdventureSettingsPacket.Flag.MAY_FLY);
+
+ if (gameMode == GameMode.SPECTATOR) {
+ playerFlags.add(AdventureSettingsPacket.Flag.MAY_FLY);
+ playerFlags.add(AdventureSettingsPacket.Flag.NO_CLIP);
+ playerFlags.add(AdventureSettingsPacket.Flag.FLYING);
+ }
+
+ playerFlags.add(AdventureSettingsPacket.Flag.AUTO_JUMP);
SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket();
playerGameTypePacket.setGamemode(gameMode.ordinal());
@@ -79,12 +90,12 @@ public class JavaNotifyClientTranslator extends PacketTranslator {
+
+ @Override
+ public void translate(ServerUpdateViewDistancePacket packet, GeyserSession session) {
+ session.setRenderDistance(packet.getViewDistance());
+ }
+}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUpdateViewPositionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUpdateViewPositionTranslator.java
new file mode 100644
index 000000000..ebe9062fa
--- /dev/null
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUpdateViewPositionTranslator.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ */
+
+package org.geysermc.connector.network.translators.java.world;
+
+import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateViewPositionPacket;
+import com.nukkitx.math.vector.Vector3i;
+import com.nukkitx.protocol.bedrock.packet.NetworkChunkPublisherUpdatePacket;
+import org.geysermc.connector.network.session.GeyserSession;
+import org.geysermc.connector.network.translators.PacketTranslator;
+
+public class JavaUpdateViewPositionTranslator extends PacketTranslator {
+
+ @Override
+ public void translate(ServerUpdateViewPositionPacket packet, GeyserSession session) {
+ NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket();
+ chunkPublisherUpdatePacket.setPosition(Vector3i.from(packet.getChunkX() << 4, 0, packet.getChunkZ() << 4));
+ chunkPublisherUpdatePacket.setRadius(session.getRenderDistance() << 4);
+ session.getUpstream().sendPacket(chunkPublisherUpdatePacket);
+ }
+}
diff --git a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java
index 6c55c5ea8..1a6296c02 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java
@@ -31,7 +31,6 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket;
-import com.nukkitx.protocol.bedrock.packet.NetworkChunkPublisherUpdatePacket;
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.TranslatorsInit;
@@ -76,19 +75,23 @@ public class ChunkUtils {
}
public static void updateBlock(GeyserSession session, BlockState blockState, Position position) {
- int blockId = BlockTranslator.getBedrockBlockId(blockState);
Vector3i pos = Vector3i.from(position.getX(), position.getY(), position.getZ());
+ updateBlock(session, blockState, pos);
+ }
+
+ public static void updateBlock(GeyserSession session, BlockState blockState, Vector3i position) {
+ int blockId = BlockTranslator.getBedrockBlockId(blockState);
UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket();
updateBlockPacket.setDataLayer(0);
- updateBlockPacket.setBlockPosition(pos);
+ updateBlockPacket.setBlockPosition(position);
updateBlockPacket.setRuntimeId(blockId);
updateBlockPacket.getFlags().add(UpdateBlockPacket.Flag.NEIGHBORS);
session.getUpstream().sendPacket(updateBlockPacket);
UpdateBlockPacket waterPacket = new UpdateBlockPacket();
waterPacket.setDataLayer(1);
- waterPacket.setBlockPosition(pos);
+ waterPacket.setBlockPosition(position);
if (BlockTranslator.isWaterlogged(blockState)) {
waterPacket.setRuntimeId(BEDROCK_WATER_ID);
} else {
@@ -100,11 +103,6 @@ public class ChunkUtils {
public static void sendEmptyChunks(GeyserSession session, Vector3i position, int radius, boolean forceUpdate) {
int chunkX = position.getX() >> 4;
int chunkZ = position.getZ() >> 4;
- NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket();
- chunkPublisherUpdatePacket.setPosition(position);
- chunkPublisherUpdatePacket.setRadius(radius + 1 << 4);
- session.getUpstream().sendPacket(chunkPublisherUpdatePacket);
- session.setLastChunkPosition(null);
for (int x = -radius; x <= radius; x++) {
for (int z = -radius; z <= radius; z++) {
LevelChunkPacket data = new LevelChunkPacket();
@@ -119,7 +117,7 @@ public class ChunkUtils {
Vector3i pos = Vector3i.from(chunkX + x << 4, 80, chunkZ + z << 4);
UpdateBlockPacket blockPacket = new UpdateBlockPacket();
blockPacket.setBlockPosition(pos);
- blockPacket.setDataLayer(1);
+ blockPacket.setDataLayer(0);
blockPacket.setRuntimeId(1);
session.getUpstream().sendPacket(blockPacket);
}
diff --git a/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java b/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java
index 81f528238..c7ecaafb4 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java
@@ -31,14 +31,18 @@ import org.geysermc.connector.entity.Entity;
import org.geysermc.connector.network.session.GeyserSession;
public class DimensionUtils {
- public static void switchDimension(GeyserSession session, int javaDimension, boolean fake) {
+ public static void switchDimension(GeyserSession session, int javaDimension) {
int bedrockDimension = javaToBedrock(javaDimension);
Entity player = session.getPlayerEntity();
if (bedrockDimension == player.getDimension())
return;
- Vector3i pos = Vector3i.from(0, Short.MAX_VALUE, 0);
session.getEntityCache().removeAllEntities();
+ if (session.getPendingDimSwitches().getAndIncrement() > 0) {
+ ChunkUtils.sendEmptyChunks(session, player.getPosition().toInt(), 3, true);
+ }
+
+ Vector3i pos = Vector3i.from(0, Short.MAX_VALUE, 0);
ChangeDimensionPacket changeDimensionPacket = new ChangeDimensionPacket();
changeDimensionPacket.setDimension(bedrockDimension);
@@ -46,19 +50,14 @@ public class DimensionUtils {
changeDimensionPacket.setPosition(pos.toFloat());
session.getUpstream().sendPacket(changeDimensionPacket);
player.setDimension(bedrockDimension);
+ player.setPosition(pos.toFloat());
+ session.setSpawned(false);
//let java server handle portal travel sound
StopSoundPacket stopSoundPacket = new StopSoundPacket();
stopSoundPacket.setStoppingAllSound(true);
stopSoundPacket.setSoundName("");
session.getUpstream().sendPacket(stopSoundPacket);
-
- if (fake) {
- ChunkUtils.sendEmptyChunks(session, pos, 2, true);
- }
-
- session.setSpawned(false);
- session.setSwitchingDimension(true);
}
public static int javaToBedrock(int javaDimension) {
diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java
index 1f8ed4bc6..6e1444983 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java
@@ -168,12 +168,12 @@ public class SkinUtils {
);
PlayerListPacket playerRemovePacket = new PlayerListPacket();
- playerRemovePacket.setType(PlayerListPacket.Type.REMOVE);
+ playerRemovePacket.setAction(PlayerListPacket.Action.REMOVE);
playerRemovePacket.getEntries().add(updatedEntry);
session.getUpstream().sendPacket(playerRemovePacket);
PlayerListPacket playerAddPacket = new PlayerListPacket();
- playerAddPacket.setType(PlayerListPacket.Type.ADD);
+ playerAddPacket.setAction(PlayerListPacket.Action.ADD);
playerAddPacket.getEntries().add(updatedEntry);
session.getUpstream().sendPacket(playerAddPacket);
}
diff --git a/connector/src/main/java/org/geysermc/connector/world/chunk/ChunkPosition.java b/connector/src/main/java/org/geysermc/connector/world/chunk/ChunkPosition.java
index 840e2f5d9..cafb7ab04 100644
--- a/connector/src/main/java/org/geysermc/connector/world/chunk/ChunkPosition.java
+++ b/connector/src/main/java/org/geysermc/connector/world/chunk/ChunkPosition.java
@@ -27,12 +27,14 @@ package org.geysermc.connector.world.chunk;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
+@EqualsAndHashCode
public class ChunkPosition {
private int x;
@@ -43,16 +45,9 @@ public class ChunkPosition {
}
public Position getChunkBlock(int x, int y, int z) {
- int chunkX = x % 16;
- int chunkY = y % 16;
- int chunkZ = z % 16;
-
- if (chunkX < 0)
- chunkX = -chunkX;
- if (chunkY < 0)
- chunkY = -chunkY;
- if (chunkZ < 0)
- chunkZ = -chunkZ;
+ int chunkX = x & 15;
+ int chunkY = y & 15;
+ int chunkZ = z & 15;
return new Position(chunkX, chunkY, chunkZ);
}