Some particles
Some sounds

Need review from Supreme about how to do biome ids.
Fixes transparent water
This commit is contained in:
EOT3000 2019-10-27 16:25:24 -04:00
parent 6b0c45b6c1
commit c10bfc9fee
8 changed files with 227 additions and 0 deletions

View file

@ -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<SoundEffect, LevelEventPacket.Event> 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
}
}

View file

@ -38,6 +38,7 @@ public class BedrockAnimateTranslator extends PacketTranslator<AnimatePacket> {
switch (packet.getAction()) {
case SWING_ARM:
ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND);
session.getDownstream().getSession().send(swingArmPacket);
break;
}

View file

@ -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<Inve
ClientPlayerInteractEntityPacket entityPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
InteractAction.values()[packet.getActionType()], vector.getX(), vector.getY(), vector.getZ(), Hand.MAIN_HAND);
session.getDownstream().getSession().send(entityPacket);
break;
}
}

View file

@ -0,0 +1,73 @@
package org.geysermc.connector.network.translators.effect;
/**
* author: MagicDroidX
* Nukkit Project
* This file is not owned by Geyser
*/
//TODO: I will make this file useful later! Don't delete it - Fly
public class Particle {
public static final int BUBBLE = 1;
// 2 same as 1
public static final int CRITICAL = 3;
public static final int BLOCK_FORCE_FIELD = 4;
public static final int SMOKE = 5;
public static final int EXPLODE = 6;
public static final int EVAPORATION = 7;
public static final int FLAME = 8;
public static final int LAVA = 9;
public static final int LARGE_SMOKE = 10;
public static final int REDSTONE = 11;
public static final int RISING_RED_DUST = 12;
// 62 same as 12
public static final int ITEM_BREAK = 13;
public static final int SNOWBALL_POOF = 14;
public static final int HUGE_EXPLODE = 15;
// 60 same as 15
public static final int HUGE_EXPLODE_SEED = 16;
public static final int MOB_FLAME = 17;
public static final int HEART = 18;
public static final int TERRAIN = 19;
public static final int SUSPENDED_TOWN = 20, TOWN_AURA = 20;
// 61 same as 20
public static final int PORTAL = 21;
// 22 same as 21
public static final int SPLASH = 23, WATER_SPLASH = 23;
// 24 same as 23
public static final int WATER_WAKE = 25;
public static final int DRIP_WATER = 26;
public static final int DRIP_LAVA = 27;
public static final int FALLING_DUST = 28, DUST = 28;
public static final int MOB_SPELL = 29;
public static final int MOB_SPELL_AMBIENT = 30;
public static final int MOB_SPELL_INSTANTANEOUS = 31;
public static final int INK = 32;
public static final int SLIME = 33;
public static final int RAIN_SPLASH = 34;
public static final int VILLAGER_ANGRY = 35;
// 59 same as 35
public static final int VILLAGER_HAPPY = 36;
public static final int ENCHANTMENT_TABLE = 37;
public static final int TRACKING_EMITTER = 38;
public static final int NOTE = 39;
public static final int WITCH_SPELL = 40;
public static final int CARROT = 41;
// 42 unknown
public static final int END_ROD = 43;
// 58 same as 43
public static final int DRAGONS_BREATH = 44;
public static final int SPIT = 45;
public static final int TOTEM = 46;
public static final int FOOD = 47;
public static final int FIREWORKS_STARTER = 48;
public static final int FIREWORKS_SPARK = 49;
public static final int FIREWORKS_OVERLAY = 50;
public static final int COLORED_FLAME = 52;
public static final int SPARKLER = 53;
public static final int CONDUIT = 54;
public static final int BUBBLE_COLUMN_UP = 55;
public static final int BUBBLE_COLUMN_DOWN = 56;
public static final int SNEEZE = 57;
}

View file

@ -0,0 +1,44 @@
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.entity.player.BlockBreakStage;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerBlockBreakAnimPacket;
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;
public class JavaBlockBreakAnimationPacketTranslator extends PacketTranslator<ServerBlockBreakAnimPacket> {
@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);
}
}

View file

@ -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<ServerPlayEffectPacket> {
@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);
}
}

View file

@ -52,6 +52,7 @@ public class JavaChunkDataTranslator extends PacketTranslator<ServerChunkDataPac
byteBuf.writeBytes(chunkData.biomes); // Biomes - 256 bytes
byteBuf.writeByte(0); // Border blocks - Edu edition only
VarInts.writeUnsignedInt(byteBuf, 0); // extra data length, 0 for now
byteBuf.writeBytes(chunkData.blockEntities);
byte[] payload = new byte[byteBuf.writerIndex()];
byteBuf.readBytes(payload);

View file

@ -3,6 +3,7 @@ package org.geysermc.connector.utils;
import com.github.steveice10.mc.protocol.data.game.chunk.Chunk;
import com.github.steveice10.mc.protocol.data.game.chunk.Column;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import org.geysermc.connector.network.translators.TranslatorsInit;
import org.geysermc.connector.network.translators.block.BlockEntry;
import org.geysermc.connector.world.chunk.ChunkSection;
@ -13,9 +14,24 @@ public class ChunkUtils {
ChunkData chunkData = new ChunkData();
Chunk[] chunks = column.getChunks();
int chunkSectionCount = chunks.length;
chunkData.sections = new ChunkSection[chunkSectionCount];
for(int biome = 0; biome < 256; biome++) {
if (column.getBiomeData()[biome] <= Byte.MAX_VALUE) {
chunkData.biomes[biome] = (byte) (column.getBiomeData()[biome]);
} else {
chunkData.biomes[biome] = (byte) (column.getBiomeData()[biome] - 255);
}
}
for(CompoundTag tag : column.getTileEntities()) {
System.out.println(tag.toString());
}
for (int chunkY = 0; chunkY < chunkSectionCount; chunkY++) {
chunkData.sections[chunkY] = new ChunkSection();
Chunk chunk = chunks[chunkY];