diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java index 3e16ae042..d7373f0a9 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java @@ -122,7 +122,7 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { return; } - this.geyserWorldManager = new GeyserModWorldManager(geyser, server); + this.geyserWorldManager = new GeyserModWorldManager(server); // We want to do this late in the server startup process to allow other mods // To do their job injecting, then connect into *that* diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/client/IntegratedServerMixin.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/client/IntegratedServerMixin.java index ece2f730a..bf5ea917a 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/client/IntegratedServerMixin.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/client/IntegratedServerMixin.java @@ -40,6 +40,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.util.Objects; @@ -50,7 +51,7 @@ public class IntegratedServerMixin implements GeyserServerPortGetter { @Shadow @Final private Minecraft minecraft; - @Inject(method = "publishServer", at = @At("RETURN")) + @Inject(method = "publishServer", at = @At("RETURN"), locals = LocalCapture.NO_CAPTURE) private void onOpenToLan(GameType gameType, boolean cheatsAllowed, int port, CallbackInfoReturnable cir) { if (cir.getReturnValueZ()) { // If the LAN is opened, starts Geyser. diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/server/ModBlockPlaceListener.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/server/BlockPlaceMixin.java similarity index 74% rename from bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/server/ModBlockPlaceListener.java rename to bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/server/BlockPlaceMixin.java index 4afa776b3..98620588e 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/server/ModBlockPlaceListener.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/mixin/server/BlockPlaceMixin.java @@ -36,7 +36,10 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import org.cloudburstmc.math.vector.Vector3f; -import org.geysermc.geyser.platform.mod.world.GeyserModWorldManager; +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; +import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.session.GeyserSession; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -44,7 +47,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(BlockItem.class) -public class ModBlockPlaceListener { +public class BlockPlaceMixin { @Inject(method = "place", locals = LocalCapture.CAPTURE_FAILSOFT, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;playSound(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V")) private void geyser$hijackPlaySound(BlockPlaceContext blockPlaceContext, CallbackInfoReturnable cir, BlockPlaceContext blockPlaceContext2, BlockState blockState, BlockPos blockPos, Level level, Player player, ItemStack itemStack, BlockState blockState2, SoundType soundType) { @@ -52,12 +55,25 @@ public class ModBlockPlaceListener { return; } + GeyserSession session = GeyserImpl.getInstance().connectionByUuid(player.getUUID()); + if (session == null) { + return; + } + Vector3f position = Vector3f.from( blockPos.getX(), blockPos.getY(), blockPos.getZ() ); - GeyserModWorldManager.handleBlockPlace(player.getUUID(), position, Block.BLOCK_STATE_REGISTRY.getId(blockState2)); + LevelSoundEventPacket placeBlockSoundPacket = new LevelSoundEventPacket(); + placeBlockSoundPacket.setSound(SoundEvent.PLACE); + placeBlockSoundPacket.setPosition(position); + placeBlockSoundPacket.setBabySound(false); + placeBlockSoundPacket.setExtraData(session.getBlockMappings().getBedrockBlockId(Block.BLOCK_STATE_REGISTRY.getId(blockState2))); + placeBlockSoundPacket.setIdentifier(":"); + session.sendUpstreamPacket(placeBlockSoundPacket); + session.setLastBlockPlacePosition(null); + session.setLastBlockPlaced(null); } } diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java index 057f2f4b5..db1768737 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java @@ -45,11 +45,7 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.status.ChunkStatus; import org.checkerframework.checker.nullness.qual.NonNull; -import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3i; -import org.cloudburstmc.protocol.bedrock.data.SoundEvent; -import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.level.GeyserWorldManager; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.platform.mod.GeyserModBootstrap; @@ -62,7 +58,6 @@ import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponen import java.util.HashMap; import java.util.List; -import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -70,11 +65,9 @@ public class GeyserModWorldManager extends GeyserWorldManager { private static final GsonComponentSerializer GSON_SERIALIZER = GsonComponentSerializer.gson(); private final MinecraftServer server; - private static GeyserImpl geyser; - public GeyserModWorldManager(GeyserImpl geyser, MinecraftServer server) { + public GeyserModWorldManager(MinecraftServer server) { this.server = server; - GeyserModWorldManager.geyser = geyser; } @Override @@ -193,23 +186,6 @@ public class GeyserModWorldManager extends GeyserWorldManager { }); } - public static void handleBlockPlace(UUID uuid, Vector3f position, int blockId) { - GeyserSession session = geyser.connectionByUuid(uuid); - if (session == null) { - return; - } - - LevelSoundEventPacket placeBlockSoundPacket = new LevelSoundEventPacket(); - placeBlockSoundPacket.setSound(SoundEvent.PLACE); - placeBlockSoundPacket.setPosition(position); - placeBlockSoundPacket.setBabySound(false); - placeBlockSoundPacket.setExtraData(session.getBlockMappings().getBedrockBlockId(blockId)); - placeBlockSoundPacket.setIdentifier(":"); - session.sendUpstreamPacket(placeBlockSoundPacket); - session.setLastBlockPlacePosition(null); - session.setLastBlockPlaced(null); - } - private ServerPlayer getPlayer(GeyserSession session) { return server.getPlayerList().getPlayer(session.getPlayerEntity().getUuid()); } diff --git a/bootstrap/mod/src/main/resources/geyser.mixins.json b/bootstrap/mod/src/main/resources/geyser.mixins.json index a7202ec19..e4034d398 100644 --- a/bootstrap/mod/src/main/resources/geyser.mixins.json +++ b/bootstrap/mod/src/main/resources/geyser.mixins.json @@ -1,19 +1,19 @@ { - "required": true, - "minVersion": "0.8", - "package": "org.geysermc.geyser.platform.mod.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ - "server.ModBlockPlaceListener", - "server.ServerConnectionListenerMixin" - ], - "server": [ - "server.DedicatedServerMixin" - ], - "client": [ - "client.IntegratedServerMixin" - ], - "injectors": { - "defaultRequire": 1 + "required": true, + "minVersion": "0.8", + "package": "org.geysermc.geyser.platform.mod.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "server.BlockPlaceMixin", + "server.ServerConnectionListenerMixin" + ], + "server": [ + "server.DedicatedServerMixin" + ], + "client": [ + "client.IntegratedServerMixin" + ], + "injectors": { + "defaultRequire": 1 } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockUpdateTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockUpdateTranslator.java index 5fd6e9d1a..6d5fbc113 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockUpdateTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockUpdateTranslator.java @@ -28,8 +28,8 @@ package org.geysermc.geyser.translator.protocol.java.level; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket; -import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.item.type.Item; +import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.level.block.type.BlockState; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; @@ -43,16 +43,19 @@ public class JavaBlockUpdateTranslator extends PacketTranslator