mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
WIP
Some particles Some sounds Need review from Supreme about how to do biome ids. Fixes transparent water
This commit is contained in:
parent
6b0c45b6c1
commit
c10bfc9fee
8 changed files with 227 additions and 0 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue