diff --git a/connector/pom.xml b/connector/pom.xml
index 9de1e3e7..cb0f2686 100644
--- a/connector/pom.xml
+++ b/connector/pom.xml
@@ -67,7 +67,7 @@
com.nukkitx.protocol
bedrock-v389
- 2.4.4
+ 2.4.6-SNAPSHOT
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 47b39874..e49a6688 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.*;
@@ -73,7 +73,7 @@ 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;
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 67dc0894..ffe69cda 100644
--- a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java
+++ b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java
@@ -27,6 +27,8 @@ 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.PlayerListPacket;
import lombok.Getter;
@@ -74,11 +76,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(getMetadata());
@@ -91,7 +90,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);
}
@@ -107,7 +106,7 @@ public class PlayerEntity extends LivingEntity {
// remove from playerlist if player isn't on playerlist
Geyser.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);
});
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 53fecf79..7b8a9398 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
@@ -45,6 +45,7 @@ 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.PlayerPermission;
import com.nukkitx.protocol.bedrock.packet.*;
import lombok.Getter;
import lombok.Setter;
@@ -304,7 +305,7 @@ public class GeyserSession implements Player {
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/translators/TranslatorsInit.java b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java
index bc14ba5d..e6a2c2ed 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
@@ -129,8 +129,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());
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 67d398f6..cfac373c 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 NONE:
ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
InteractAction.INTERACT, Hand.MAIN_HAND);
session.getDownstream().getSession().send(interactPacket);
break;
- case 2:
+ case UNKNOWN_1:
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/java/JavaBossBarTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java
index c918c0d5..bfde6f74 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 97cf35e5..f7f75bf7 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,6 +27,7 @@ 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;
@@ -42,7 +43,7 @@ public class JavaJoinGameTranslator 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 c39a95db..48f20dbd 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 {
@@ -64,14 +67,21 @@ 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 +89,12 @@ public class JavaNotifyClientTranslator extends PacketTranslator