|
31 | 31 | import org.cloudburstmc.math.vector.Vector3f; |
32 | 32 | import org.cloudburstmc.math.vector.Vector3i; |
33 | 33 | import org.cloudburstmc.protocol.bedrock.data.LevelEvent; |
| 34 | +import org.cloudburstmc.protocol.bedrock.data.SoundEvent; |
34 | 35 | import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; |
35 | 36 | import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; |
36 | 37 | import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType; |
|
42 | 43 | import org.cloudburstmc.protocol.bedrock.packet.ContainerOpenPacket; |
43 | 44 | import org.cloudburstmc.protocol.bedrock.packet.InventoryTransactionPacket; |
44 | 45 | import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket; |
| 46 | +import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket; |
45 | 47 | import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket; |
46 | 48 | import org.geysermc.geyser.entity.EntityDefinitions; |
47 | 49 | import org.geysermc.geyser.entity.type.Entity; |
|
75 | 77 | import org.geysermc.geyser.util.EntityUtils; |
76 | 78 | import org.geysermc.geyser.util.InteractionResult; |
77 | 79 | import org.geysermc.geyser.util.InventoryUtils; |
| 80 | +import org.geysermc.mcprotocollib.protocol.data.game.Holder; |
78 | 81 | import org.geysermc.mcprotocollib.protocol.data.game.entity.object.Direction; |
79 | 82 | import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; |
80 | 83 | import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; |
81 | 84 | import org.geysermc.mcprotocollib.protocol.data.game.entity.player.InteractAction; |
82 | 85 | import org.geysermc.mcprotocollib.protocol.data.game.entity.player.PlayerAction; |
83 | 86 | import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; |
| 87 | +import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType; |
| 88 | +import org.geysermc.mcprotocollib.protocol.data.game.item.component.Instrument; |
84 | 89 | import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClickPacket; |
85 | 90 | import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundInteractPacket; |
86 | 91 | import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosRotPacket; |
@@ -373,6 +378,22 @@ public void translate(GeyserSession session, InventoryTransactionPacket packet) |
373 | 378 | break; |
374 | 379 | } else if (packet.getItemInHand().getDefinition() == session.getItemMappings().getStoredItems().writtenBook().getBedrockDefinition()) { |
375 | 380 | session.setCurrentBook(packet.getItemInHand()); |
| 381 | + } else if (session.getPlayerInventory().getItemInHand().asItem() == Items.GOAT_HORN) { |
| 382 | + // Temporary workaround while we don't have full item/block use tracking. |
| 383 | + if (!session.getWorldCache().hasCooldown(Items.GOAT_HORN)) { |
| 384 | + Holder<Instrument> instrument = session.getPlayerInventory() |
| 385 | + .getItemInHand() |
| 386 | + .getComponent(DataComponentType.INSTRUMENT); |
| 387 | + if (instrument != null && instrument.isId()) { |
| 388 | + // BDS uses a LevelSoundEvent2Packet, but that doesn't work here... (as of 1.21.20) |
| 389 | + LevelSoundEventPacket soundPacket = new LevelSoundEventPacket(); |
| 390 | + soundPacket.setSound(SoundEvent.valueOf("GOAT_CALL_" + instrument.id())); |
| 391 | + soundPacket.setPosition(session.getPlayerEntity().getPosition()); |
| 392 | + soundPacket.setIdentifier("minecraft:player"); |
| 393 | + soundPacket.setExtraData(-1); |
| 394 | + session.sendUpstreamPacket(soundPacket); |
| 395 | + } |
| 396 | + } |
376 | 397 | } |
377 | 398 | } |
378 | 399 |
|
|
0 commit comments