From ee754c529ba1072d07cb684336204b5251661ff1 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 15 Feb 2023 00:17:14 -0500 Subject: [PATCH] Add implementation for ClientEmoteEvent Also, a few random changes I've stored since forever. --- ...rockEmoteEvent.java => ClientEmoteEvent.java} | 4 ++-- .../geyser/command/defaults/OffhandCommand.java | 8 +------- .../geyser/item/components/ToolTier.java | 2 +- .../geyser/level/GeyserWorldManager.java | 8 +------- .../geyser/level/physics/PistonBehavior.java | 2 +- .../geyser/registry/type/ParticleMapping.java | 3 ++- .../geysermc/geyser/session/GeyserSession.java | 8 +++++++- .../geyser/session/cache/LodestoneCache.java | 3 +-- .../inventory/EnchantingInventoryTranslator.java | 3 ++- .../entity/player/BedrockEmoteTranslator.java | 16 +++++++++------- 10 files changed, 27 insertions(+), 30 deletions(-) rename api/src/main/java/org/geysermc/geyser/api/event/bedrock/{BedrockEmoteEvent.java => ClientEmoteEvent.java} (92%) diff --git a/api/src/main/java/org/geysermc/geyser/api/event/bedrock/BedrockEmoteEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/bedrock/ClientEmoteEvent.java similarity index 92% rename from api/src/main/java/org/geysermc/geyser/api/event/bedrock/BedrockEmoteEvent.java rename to api/src/main/java/org/geysermc/geyser/api/event/bedrock/ClientEmoteEvent.java index efe3f12d6..35b6a9e73 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/bedrock/BedrockEmoteEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/bedrock/ClientEmoteEvent.java @@ -33,11 +33,11 @@ import org.geysermc.geyser.api.event.connection.ConnectionEvent; /** * Called whenever a Bedrock player performs an emote on their end, before it is broadcasted to the rest of the server. */ -public final class BedrockEmoteEvent extends ConnectionEvent implements Cancellable { +public final class ClientEmoteEvent extends ConnectionEvent implements Cancellable { private final String emoteId; private boolean cancelled; - public BedrockEmoteEvent(@NonNull GeyserConnection connection, @NonNull String emoteId) { + public ClientEmoteEvent(@NonNull GeyserConnection connection, @NonNull String emoteId) { super(connection); this.emoteId = emoteId; } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java index 0015149be..6188e6924 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/OffhandCommand.java @@ -25,10 +25,6 @@ package org.geysermc.geyser.command.defaults; -import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; -import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerActionPacket; -import com.nukkitx.math.vector.Vector3i; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; @@ -46,9 +42,7 @@ public class OffhandCommand extends GeyserCommand { return; } - ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, Vector3i.ZERO, - Direction.DOWN, 0); - session.sendDownstreamPacket(releaseItemPacket); + session.requestOffhandSwap(); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java b/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java index 37e581682..724b197fb 100644 --- a/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java +++ b/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java @@ -37,7 +37,7 @@ public enum ToolTier { DIAMOND(8), NETHERITE(9); - public static final ToolTier[] VALUES = values(); + private static final ToolTier[] VALUES = values(); private final int speed; diff --git a/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java b/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java index f19060c65..5df97e8d7 100644 --- a/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java @@ -29,9 +29,7 @@ import com.nukkitx.nbt.NbtMap; import com.nukkitx.nbt.NbtMapBuilder; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.cache.ChunkCache; import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator; public class GeyserWorldManager extends WorldManager { @@ -39,11 +37,7 @@ public class GeyserWorldManager extends WorldManager { @Override public int getBlockAt(GeyserSession session, int x, int y, int z) { - ChunkCache chunkCache = session.getChunkCache(); - if (chunkCache != null) { // Chunk cache can be null if the session is closed asynchronously - return chunkCache.getBlockAt(x, y, z); - } - return BlockStateValues.JAVA_AIR_ID; + return session.getChunkCache().getBlockAt(x, y, z); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java b/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java index bf943134b..a6b25d01e 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java @@ -33,7 +33,7 @@ public enum PistonBehavior { DESTROY, PUSH_ONLY; - public static final PistonBehavior[] VALUES = values(); + private static final PistonBehavior[] VALUES = values(); public static PistonBehavior getByName(String name) { String upperCase = name.toUpperCase(Locale.ROOT); diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java b/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java index 71feee3de..dcafcd0bf 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java @@ -28,12 +28,13 @@ package org.geysermc.geyser.registry.type; import com.nukkitx.protocol.bedrock.data.LevelEventType; import org.geysermc.geyser.session.GeyserSession; +import javax.annotation.Nonnull; import javax.annotation.ParametersAreNullableByDefault; @ParametersAreNullableByDefault public record ParticleMapping(LevelEventType levelEventType, String identifier) { - public int getParticleId(GeyserSession session) { + public int getParticleId(@Nonnull GeyserSession session) { if (this.levelEventType == null) { return -1; } diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 33655beda..bc49e8945 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -180,7 +180,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { private final AdvancementsCache advancementsCache; private final BookEditCache bookEditCache; - private final ChunkCache chunkCache; + private @org.checkerframework.checker.nullness.qual.NonNull final ChunkCache chunkCache; private final EntityCache entityCache; private final EntityEffectCache effectCache; private final FormCache formCache; @@ -1354,6 +1354,12 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { return false; } + public void requestOffhandSwap() { + ServerboundPlayerActionPacket swapHandsPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, Vector3i.ZERO, + Direction.DOWN, 0); + sendDownstreamPacket(swapHandsPacket); + } + /** * Will be overwritten for GeyserConnect. */ diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java index 05c2628df..41f73863e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java @@ -73,8 +73,7 @@ public final class LodestoneCache { } } - for (Int2ObjectMap.Entry entry : this.lodestones.int2ObjectEntrySet()) { - LodestonePos pos = entry.getValue(); + for (LodestonePos pos : this.lodestones.values()) { if (pos.equals(x, y, z, dim)) { // Use this existing position instead this.activeLodestones.put(itemStack, pos); diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java index 97946b59c..8ae88c9bb 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/EnchantingInventoryTranslator.java @@ -43,6 +43,7 @@ import org.geysermc.geyser.inventory.updater.UIInventoryUpdater; import org.geysermc.geyser.session.GeyserSession; import java.util.Arrays; +import java.util.Locale; public class EnchantingInventoryTranslator extends AbstractBlockInventoryTranslator { public EnchantingInventoryTranslator() { @@ -71,7 +72,7 @@ public class EnchantingInventoryTranslator extends AbstractBlockInventoryTransla // The Bedrock index might need changed, so let's look it up and see. int bedrockIndex = value; if (bedrockIndex != -1) { - Enchantment enchantment = Enchantment.getByJavaIdentifier("minecraft:" + Enchantment.JavaEnchantment.of(bedrockIndex).name().toLowerCase()); + Enchantment enchantment = Enchantment.getByJavaIdentifier("minecraft:" + Enchantment.JavaEnchantment.of(bedrockIndex).name().toLowerCase(Locale.ROOT)); if (enchantment != null) { // Convert the Java enchantment index to Bedrock's bedrockIndex = enchantment.ordinal(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockEmoteTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockEmoteTranslator.java index 43d2d314c..6be0be20f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockEmoteTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockEmoteTranslator.java @@ -25,11 +25,8 @@ package org.geysermc.geyser.translator.protocol.bedrock.entity.player; -import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; -import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerActionPacket; -import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.packet.EmotePacket; +import org.geysermc.geyser.api.event.bedrock.ClientEmoteEvent; import org.geysermc.geyser.configuration.EmoteOffhandWorkaroundOption; import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.session.GeyserSession; @@ -43,15 +40,20 @@ public class BedrockEmoteTranslator extends PacketTranslator { public void translate(GeyserSession session, EmotePacket packet) { if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() != EmoteOffhandWorkaroundOption.DISABLED) { // Activate the workaround - we should trigger the offhand now - ServerboundPlayerActionPacket swapHandsPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, Vector3i.ZERO, - Direction.DOWN, 0); - session.sendDownstreamPacket(swapHandsPacket); + session.requestOffhandSwap(); if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() == EmoteOffhandWorkaroundOption.NO_EMOTES) { return; } } + // For the future: could have a method that exposes which players will see the emote + ClientEmoteEvent event = new ClientEmoteEvent(session, packet.getEmoteId()); + session.getGeyser().eventBus().fire(event); + if (event.isCancelled()) { + return; + } + int javaId = session.getPlayerEntity().getEntityId(); for (GeyserSession otherSession : session.getGeyser().getSessionManager().getSessions().values()) { if (otherSession != session) {