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 d4bc5b45e..97eee070b 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 @@ -25,6 +25,7 @@ package org.geysermc.connector.network.translators; +import com.github.steveice10.mc.protocol.data.game.world.effect.SoundEffect; 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; @@ -60,6 +61,8 @@ import org.geysermc.connector.network.translators.java.scoreboard.JavaDisplaySco import org.geysermc.connector.network.translators.java.scoreboard.JavaScoreboardObjectiveTranslator; import org.geysermc.connector.network.translators.java.scoreboard.JavaTeamTranslator; import org.geysermc.connector.network.translators.java.scoreboard.JavaUpdateScoreTranslator; +import org.geysermc.connector.network.translators.java.visual.JavaBlockBreakAnimationPacketTranslator; +import org.geysermc.connector.network.translators.java.visual.JavaPlayEffectPacketTranslator; import org.geysermc.connector.network.translators.java.window.JavaOpenWindowTranslator; import org.geysermc.connector.network.translators.java.window.JavaSetSlotTranslator; import org.geysermc.connector.network.translators.java.window.JavaWindowItemsTranslator; @@ -67,6 +70,8 @@ import org.geysermc.connector.network.translators.java.world.*; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public class TranslatorsInit { @@ -82,6 +87,8 @@ public class TranslatorsInit { private static final CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag(); public static final byte[] EMPTY_LEVEL_CHUNK_DATA; + public static final Map SOUNDS = new HashMap<>(); + static { try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { outputStream.write(new byte[258]); // Biomes + Border Size + Extra Data Size @@ -144,6 +151,9 @@ public class TranslatorsInit { Registry.registerJava(ServerOpenWindowPacket.class, new OpenWindowPacketTranslator()); + Registry.registerJava(ServerPlayEffectPacket.class, new JavaPlayEffectPacketTranslator()); + Registry.registerJava(ServerBlockBreakAnimPacket.class, new JavaBlockBreakAnimationPacketTranslator()); + Registry.registerBedrock(AnimatePacket.class, new BedrockAnimateTranslator()); Registry.registerBedrock(CommandRequestPacket.class, new BedrockCommandRequestTranslator()); Registry.registerBedrock(InventoryTransactionPacket.class, new BedrockInventoryTransactionTranslator()); @@ -158,6 +168,7 @@ public class TranslatorsInit { blockTranslator = new BlockTranslator(); registerInventoryTranslators(); + registerVisuals(); } private static void registerInventoryTranslators() { @@ -168,4 +179,19 @@ public class TranslatorsInit { inventoryTranslators.put(WindowType.GENERIC_9X5, new GenericInventoryTranslator()); inventoryTranslators.put(WindowType.GENERIC_9X6, new GenericInventoryTranslator());*/ } + + private static void registerVisuals() { + //TODO: add more sounds + SOUNDS.put(SoundEffect.BLOCK_ANVIL_DESTROY, LevelEventPacket.Event.SOUND_ANVIL_BREAK); + SOUNDS.put(SoundEffect.BLOCK_ANVIL_LAND, LevelEventPacket.Event.SOUND_ANVIL_FALL); + SOUNDS.put(SoundEffect.BLOCK_ANVIL_USE, LevelEventPacket.Event.SOUND_ANVIL_USE); + SOUNDS.put(SoundEffect.BLOCK_DISPENSER_DISPENSE, LevelEventPacket.Event.SOUND_CLICK); + SOUNDS.put(SoundEffect.BLOCK_DISPENSER_FAIL, LevelEventPacket.Event.SOUND_CLICK_FAIL); + SOUNDS.put(SoundEffect.BLOCK_DISPENSER_LAUNCH, LevelEventPacket.Event.SOUND_SHOOT); + SOUNDS.put(SoundEffect.ENTITY_GHAST_WARN, LevelEventPacket.Event.SOUND_GHAST); + SOUNDS.put(SoundEffect.ENTITY_GHAST_SHOOT, LevelEventPacket.Event.SOUND_GHAST_SHOOT); + SOUNDS.put(SoundEffect.BLOCK_BREWING_STAND_BREW, LevelEventPacket.Event.SOUND_FIZZ); + + //TODO: not hard coded particles + } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java index 0f047dc49..eebbfb62a 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java @@ -38,6 +38,7 @@ public class BedrockAnimateTranslator extends PacketTranslator { switch (packet.getAction()) { case SWING_ARM: ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND); + session.getDownstream().getSession().send(swingArmPacket); break; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java index 1e6b44a9e..fc31fe21b 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java @@ -32,6 +32,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction; import com.github.steveice10.mc.protocol.data.game.world.block.BlockFace; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket; +import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.InventoryTransactionPacket; @@ -66,7 +67,9 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator { + @Override + public void translate(ServerBlockBreakAnimPacket packet, GeyserSession session) { + LevelEventPacket levelEventPacket = new LevelEventPacket(); + + Position position = packet.getPosition(); + + levelEventPacket.setPosition(Vector3f.from(position.getX(), position.getY(), position.getZ())); + + System.out.println(packet.getStage()); + + switch (packet.getStage()) { + case STAGE_1: + levelEventPacket.setEvent(LevelEventPacket.Event.BLOCK_START_BREAK); + + break; + + case RESET: + levelEventPacket.setEvent(LevelEventPacket.Event.BLOCK_STOP_BREAK); + break; + + default: + levelEventPacket.setEvent(LevelEventPacket.Event.BLOCK_CONTINUE_BREAK); + break; + } + + if(packet.getStage() != BlockBreakStage.RESET) { + levelEventPacket.setData(packet.getStage().ordinal()); + } + + + session.getUpstream().sendPacket(levelEventPacket); + } +} diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/visual/JavaPlayEffectPacketTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/visual/JavaPlayEffectPacketTranslator.java new file mode 100644 index 000000000..3d0eaf4fd --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/visual/JavaPlayEffectPacketTranslator.java @@ -0,0 +1,63 @@ +package org.geysermc.connector.network.translators.java.visual; + +import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; +import com.github.steveice10.mc.protocol.data.game.world.effect.ParticleEffect; +import com.github.steveice10.mc.protocol.data.game.world.effect.SoundEffect; +import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerPlayEffectPacket; +import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.network.translators.TranslatorsInit; +import org.geysermc.connector.network.translators.effect.Particle; + +public class JavaPlayEffectPacketTranslator extends PacketTranslator { + @Override + public void translate(ServerPlayEffectPacket packet, GeyserSession session) { + LevelEventPacket levelEventPacket = new LevelEventPacket(); + + if(packet.getEffect() instanceof ParticleEffect) { + ParticleEffect particleEffect = (ParticleEffect) packet.getEffect(); + + levelEventPacket.setEvent(LevelEventPacket.Event.PARTICLE_SPAWN); + + Position pos = packet.getPosition(); + + levelEventPacket.setPosition(Vector3f.from(pos.getX(), pos.getY(), pos.getZ())); + System.out.println(particleEffect); + + + //TODO: Not hard coded + switch (particleEffect) { + case SMOKE: + levelEventPacket.setData(Particle.SMOKE); + break; + case EXPLOSION: + levelEventPacket.setData(Particle.EXPLODE); + break; + case ENDERDRAGON_FIREBALL_EXPLODE: + levelEventPacket.setData(Particle.DRAGONS_BREATH); + break; + } + + } + + if(packet.getEffect() instanceof SoundEffect) { + SoundEffect soundEffect = (SoundEffect) packet.getEffect(); + + Position pos = packet.getPosition(); + + levelEventPacket.setPosition(Vector3f.from(pos.getX(), pos.getY(), pos.getZ())); + + levelEventPacket.setEvent(TranslatorsInit.SOUNDS.get(soundEffect)); + + if(levelEventPacket.getEvent() == null) { + levelEventPacket.setData(5); + levelEventPacket.setEvent(LevelEventPacket.Event.BLOCK_START_BREAK); + } + + } + + session.getUpstream().sendPacketImmediately(levelEventPacket); + } +} 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 a620197e0..1df26c17c 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 @@ -52,6 +52,7 @@ public class JavaChunkDataTranslator extends PacketTranslator