mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Compiles; provide your own mappings for now
This commit is contained in:
parent
5339127105
commit
bbf45b6a4c
30 changed files with 310 additions and 132 deletions
|
@ -120,8 +120,8 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.CloudburstMC.Protocol</groupId>
|
<groupId>com.github.CloudburstMC.Protocol</groupId>
|
||||||
<artifactId>bedrock-v503</artifactId>
|
<artifactId>bedrock-beta</artifactId>
|
||||||
<version>297567d</version>
|
<version>49323e0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class OffhandCommand extends GeyserCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, BlockUtils.POSITION_ZERO,
|
ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, BlockUtils.POSITION_ZERO,
|
||||||
Direction.DOWN);
|
Direction.DOWN, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(releaseItemPacket);
|
session.sendDownstreamPacket(releaseItemPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -272,7 +272,7 @@ public final class EntityDefinitions {
|
||||||
.type(EntityType.LLAMA_SPIT)
|
.type(EntityType.LLAMA_SPIT)
|
||||||
.heightAndWidth(0.25f)
|
.heightAndWidth(0.25f)
|
||||||
.build();
|
.build();
|
||||||
PAINTING = EntityDefinition.<PaintingEntity>inherited(null, entityBase)
|
PAINTING = EntityDefinition.inherited(PaintingEntity::new, entityBase)
|
||||||
.type(EntityType.PAINTING)
|
.type(EntityType.PAINTING)
|
||||||
.build();
|
.build();
|
||||||
SHULKER_BULLET = EntityDefinition.inherited(ThrowableEntity::new, entityBase)
|
SHULKER_BULLET = EntityDefinition.inherited(ThrowableEntity::new, entityBase)
|
||||||
|
|
|
@ -27,26 +27,27 @@ package org.geysermc.geyser.entity.type;
|
||||||
|
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
import com.nukkitx.protocol.bedrock.packet.AddPaintingPacket;
|
import com.nukkitx.protocol.bedrock.packet.AddPaintingPacket;
|
||||||
import org.geysermc.geyser.entity.EntityDefinitions;
|
import org.geysermc.geyser.entity.EntityDefinition;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
|
||||||
import org.geysermc.geyser.level.PaintingType;
|
import org.geysermc.geyser.level.PaintingType;
|
||||||
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
// TODO 1.19
|
|
||||||
public class PaintingEntity extends Entity {
|
public class PaintingEntity extends Entity {
|
||||||
private static final double OFFSET = -0.46875;
|
private static final double OFFSET = -0.46875;
|
||||||
private final PaintingType paintingName;
|
private PaintingType paintingName;
|
||||||
private final int direction;
|
private int direction;
|
||||||
|
|
||||||
public PaintingEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, Vector3f position, PaintingType paintingName, int direction) {
|
public PaintingEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition<?> definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) {
|
||||||
super(session, entityId, geyserId, uuid, EntityDefinitions.PAINTING, position, Vector3f.ZERO, 0f, 0f, 0f);
|
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
|
||||||
this.paintingName = paintingName;
|
|
||||||
this.direction = direction;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void spawnEntity() {
|
public void spawnEntity() {
|
||||||
|
// Wait until we get the metadata needed
|
||||||
|
}
|
||||||
|
|
||||||
|
public void paintingtodo() {
|
||||||
AddPaintingPacket addPaintingPacket = new AddPaintingPacket();
|
AddPaintingPacket addPaintingPacket = new AddPaintingPacket();
|
||||||
addPaintingPacket.setUniqueEntityId(geyserId);
|
addPaintingPacket.setUniqueEntityId(geyserId);
|
||||||
addPaintingPacket.setRuntimeEntityId(geyserId);
|
addPaintingPacket.setRuntimeEntityId(geyserId);
|
||||||
|
|
|
@ -49,7 +49,7 @@ public class HoglinEntity extends AnimalEntity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isShaking() {
|
protected boolean isShaking() {
|
||||||
return (!isImmuneToZombification && !session.isDimensionPiglinSafe()) || super.isShaking();
|
return (!isImmuneToZombification && !session.getDimensionType().piglinSafe()) || super.isShaking();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -48,6 +48,6 @@ public class BasePiglinEntity extends MonsterEntity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isShaking() {
|
protected boolean isShaking() {
|
||||||
return (!isImmuneToZombification && !session.isDimensionPiglinSafe()) || super.isShaking();
|
return (!isImmuneToZombification && !session.getDimensionType().piglinSafe()) || super.isShaking();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,15 +27,14 @@ package org.geysermc.geyser.level;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
||||||
import com.github.steveice10.mc.protocol.data.game.setting.Difficulty;
|
import com.github.steveice10.mc.protocol.data.game.setting.Difficulty;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket;
|
|
||||||
import com.nukkitx.nbt.NbtMap;
|
import com.nukkitx.nbt.NbtMap;
|
||||||
import com.nukkitx.nbt.NbtMapBuilder;
|
import com.nukkitx.nbt.NbtMapBuilder;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
import org.geysermc.geyser.level.block.BlockStateValues;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.session.cache.ChunkCache;
|
import org.geysermc.geyser.session.cache.ChunkCache;
|
||||||
import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator;
|
import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator;
|
||||||
import org.geysermc.geyser.level.block.BlockStateValues;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
@ -83,7 +82,7 @@ public class GeyserWorldManager extends WorldManager {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setGameRule(GeyserSession session, String name, Object value) {
|
public void setGameRule(GeyserSession session, String name, Object value) {
|
||||||
session.sendDownstreamPacket(new ServerboundChatPacket("/gamerule " + name + " " + value));
|
session.sendCommand("gamerule " + name + " " + value);
|
||||||
gameruleCache.put(name, String.valueOf(value));
|
gameruleCache.put(name, String.valueOf(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,12 +108,12 @@ public class GeyserWorldManager extends WorldManager {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPlayerGameMode(GeyserSession session, GameMode gameMode) {
|
public void setPlayerGameMode(GeyserSession session, GameMode gameMode) {
|
||||||
session.sendDownstreamPacket(new ServerboundChatPacket("/gamemode " + gameMode.name().toLowerCase(Locale.ROOT)));
|
session.sendCommand("gamemode " + gameMode.name().toLowerCase(Locale.ROOT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDifficulty(GeyserSession session, Difficulty difficulty) {
|
public void setDifficulty(GeyserSession session, Difficulty difficulty) {
|
||||||
session.sendDownstreamPacket(new ServerboundChatPacket("/difficulty " + difficulty.name().toLowerCase(Locale.ROOT)));
|
session.sendCommand("difficulty " + difficulty.name().toLowerCase(Locale.ROOT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -26,17 +26,31 @@
|
||||||
package org.geysermc.geyser.level;
|
package org.geysermc.geyser.level;
|
||||||
|
|
||||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.IntTag;
|
||||||
|
import org.geysermc.geyser.util.JavaCodecEntry;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the information we store from the current Java dimension
|
* Represents the information we store from the current Java dimension
|
||||||
* @param piglinSafe Whether piglins and hoglins are safe from conversion in this dimension.
|
* @param piglinSafe Whether piglins and hoglins are safe from conversion in this dimension.
|
||||||
* This controls if they have the shaking effect applied in the dimension.
|
* This controls if they have the shaking effect applied in the dimension.
|
||||||
*/
|
*/
|
||||||
public record JavaDimension(int minY, int maxY, boolean piglinSafe) {
|
public record JavaDimension(int minY, int maxY, boolean piglinSafe, double worldCoordinateScale) {
|
||||||
|
|
||||||
public static JavaDimension load(CompoundTag tag) {
|
public static void load(CompoundTag tag, Map<String, JavaDimension> map) {
|
||||||
// int minY = ((IntTag) dimensionTag.get("min_y")).getValue();
|
for (CompoundTag dimension : JavaCodecEntry.iterateOverTag(tag.get("minecraft:dimension_type"))) {
|
||||||
// int maxY = ((IntTag) dimensionTag.get("height")).getValue();
|
CompoundTag elements = dimension.get("element");
|
||||||
return new JavaDimension(0, 0, false);
|
int minY = ((IntTag) elements.get("min_y")).getValue();
|
||||||
|
int maxY = ((IntTag) elements.get("height")).getValue();
|
||||||
|
// Logical height can be ignored probably - seems to be for artificial limits like the Nether.
|
||||||
|
|
||||||
|
// Set if piglins/hoglins should shake
|
||||||
|
boolean piglinSafe = ((Number) elements.get("piglin_safe").getValue()).byteValue() != (byte) 0;
|
||||||
|
// Load world coordinate scale for the world border
|
||||||
|
double coordinateScale = ((Number) elements.get("coordinate_scale").getValue()).doubleValue();
|
||||||
|
|
||||||
|
map.put((String) dimension.get("name").getValue(), new JavaDimension(minY, maxY, piglinSafe, coordinateScale));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,8 +28,6 @@ package org.geysermc.geyser.network;
|
||||||
import com.github.steveice10.mc.protocol.codec.MinecraftCodec;
|
import com.github.steveice10.mc.protocol.codec.MinecraftCodec;
|
||||||
import com.github.steveice10.mc.protocol.codec.PacketCodec;
|
import com.github.steveice10.mc.protocol.codec.PacketCodec;
|
||||||
import com.nukkitx.protocol.bedrock.BedrockPacketCodec;
|
import com.nukkitx.protocol.bedrock.BedrockPacketCodec;
|
||||||
import com.nukkitx.protocol.bedrock.v475.Bedrock_v475;
|
|
||||||
import com.nukkitx.protocol.bedrock.v486.Bedrock_v486;
|
|
||||||
import com.nukkitx.protocol.bedrock.v503.Bedrock_v503;
|
import com.nukkitx.protocol.bedrock.v503.Bedrock_v503;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -58,10 +56,6 @@ public final class MinecraftProtocol {
|
||||||
private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC;
|
private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
SUPPORTED_BEDROCK_CODECS.add(Bedrock_v475.V475_CODEC.toBuilder().minecraftVersion("1.18.0/1.18.1/1.18.2").build());
|
|
||||||
SUPPORTED_BEDROCK_CODECS.add(Bedrock_v486.V486_CODEC.toBuilder()
|
|
||||||
.minecraftVersion("1.18.10/1.18.12") // 1.18.11 is also supported, but was only on Switch and since that auto-updates it's not needed
|
|
||||||
.build());
|
|
||||||
SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC.toBuilder()
|
SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC.toBuilder()
|
||||||
.minecraftVersion("1.18.30/1.18.31")
|
.minecraftVersion("1.18.30/1.18.31")
|
||||||
.build());
|
.build());
|
||||||
|
|
|
@ -171,8 +171,10 @@ public class BlockRegistryPopulator {
|
||||||
|
|
||||||
int bedrockRuntimeId = blockStateOrderedMap.getOrDefault(buildBedrockState(entry.getValue(), stateVersion, stateMapper), -1);
|
int bedrockRuntimeId = blockStateOrderedMap.getOrDefault(buildBedrockState(entry.getValue(), stateVersion, stateMapper), -1);
|
||||||
if (bedrockRuntimeId == -1) {
|
if (bedrockRuntimeId == -1) {
|
||||||
throw new RuntimeException("Unable to find " + javaId + " Bedrock runtime ID! Built NBT tag: \n" +
|
bedrockRuntimeId = 0;
|
||||||
buildBedrockState(entry.getValue(), stateVersion, stateMapper));
|
//TODO remove
|
||||||
|
//throw new RuntimeException("Unable to find " + javaId + " Bedrock runtime ID! Built NBT tag: \n" +
|
||||||
|
// buildBedrockState(entry.getValue(), stateVersion, stateMapper));
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (javaId) {
|
switch (javaId) {
|
||||||
|
|
|
@ -252,7 +252,9 @@ public class ItemRegistryPopulator {
|
||||||
|
|
||||||
int bedrockId = bedrockIdentifierToId.getInt(bedrockIdentifier);
|
int bedrockId = bedrockIdentifierToId.getInt(bedrockIdentifier);
|
||||||
if (bedrockId == Short.MIN_VALUE) {
|
if (bedrockId == Short.MIN_VALUE) {
|
||||||
throw new RuntimeException("Missing Bedrock ID in mappings: " + bedrockIdentifier);
|
bedrockId = 0;
|
||||||
|
//TODO remove
|
||||||
|
//throw new RuntimeException("Missing Bedrock ID in mappings: " + bedrockIdentifier);
|
||||||
}
|
}
|
||||||
int stackSize = mappingItem.getStackSize();
|
int stackSize = mappingItem.getStackSize();
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ import com.github.steveice10.mc.protocol.MinecraftConstants;
|
||||||
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
||||||
import com.github.steveice10.mc.protocol.data.ProtocolState;
|
import com.github.steveice10.mc.protocol.data.ProtocolState;
|
||||||
import com.github.steveice10.mc.protocol.data.UnexpectedEncryptionException;
|
import com.github.steveice10.mc.protocol.data.UnexpectedEncryptionException;
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.MessageType;
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose;
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose;
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.object.Direction;
|
import com.github.steveice10.mc.protocol.data.game.entity.object.Direction;
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
||||||
|
@ -47,6 +48,8 @@ import com.github.steveice10.mc.protocol.data.game.setting.SkinPart;
|
||||||
import com.github.steveice10.mc.protocol.data.game.statistic.CustomStatistic;
|
import com.github.steveice10.mc.protocol.data.game.statistic.CustomStatistic;
|
||||||
import com.github.steveice10.mc.protocol.data.game.statistic.Statistic;
|
import com.github.steveice10.mc.protocol.data.game.statistic.Statistic;
|
||||||
import com.github.steveice10.mc.protocol.packet.handshake.serverbound.ClientIntentionPacket;
|
import com.github.steveice10.mc.protocol.packet.handshake.serverbound.ClientIntentionPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatCommandPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientInformationPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientInformationPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerAbilitiesPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerAbilitiesPacket;
|
||||||
|
@ -69,6 +72,7 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
|
||||||
import com.nukkitx.protocol.bedrock.packet.*;
|
import com.nukkitx.protocol.bedrock.packet.*;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.EventLoop;
|
import io.netty.channel.EventLoop;
|
||||||
|
import it.unimi.dsi.fastutil.bytes.ByteArrays;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
|
@ -81,6 +85,7 @@ import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
import org.checkerframework.common.value.qual.IntRange;
|
import org.checkerframework.common.value.qual.IntRange;
|
||||||
import org.geysermc.common.PlatformType;
|
import org.geysermc.common.PlatformType;
|
||||||
import org.geysermc.cumulus.Form;
|
import org.geysermc.cumulus.Form;
|
||||||
|
@ -125,6 +130,7 @@ import java.net.ConnectException;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ScheduledFuture;
|
import java.util.concurrent.ScheduledFuture;
|
||||||
|
@ -319,11 +325,16 @@ public class GeyserSession implements GeyserConnection, CommandSender {
|
||||||
*/
|
*/
|
||||||
@Setter
|
@Setter
|
||||||
private String dimension = DimensionUtils.OVERWORLD;
|
private String dimension = DimensionUtils.OVERWORLD;
|
||||||
|
@MonotonicNonNull
|
||||||
|
@Setter
|
||||||
|
private JavaDimension dimensionType = null;
|
||||||
/**
|
/**
|
||||||
* All dimensions that the client could possibly connect to.
|
* All dimensions that the client could possibly connect to.
|
||||||
*/
|
*/
|
||||||
private final Map<String, JavaDimension> dimensions = new Object2ObjectOpenHashMap<>(3);
|
private final Map<String, JavaDimension> dimensions = new Object2ObjectOpenHashMap<>(3);
|
||||||
|
|
||||||
|
private final Map<MessageType, Object> chatTypes = new EnumMap<>(MessageType.class);
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private int breakingBlock;
|
private int breakingBlock;
|
||||||
|
|
||||||
|
@ -1260,9 +1271,9 @@ public class GeyserSession implements GeyserConnection, CommandSender {
|
||||||
|
|
||||||
ServerboundUseItemPacket useItemPacket;
|
ServerboundUseItemPacket useItemPacket;
|
||||||
if (playerInventory.getItemInHand().getJavaId() == shield.getJavaId()) {
|
if (playerInventory.getItemInHand().getJavaId() == shield.getJavaId()) {
|
||||||
useItemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, 0); //TODO
|
useItemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, getNextSequence());
|
||||||
} else if (playerInventory.getOffhand().getJavaId() == shield.getJavaId()) {
|
} else if (playerInventory.getOffhand().getJavaId() == shield.getJavaId()) {
|
||||||
useItemPacket = new ServerboundUseItemPacket(Hand.OFF_HAND, 0);
|
useItemPacket = new ServerboundUseItemPacket(Hand.OFF_HAND, getNextSequence());
|
||||||
} else {
|
} else {
|
||||||
// No blocking
|
// No blocking
|
||||||
return false;
|
return false;
|
||||||
|
@ -1291,7 +1302,7 @@ public class GeyserSession implements GeyserConnection, CommandSender {
|
||||||
private boolean disableBlocking() {
|
private boolean disableBlocking() {
|
||||||
if (playerEntity.getFlag(EntityFlag.BLOCKING)) {
|
if (playerEntity.getFlag(EntityFlag.BLOCKING)) {
|
||||||
ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.RELEASE_USE_ITEM,
|
ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.RELEASE_USE_ITEM,
|
||||||
BlockUtils.POSITION_ZERO, Direction.DOWN, 0); //TODO
|
BlockUtils.POSITION_ZERO, Direction.DOWN, getNextSequence());
|
||||||
sendDownstreamPacket(releaseItemPacket);
|
sendDownstreamPacket(releaseItemPacket);
|
||||||
playerEntity.setFlag(EntityFlag.BLOCKING, false);
|
playerEntity.setFlag(EntityFlag.BLOCKING, false);
|
||||||
return true;
|
return true;
|
||||||
|
@ -1359,6 +1370,20 @@ public class GeyserSession implements GeyserConnection, CommandSender {
|
||||||
return clientData.getLanguageCode();
|
return clientData.getLanguageCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a chat message to the Java server.
|
||||||
|
*/
|
||||||
|
public void sendChat(String message) {
|
||||||
|
sendDownstreamPacket(new ServerboundChatPacket(message, Instant.now().toEpochMilli(), 0L, ByteArrays.EMPTY_ARRAY, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a command to the Java server.
|
||||||
|
*/
|
||||||
|
public void sendCommand(String command) {
|
||||||
|
sendDownstreamPacket(new ServerboundChatCommandPacket(command, Instant.now().toEpochMilli(), 0L, Collections.emptyMap(), false));
|
||||||
|
}
|
||||||
|
|
||||||
public void setServerRenderDistance(int renderDistance) {
|
public void setServerRenderDistance(int renderDistance) {
|
||||||
renderDistance = GenericMath.ceil(++renderDistance * MathUtils.SQRT_OF_TWO); //square to circle
|
renderDistance = GenericMath.ceil(++renderDistance * MathUtils.SQRT_OF_TWO); //square to circle
|
||||||
this.serverRenderDistance = renderDistance;
|
this.serverRenderDistance = renderDistance;
|
||||||
|
@ -1636,6 +1661,10 @@ public class GeyserSession implements GeyserConnection, CommandSender {
|
||||||
sendDownstreamPacket(clientSettingsPacket);
|
sendDownstreamPacket(clientSettingsPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getNextSequence() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used for updating statistic values since we only get changes from the server
|
* Used for updating statistic values since we only get changes from the server
|
||||||
*
|
*
|
||||||
|
|
|
@ -69,6 +69,7 @@ public class TagCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) {
|
public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) {
|
||||||
|
System.out.println(packet);
|
||||||
Map<String, int[]> blockTags = packet.getTags().get("minecraft:block");
|
Map<String, int[]> blockTags = packet.getTags().get("minecraft:block");
|
||||||
this.leaves = IntList.of(blockTags.get("minecraft:leaves"));
|
this.leaves = IntList.of(blockTags.get("minecraft:leaves"));
|
||||||
this.wool = IntList.of(blockTags.get("minecraft:wool"));
|
this.wool = IntList.of(blockTags.get("minecraft:wool"));
|
||||||
|
|
|
@ -48,6 +48,8 @@ import org.geysermc.geyser.inventory.updater.UIInventoryUpdater;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.util.InventoryUtils;
|
import org.geysermc.geyser.util.InventoryUtils;
|
||||||
|
|
||||||
|
import java.util.OptionalInt;
|
||||||
|
|
||||||
public class BeaconInventoryTranslator extends AbstractBlockInventoryTranslator {
|
public class BeaconInventoryTranslator extends AbstractBlockInventoryTranslator {
|
||||||
public BeaconInventoryTranslator() {
|
public BeaconInventoryTranslator() {
|
||||||
super(1, new BlockInventoryHolder("minecraft:beacon", com.nukkitx.protocol.bedrock.data.inventory.ContainerType.BEACON) {
|
super(1, new BlockInventoryHolder("minecraft:beacon", com.nukkitx.protocol.bedrock.data.inventory.ContainerType.BEACON) {
|
||||||
|
@ -111,11 +113,15 @@ public class BeaconInventoryTranslator extends AbstractBlockInventoryTranslator
|
||||||
public ItemStackResponsePacket.Response translateSpecialRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) {
|
public ItemStackResponsePacket.Response translateSpecialRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) {
|
||||||
// Input a beacon payment
|
// Input a beacon payment
|
||||||
BeaconPaymentStackRequestActionData beaconPayment = (BeaconPaymentStackRequestActionData) request.getActions()[0];
|
BeaconPaymentStackRequestActionData beaconPayment = (BeaconPaymentStackRequestActionData) request.getActions()[0];
|
||||||
ServerboundSetBeaconPacket packet = new ServerboundSetBeaconPacket(beaconPayment.getPrimaryEffect(), beaconPayment.getSecondaryEffect());
|
ServerboundSetBeaconPacket packet = new ServerboundSetBeaconPacket(toJava(beaconPayment.getPrimaryEffect()), toJava(beaconPayment.getSecondaryEffect()));
|
||||||
session.sendDownstreamPacket(packet);
|
session.sendDownstreamPacket(packet);
|
||||||
return acceptRequest(request, makeContainerEntries(session, inventory, IntSets.emptySet()));
|
return acceptRequest(request, makeContainerEntries(session, inventory, IntSets.emptySet()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OptionalInt toJava(int effectChoice) {
|
||||||
|
return effectChoice == -1 ? OptionalInt.empty() : OptionalInt.of(effectChoice);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int bedrockSlotToJava(StackRequestSlotInfoData slotInfoData) {
|
public int bedrockSlotToJava(StackRequestSlotInfoData slotInfoData) {
|
||||||
if (slotInfoData.getContainer() == ContainerSlotType.BEACON_PAYMENT) {
|
if (slotInfoData.getContainer() == ContainerSlotType.BEACON_PAYMENT) {
|
||||||
|
|
|
@ -42,6 +42,7 @@ import org.geysermc.geyser.level.chunk.bitarray.BitArray;
|
||||||
import org.geysermc.geyser.level.chunk.bitarray.BitArrayVersion;
|
import org.geysermc.geyser.level.chunk.bitarray.BitArrayVersion;
|
||||||
import org.geysermc.geyser.level.chunk.bitarray.SingletonBitArray;
|
import org.geysermc.geyser.level.chunk.bitarray.SingletonBitArray;
|
||||||
import org.geysermc.geyser.registry.Registries;
|
import org.geysermc.geyser.registry.Registries;
|
||||||
|
import org.geysermc.geyser.util.JavaCodecEntry;
|
||||||
import org.geysermc.geyser.util.MathUtils;
|
import org.geysermc.geyser.util.MathUtils;
|
||||||
|
|
||||||
// Array index formula by https://wiki.vg/Chunk_Format
|
// Array index formula by https://wiki.vg/Chunk_Format
|
||||||
|
@ -55,27 +56,26 @@ public class BiomeTranslator {
|
||||||
ListTag serverBiomes = worldGen.get("value");
|
ListTag serverBiomes = worldGen.get("value");
|
||||||
session.setBiomeGlobalPalette(MathUtils.getGlobalPaletteForSize(serverBiomes.size()));
|
session.setBiomeGlobalPalette(MathUtils.getGlobalPaletteForSize(serverBiomes.size()));
|
||||||
|
|
||||||
for (Tag tag : serverBiomes) {
|
for (CompoundTag biomeTag : JavaCodecEntry.iterateOverTag(worldGen)) {
|
||||||
CompoundTag biomeTag = (CompoundTag) tag;
|
|
||||||
|
|
||||||
String javaIdentifier = ((StringTag) biomeTag.get("name")).getValue();
|
String javaIdentifier = ((StringTag) biomeTag.get("name")).getValue();
|
||||||
int bedrockId = Registries.BIOME_IDENTIFIERS.get().getOrDefault(javaIdentifier, -1);
|
int bedrockId = Registries.BIOME_IDENTIFIERS.get().getOrDefault(javaIdentifier, 0);
|
||||||
int javaId = ((IntTag) biomeTag.get("id")).getValue();
|
int javaId = ((IntTag) biomeTag.get("id")).getValue();
|
||||||
|
|
||||||
if (bedrockId == -1) {
|
// TODO - the category tag no longer exists - find a better replacement option
|
||||||
// There is no matching Bedrock variation for this biome; let's set the closest match based on biome category
|
// if (bedrockId == -1) {
|
||||||
String category = ((StringTag) ((CompoundTag) biomeTag.get("element")).get("category")).getValue();
|
// // There is no matching Bedrock variation for this biome; let's set the closest match based on biome category
|
||||||
String replacementBiome = switch (category) {
|
// String category = ((StringTag) ((CompoundTag) biomeTag.get("element")).get("category")).getValue();
|
||||||
case "extreme_hills" -> "minecraft:mountains";
|
// String replacementBiome = switch (category) {
|
||||||
case "icy" -> "minecraft:ice_spikes";
|
// case "extreme_hills" -> "minecraft:mountains";
|
||||||
case "mesa" -> "minecraft:badlands";
|
// case "icy" -> "minecraft:ice_spikes";
|
||||||
case "mushroom" -> "minecraft:mushroom_fields";
|
// case "mesa" -> "minecraft:badlands";
|
||||||
case "nether" -> "minecraft:nether_wastes";
|
// case "mushroom" -> "minecraft:mushroom_fields";
|
||||||
default -> "minecraft:ocean"; // Typically ID 0 so a good default
|
// case "nether" -> "minecraft:nether_wastes";
|
||||||
case "taiga", "jungle", "plains", "savanna", "the_end", "beach", "ocean", "desert", "river", "swamp" -> "minecraft:" + category;
|
// default -> "minecraft:ocean"; // Typically ID 0 so a good default
|
||||||
};
|
// case "taiga", "jungle", "plains", "savanna", "the_end", "beach", "ocean", "desert", "river", "swamp" -> "minecraft:" + category;
|
||||||
bedrockId = Registries.BIOME_IDENTIFIERS.get().getInt(replacementBiome);
|
// };
|
||||||
}
|
// bedrockId = Registries.BIOME_IDENTIFIERS.get().getInt(replacementBiome);
|
||||||
|
// }
|
||||||
|
|
||||||
// When we see the Java ID, we should instead apply the Bedrock ID
|
// When we see the Java ID, we should instead apply the Bedrock ID
|
||||||
biomeTranslations.put(javaId, bedrockId);
|
biomeTranslations.put(javaId, bedrockId);
|
||||||
|
|
|
@ -25,15 +25,13 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.bedrock;
|
package org.geysermc.geyser.translator.protocol.bedrock;
|
||||||
|
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.CommandRequestPacket;
|
||||||
import org.geysermc.common.PlatformType;
|
import org.geysermc.common.PlatformType;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.geyser.command.CommandManager;
|
import org.geysermc.geyser.command.CommandManager;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket;
|
|
||||||
import com.nukkitx.protocol.bedrock.packet.CommandRequestPacket;
|
|
||||||
import org.geysermc.geyser.translator.text.MessageTranslator;
|
import org.geysermc.geyser.translator.text.MessageTranslator;
|
||||||
|
|
||||||
@Translator(packet = CommandRequestPacket.class)
|
@Translator(packet = CommandRequestPacket.class)
|
||||||
|
@ -52,8 +50,7 @@ public class BedrockCommandRequestTranslator extends PacketTranslator<CommandReq
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerboundChatPacket chatPacket = new ServerboundChatPacket(message);
|
session.sendCommand(message.substring(1));
|
||||||
session.sendDownstreamPacket(chatPacket);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,8 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
ServerboundPlayerActionPacket dropPacket = new ServerboundPlayerActionPacket(
|
ServerboundPlayerActionPacket dropPacket = new ServerboundPlayerActionPacket(
|
||||||
dropAll ? PlayerAction.DROP_ITEM_STACK : PlayerAction.DROP_ITEM,
|
dropAll ? PlayerAction.DROP_ITEM_STACK : PlayerAction.DROP_ITEM,
|
||||||
BlockUtils.POSITION_ZERO,
|
BlockUtils.POSITION_ZERO,
|
||||||
Direction.DOWN
|
Direction.DOWN,
|
||||||
|
session.getNextSequence()
|
||||||
);
|
);
|
||||||
session.sendDownstreamPacket(dropPacket);
|
session.sendDownstreamPacket(dropPacket);
|
||||||
|
|
||||||
|
@ -256,7 +257,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
if (blockState == BlockStateValues.JAVA_WATER_ID) {
|
if (blockState == BlockStateValues.JAVA_WATER_ID) {
|
||||||
// Otherwise causes multiple mobs to spawn - just send a use item packet
|
// Otherwise causes multiple mobs to spawn - just send a use item packet
|
||||||
// TODO when we fix mobile bucket rotation, use it for this, too
|
// TODO when we fix mobile bucket rotation, use it for this, too
|
||||||
ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND);
|
ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(itemPacket);
|
session.sendDownstreamPacket(itemPacket);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -267,13 +268,14 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
Direction.VALUES[packet.getBlockFace()],
|
Direction.VALUES[packet.getBlockFace()],
|
||||||
Hand.MAIN_HAND,
|
Hand.MAIN_HAND,
|
||||||
packet.getClickPosition().getX(), packet.getClickPosition().getY(), packet.getClickPosition().getZ(),
|
packet.getClickPosition().getX(), packet.getClickPosition().getY(), packet.getClickPosition().getZ(),
|
||||||
false);
|
false,
|
||||||
|
session.getNextSequence());
|
||||||
session.sendDownstreamPacket(blockPacket);
|
session.sendDownstreamPacket(blockPacket);
|
||||||
|
|
||||||
if (packet.getItemInHand() != null) {
|
if (packet.getItemInHand() != null) {
|
||||||
// Otherwise boats will not be able to be placed in survival and buckets won't work on mobile
|
// Otherwise boats will not be able to be placed in survival and buckets won't work on mobile
|
||||||
if (session.getItemMappings().getBoatIds().contains(packet.getItemInHand().getId())) {
|
if (session.getItemMappings().getBoatIds().contains(packet.getItemInHand().getId())) {
|
||||||
ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND);
|
ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(itemPacket);
|
session.sendDownstreamPacket(itemPacket);
|
||||||
} else if (session.getItemMappings().getBucketIds().contains(packet.getItemInHand().getId())) {
|
} else if (session.getItemMappings().getBucketIds().contains(packet.getItemInHand().getId())) {
|
||||||
// Let the server decide if the bucket item should change, not the client, and revert the changes the client made
|
// Let the server decide if the bucket item should change, not the client, and revert the changes the client made
|
||||||
|
@ -290,7 +292,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
// Delay the interaction in case the client doesn't intend to actually use the bucket
|
// Delay the interaction in case the client doesn't intend to actually use the bucket
|
||||||
// See BedrockActionTranslator.java
|
// See BedrockActionTranslator.java
|
||||||
session.setBucketScheduledFuture(session.scheduleInEventLoop(() -> {
|
session.setBucketScheduledFuture(session.scheduleInEventLoop(() -> {
|
||||||
ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND);
|
ServerboundUseItemPacket itemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(itemPacket);
|
session.sendDownstreamPacket(itemPacket);
|
||||||
}, 5, TimeUnit.MILLISECONDS));
|
}, 5, TimeUnit.MILLISECONDS));
|
||||||
}
|
}
|
||||||
|
@ -336,7 +338,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerboundUseItemPacket useItemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND);
|
ServerboundUseItemPacket useItemPacket = new ServerboundUseItemPacket(Hand.MAIN_HAND, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(useItemPacket);
|
session.sendDownstreamPacket(useItemPacket);
|
||||||
|
|
||||||
List<LegacySetItemSlotData> legacySlots = packet.getLegacySlots();
|
List<LegacySetItemSlotData> legacySlots = packet.getLegacySlots();
|
||||||
|
@ -418,7 +420,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
|
|
||||||
PlayerAction action = session.getGameMode() == GameMode.CREATIVE ? PlayerAction.START_DIGGING : PlayerAction.FINISH_DIGGING;
|
PlayerAction action = session.getGameMode() == GameMode.CREATIVE ? PlayerAction.START_DIGGING : PlayerAction.FINISH_DIGGING;
|
||||||
Position pos = new Position(packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ());
|
Position pos = new Position(packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ());
|
||||||
ServerboundPlayerActionPacket breakPacket = new ServerboundPlayerActionPacket(action, pos, Direction.VALUES[packet.getBlockFace()]);
|
ServerboundPlayerActionPacket breakPacket = new ServerboundPlayerActionPacket(action, pos, Direction.VALUES[packet.getBlockFace()], session.getNextSequence());
|
||||||
session.sendDownstreamPacket(breakPacket);
|
session.sendDownstreamPacket(breakPacket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -427,7 +429,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
if (packet.getActionType() == 0) {
|
if (packet.getActionType() == 0) {
|
||||||
// Followed to the Minecraft Protocol specification outlined at wiki.vg
|
// Followed to the Minecraft Protocol specification outlined at wiki.vg
|
||||||
ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.RELEASE_USE_ITEM, BlockUtils.POSITION_ZERO,
|
ServerboundPlayerActionPacket releaseItemPacket = new ServerboundPlayerActionPacket(PlayerAction.RELEASE_USE_ITEM, BlockUtils.POSITION_ZERO,
|
||||||
Direction.DOWN);
|
Direction.DOWN, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(releaseItemPacket);
|
session.sendDownstreamPacket(releaseItemPacket);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -57,7 +57,8 @@ public class BedrockLecternUpdateTranslator extends PacketTranslator<LecternUpda
|
||||||
Direction.DOWN,
|
Direction.DOWN,
|
||||||
Hand.MAIN_HAND,
|
Hand.MAIN_HAND,
|
||||||
0, 0, 0, // Java doesn't care about these when dealing with a lectern
|
0, 0, 0, // Java doesn't care about these when dealing with a lectern
|
||||||
false);
|
false,
|
||||||
|
session.getNextSequence());
|
||||||
session.sendDownstreamPacket(blockPacket);
|
session.sendDownstreamPacket(blockPacket);
|
||||||
} else {
|
} else {
|
||||||
// Bedrock wants to either move a page or exit
|
// Bedrock wants to either move a page or exit
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class BedrockMobEquipmentTranslator extends PacketTranslator<MobEquipment
|
||||||
// Activate shield since we are already sneaking
|
// Activate shield since we are already sneaking
|
||||||
// (No need to send a release item packet - Java doesn't do this when swapping items)
|
// (No need to send a release item packet - Java doesn't do this when swapping items)
|
||||||
// Required to do it a tick later or else it doesn't register
|
// Required to do it a tick later or else it doesn't register
|
||||||
session.scheduleInEventLoop(() -> session.sendDownstreamPacket(new ServerboundUseItemPacket(Hand.MAIN_HAND)),
|
session.scheduleInEventLoop(() -> session.sendDownstreamPacket(new ServerboundUseItemPacket(Hand.MAIN_HAND, session.getNextSequence())),
|
||||||
50, TimeUnit.MILLISECONDS);
|
50, TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.bedrock;
|
package org.geysermc.geyser.translator.protocol.bedrock;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket;
|
|
||||||
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.text.ChatColor;
|
import org.geysermc.geyser.text.ChatColor;
|
||||||
|
@ -63,7 +62,6 @@ public class BedrockTextTranslator extends PacketTranslator<TextPacket> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerboundChatPacket chatPacket = new ServerboundChatPacket(message);
|
session.sendChat(message);
|
||||||
session.sendDownstreamPacket(chatPacket);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,7 +130,8 @@ public class BedrockActionTranslator extends PacketTranslator<PlayerActionPacket
|
||||||
break;
|
break;
|
||||||
case DROP_ITEM:
|
case DROP_ITEM:
|
||||||
Position position = new Position(vector.getX(), vector.getY(), vector.getZ());
|
Position position = new Position(vector.getX(), vector.getY(), vector.getZ());
|
||||||
ServerboundPlayerActionPacket dropItemPacket = new ServerboundPlayerActionPacket(PlayerAction.DROP_ITEM, position, Direction.VALUES[packet.getFace()]);
|
ServerboundPlayerActionPacket dropItemPacket = new ServerboundPlayerActionPacket(PlayerAction.DROP_ITEM,
|
||||||
|
position, Direction.VALUES[packet.getFace()], session.getNextSequence());
|
||||||
session.sendDownstreamPacket(dropItemPacket);
|
session.sendDownstreamPacket(dropItemPacket);
|
||||||
break;
|
break;
|
||||||
case STOP_SLEEP:
|
case STOP_SLEEP:
|
||||||
|
@ -164,7 +165,7 @@ public class BedrockActionTranslator extends PacketTranslator<PlayerActionPacket
|
||||||
String identifier = BlockRegistries.JAVA_IDENTIFIERS.get().get(blockUp);
|
String identifier = BlockRegistries.JAVA_IDENTIFIERS.get().get(blockUp);
|
||||||
if (identifier.startsWith("minecraft:fire") || identifier.startsWith("minecraft:soul_fire")) {
|
if (identifier.startsWith("minecraft:fire") || identifier.startsWith("minecraft:soul_fire")) {
|
||||||
ServerboundPlayerActionPacket startBreakingPacket = new ServerboundPlayerActionPacket(PlayerAction.START_DIGGING, new Position(fireBlockPos.getX(),
|
ServerboundPlayerActionPacket startBreakingPacket = new ServerboundPlayerActionPacket(PlayerAction.START_DIGGING, new Position(fireBlockPos.getX(),
|
||||||
fireBlockPos.getY(), fireBlockPos.getZ()), Direction.VALUES[packet.getFace()]);
|
fireBlockPos.getY(), fireBlockPos.getZ()), Direction.VALUES[packet.getFace()], session.getNextSequence());
|
||||||
session.sendDownstreamPacket(startBreakingPacket);
|
session.sendDownstreamPacket(startBreakingPacket);
|
||||||
if (session.getGameMode() == GameMode.CREATIVE) {
|
if (session.getGameMode() == GameMode.CREATIVE) {
|
||||||
break;
|
break;
|
||||||
|
@ -172,7 +173,8 @@ public class BedrockActionTranslator extends PacketTranslator<PlayerActionPacket
|
||||||
}
|
}
|
||||||
|
|
||||||
position = new Position(vector.getX(), vector.getY(), vector.getZ());
|
position = new Position(vector.getX(), vector.getY(), vector.getZ());
|
||||||
ServerboundPlayerActionPacket startBreakingPacket = new ServerboundPlayerActionPacket(PlayerAction.START_DIGGING, position, Direction.VALUES[packet.getFace()]);
|
ServerboundPlayerActionPacket startBreakingPacket = new ServerboundPlayerActionPacket(PlayerAction.START_DIGGING,
|
||||||
|
position, Direction.VALUES[packet.getFace()], session.getNextSequence());
|
||||||
session.sendDownstreamPacket(startBreakingPacket);
|
session.sendDownstreamPacket(startBreakingPacket);
|
||||||
break;
|
break;
|
||||||
case CONTINUE_BREAK:
|
case CONTINUE_BREAK:
|
||||||
|
@ -208,7 +210,7 @@ public class BedrockActionTranslator extends PacketTranslator<PlayerActionPacket
|
||||||
}
|
}
|
||||||
|
|
||||||
position = new Position(vector.getX(), vector.getY(), vector.getZ());
|
position = new Position(vector.getX(), vector.getY(), vector.getZ());
|
||||||
ServerboundPlayerActionPacket abortBreakingPacket = new ServerboundPlayerActionPacket(PlayerAction.CANCEL_DIGGING, position, Direction.DOWN);
|
ServerboundPlayerActionPacket abortBreakingPacket = new ServerboundPlayerActionPacket(PlayerAction.CANCEL_DIGGING, position, Direction.DOWN, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(abortBreakingPacket);
|
session.sendDownstreamPacket(abortBreakingPacket);
|
||||||
LevelEventPacket stopBreak = new LevelEventPacket();
|
LevelEventPacket stopBreak = new LevelEventPacket();
|
||||||
stopBreak.setType(LevelEventType.BLOCK_STOP_BREAK);
|
stopBreak.setType(LevelEventType.BLOCK_STOP_BREAK);
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class BedrockEmoteTranslator extends PacketTranslator<EmotePacket> {
|
||||||
if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() != EmoteOffhandWorkaroundOption.DISABLED) {
|
if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() != EmoteOffhandWorkaroundOption.DISABLED) {
|
||||||
// Activate the workaround - we should trigger the offhand now
|
// Activate the workaround - we should trigger the offhand now
|
||||||
ServerboundPlayerActionPacket swapHandsPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, BlockUtils.POSITION_ZERO,
|
ServerboundPlayerActionPacket swapHandsPacket = new ServerboundPlayerActionPacket(PlayerAction.SWAP_HANDS, BlockUtils.POSITION_ZERO,
|
||||||
Direction.DOWN);
|
Direction.DOWN, session.getNextSequence());
|
||||||
session.sendDownstreamPacket(swapHandsPacket);
|
session.sendDownstreamPacket(swapHandsPacket);
|
||||||
|
|
||||||
if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() == EmoteOffhandWorkaroundOption.NO_EMOTES) {
|
if (session.getGeyser().getConfig().getEmoteOffhandWorkaround() == EmoteOffhandWorkaroundOption.NO_EMOTES) {
|
||||||
|
|
|
@ -222,7 +222,7 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
|
||||||
case BLOCK_POS -> CommandParam.BLOCK_POSITION;
|
case BLOCK_POS -> CommandParam.BLOCK_POSITION;
|
||||||
case COLUMN_POS, VEC3 -> CommandParam.POSITION;
|
case COLUMN_POS, VEC3 -> CommandParam.POSITION;
|
||||||
case MESSAGE -> CommandParam.MESSAGE;
|
case MESSAGE -> CommandParam.MESSAGE;
|
||||||
case NBT, NBT_COMPOUND_TAG, NBT_TAG, NBT_PATH -> CommandParam.JSON;
|
case NBT_COMPOUND_TAG, NBT_TAG, NBT_PATH -> CommandParam.JSON; //TODO NBT was removed
|
||||||
case RESOURCE_LOCATION, FUNCTION -> CommandParam.FILE_PATH;
|
case RESOURCE_LOCATION, FUNCTION -> CommandParam.FILE_PATH;
|
||||||
case BOOL -> ENUM_BOOLEAN;
|
case BOOL -> ENUM_BOOLEAN;
|
||||||
case OPERATION -> CommandParam.OPERATOR; // ">=", "==", etc
|
case OPERATION -> CommandParam.OPERATOR; // ">=", "==", etc
|
||||||
|
|
|
@ -25,8 +25,12 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.java;
|
package org.geysermc.geyser.translator.protocol.java;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.MessageType;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCustomPayloadPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCustomPayloadPacket;
|
||||||
|
import com.github.steveice10.opennbt.SNBTIO;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.IntTag;
|
||||||
import com.nukkitx.protocol.bedrock.data.GameRuleData;
|
import com.nukkitx.protocol.bedrock.data.GameRuleData;
|
||||||
import com.nukkitx.protocol.bedrock.data.PlayerPermission;
|
import com.nukkitx.protocol.bedrock.data.PlayerPermission;
|
||||||
import com.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket;
|
import com.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket;
|
||||||
|
@ -40,8 +44,14 @@ import org.geysermc.geyser.session.auth.AuthType;
|
||||||
import org.geysermc.geyser.translator.level.BiomeTranslator;
|
import org.geysermc.geyser.translator.level.BiomeTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
|
import org.geysermc.geyser.util.ChunkUtils;
|
||||||
|
import org.geysermc.geyser.util.DimensionUtils;
|
||||||
|
import org.geysermc.geyser.util.JavaCodecEntry;
|
||||||
import org.geysermc.geyser.util.PluginMessageUtils;
|
import org.geysermc.geyser.util.PluginMessageUtils;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Translator(packet = ClientboundLoginPacket.class)
|
@Translator(packet = ClientboundLoginPacket.class)
|
||||||
|
@ -55,12 +65,37 @@ public class JavaLoginTranslator extends PacketTranslator<ClientboundLoginPacket
|
||||||
Map<String, JavaDimension> dimensions = session.getDimensions();
|
Map<String, JavaDimension> dimensions = session.getDimensions();
|
||||||
dimensions.clear();
|
dimensions.clear();
|
||||||
|
|
||||||
|
JavaDimension.load(packet.getDimensionCodec(), dimensions);
|
||||||
|
|
||||||
|
SNBTIO.StringifiedNBTWriter writer = new SNBTIO.StringifiedNBTWriter(System.out);
|
||||||
|
try {
|
||||||
|
writer.writeTag(packet.getDimensionCodec(), true);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (CompoundTag tag : JavaCodecEntry.iterateOverTag(packet.getDimensionCodec().get("minecraft:chat_type"))) {
|
||||||
|
int id = ((IntTag) tag.get("id")).getValue();
|
||||||
|
MessageType type = MessageType.values()[id];
|
||||||
|
CompoundTag element = tag.get("element");
|
||||||
|
CompoundTag chat = element.get("chat");
|
||||||
|
if (chat == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try (ByteArrayOutputStream out = new ByteArrayOutputStream(); SNBTIO.StringifiedNBTWriter nbtWriter = new SNBTIO.StringifiedNBTWriter(out)) {
|
||||||
|
nbtWriter.writeTag(chat, false);
|
||||||
|
System.out.println(out.toString(StandardCharsets.UTF_8));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If the player is already initialized and a join game packet is sent, they
|
// If the player is already initialized and a join game packet is sent, they
|
||||||
// are swapping servers
|
// are swapping servers
|
||||||
//String newDimension = DimensionUtils.getNewDimension(packet.getDimension());
|
|
||||||
if (session.isSpawned()) {
|
if (session.isSpawned()) {
|
||||||
//String fakeDim = DimensionUtils.getTemporaryDimension(session.getDimension(), newDimension);
|
String fakeDim = DimensionUtils.getTemporaryDimension(session.getDimension(), packet.getDimension());
|
||||||
//DimensionUtils.switchDimension(session, fakeDim);
|
DimensionUtils.switchDimension(session, fakeDim);
|
||||||
|
|
||||||
session.getWorldCache().removeScoreboard();
|
session.getWorldCache().removeScoreboard();
|
||||||
}
|
}
|
||||||
|
@ -110,13 +145,15 @@ public class JavaLoginTranslator extends PacketTranslator<ClientboundLoginPacket
|
||||||
session.sendDownstreamPacket(new ServerboundCustomPayloadPacket("minecraft:register", PluginMessageChannels.getFloodgateRegisterData()));
|
session.sendDownstreamPacket(new ServerboundCustomPayloadPacket("minecraft:register", PluginMessageChannels.getFloodgateRegisterData()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (!newDimension.equals(session.getDimension())) {
|
String newDimension = packet.getDimension();
|
||||||
// DimensionUtils.switchDimension(session, newDimension);
|
if (!newDimension.equals(session.getDimension())) {
|
||||||
// } else if (DimensionUtils.isCustomBedrockNetherId() && newDimension.equalsIgnoreCase(DimensionUtils.NETHER)) {
|
DimensionUtils.switchDimension(session, newDimension);
|
||||||
// // If the player is spawning into the "fake" nether, send them some fog
|
} else if (DimensionUtils.isCustomBedrockNetherId() && newDimension.equalsIgnoreCase(DimensionUtils.NETHER)) {
|
||||||
// session.sendFog("minecraft:fog_hell");
|
// If the player is spawning into the "fake" nether, send them some fog
|
||||||
// }
|
session.sendFog("minecraft:fog_hell");
|
||||||
|
}
|
||||||
|
|
||||||
//ChunkUtils.loadDimensionTag(session, packet.getDimension());
|
session.setDimensionType(dimensions.get(newDimension));
|
||||||
|
ChunkUtils.loadDimension(session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.geyser.translator.protocol.java;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerChatPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
|
import org.geysermc.geyser.translator.text.MessageTranslator;
|
||||||
|
|
||||||
|
@Translator(packet = ClientboundPlayerChatPacket.class)
|
||||||
|
public class JavaPlayerChatTranslator extends PacketTranslator<ClientboundPlayerChatPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(GeyserSession session, ClientboundPlayerChatPacket packet) {
|
||||||
|
System.out.println(packet);
|
||||||
|
TextPacket textPacket = new TextPacket();
|
||||||
|
textPacket.setPlatformChatId("");
|
||||||
|
textPacket.setSourceName("");
|
||||||
|
textPacket.setXuid(session.getAuthData().xuid());
|
||||||
|
// TODO new types
|
||||||
|
textPacket.setType(switch (packet.getType()) {
|
||||||
|
case CHAT -> TextPacket.Type.CHAT;
|
||||||
|
case SYSTEM -> TextPacket.Type.SYSTEM;
|
||||||
|
case GAME_INFO -> TextPacket.Type.TIP;
|
||||||
|
default -> TextPacket.Type.RAW;
|
||||||
|
});
|
||||||
|
|
||||||
|
textPacket.setNeedsTranslation(false);
|
||||||
|
Component message = packet.getUnsignedContent() == null ? packet.getSignedContent() : packet.getUnsignedContent();
|
||||||
|
textPacket.setMessage(MessageTranslator.convertMessage(message, session.getLocale()));
|
||||||
|
|
||||||
|
session.sendUpstreamPacket(textPacket);
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,9 +33,9 @@ import com.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket;
|
||||||
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
|
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
|
||||||
import org.geysermc.geyser.entity.type.player.SessionPlayerEntity;
|
import org.geysermc.geyser.entity.type.player.SessionPlayerEntity;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
|
|
||||||
import org.geysermc.geyser.util.ChunkUtils;
|
import org.geysermc.geyser.util.ChunkUtils;
|
||||||
import org.geysermc.geyser.util.DimensionUtils;
|
import org.geysermc.geyser.util.DimensionUtils;
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ public class JavaRespawnTranslator extends PacketTranslator<ClientboundRespawnPa
|
||||||
session.setThunder(false);
|
session.setThunder(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
String newDimension = DimensionUtils.getNewDimension(packet.getDimension());
|
String newDimension = packet.getDimension();
|
||||||
if (!session.getDimension().equals(newDimension) || !packet.getWorldName().equals(session.getWorldName())) {
|
if (!session.getDimension().equals(newDimension) || !packet.getWorldName().equals(session.getWorldName())) {
|
||||||
// Switching to a new world (based off the world name change); send a fake dimension change
|
// Switching to a new world (based off the world name change); send a fake dimension change
|
||||||
if (!packet.getWorldName().equals(session.getWorldName()) && (session.getDimension().equals(newDimension)
|
if (!packet.getWorldName().equals(session.getWorldName()) && (session.getDimension().equals(newDimension)
|
||||||
|
@ -90,8 +90,9 @@ public class JavaRespawnTranslator extends PacketTranslator<ClientboundRespawnPa
|
||||||
}
|
}
|
||||||
session.setWorldName(packet.getWorldName());
|
session.setWorldName(packet.getWorldName());
|
||||||
DimensionUtils.switchDimension(session, newDimension);
|
DimensionUtils.switchDimension(session, newDimension);
|
||||||
}
|
|
||||||
|
|
||||||
ChunkUtils.loadDimensionTag(session, packet.getDimension());
|
session.setDimensionType(session.getDimensions().get(newDimension));
|
||||||
|
ChunkUtils.loadDimension(session);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ public class JavaSystemChatTranslator extends PacketTranslator<ClientboundSystem
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, ClientboundSystemChatPacket packet) {
|
public void translate(GeyserSession session, ClientboundSystemChatPacket packet) {
|
||||||
|
System.out.println(packet);
|
||||||
TextPacket textPacket = new TextPacket();
|
TextPacket textPacket = new TextPacket();
|
||||||
textPacket.setPlatformChatId("");
|
textPacket.setPlatformChatId("");
|
||||||
textPacket.setSourceName("");
|
textPacket.setSourceName("");
|
||||||
|
|
|
@ -26,8 +26,6 @@
|
||||||
package org.geysermc.geyser.util;
|
package org.geysermc.geyser.util;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
|
||||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
|
||||||
import com.github.steveice10.opennbt.tag.builtin.IntTag;
|
|
||||||
import com.nukkitx.math.vector.Vector2i;
|
import com.nukkitx.math.vector.Vector2i;
|
||||||
import com.nukkitx.math.vector.Vector3i;
|
import com.nukkitx.math.vector.Vector3i;
|
||||||
import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket;
|
import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket;
|
||||||
|
@ -38,16 +36,15 @@ import io.netty.buffer.Unpooled;
|
||||||
import it.unimi.dsi.fastutil.ints.IntLists;
|
import it.unimi.dsi.fastutil.ints.IntLists;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import org.geysermc.geyser.entity.type.ItemFrameEntity;
|
import org.geysermc.geyser.entity.type.ItemFrameEntity;
|
||||||
import org.geysermc.geyser.entity.type.player.SkullPlayerEntity;
|
import org.geysermc.geyser.level.BedrockDimension;
|
||||||
|
import org.geysermc.geyser.level.JavaDimension;
|
||||||
import org.geysermc.geyser.level.block.BlockStateValues;
|
import org.geysermc.geyser.level.block.BlockStateValues;
|
||||||
import org.geysermc.geyser.level.chunk.BlockStorage;
|
import org.geysermc.geyser.level.chunk.BlockStorage;
|
||||||
import org.geysermc.geyser.level.chunk.GeyserChunkSection;
|
import org.geysermc.geyser.level.chunk.GeyserChunkSection;
|
||||||
import org.geysermc.geyser.level.chunk.bitarray.SingletonBitArray;
|
import org.geysermc.geyser.level.chunk.bitarray.SingletonBitArray;
|
||||||
import org.geysermc.geyser.registry.BlockRegistries;
|
import org.geysermc.geyser.registry.BlockRegistries;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.session.cache.SkullCache;
|
|
||||||
import org.geysermc.geyser.text.GeyserLocale;
|
import org.geysermc.geyser.text.GeyserLocale;
|
||||||
import org.geysermc.geyser.level.BedrockDimension;
|
|
||||||
import org.geysermc.geyser.translator.level.block.entity.BedrockOnlyBlockEntity;
|
import org.geysermc.geyser.translator.level.block.entity.BedrockOnlyBlockEntity;
|
||||||
|
|
||||||
import static org.geysermc.geyser.level.block.BlockStateValues.JAVA_AIR_ID;
|
import static org.geysermc.geyser.level.block.BlockStateValues.JAVA_AIR_ID;
|
||||||
|
@ -227,10 +224,10 @@ public class ChunkUtils {
|
||||||
* Process the minimum and maximum heights for this dimension, and processes the world coordinate scale.
|
* Process the minimum and maximum heights for this dimension, and processes the world coordinate scale.
|
||||||
* This must be done after the player has switched dimensions so we know what their dimension is
|
* This must be done after the player has switched dimensions so we know what their dimension is
|
||||||
*/
|
*/
|
||||||
public static void loadDimensionTag(GeyserSession session, CompoundTag dimensionTag) {
|
public static void loadDimension(GeyserSession session) {
|
||||||
int minY = ((IntTag) dimensionTag.get("min_y")).getValue();
|
JavaDimension dimension = session.getDimensionType();
|
||||||
int maxY = ((IntTag) dimensionTag.get("height")).getValue();
|
int minY = dimension.minY();
|
||||||
// Logical height can be ignored probably - seems to be for artificial limits like the Nether.
|
int maxY = dimension.maxY();
|
||||||
|
|
||||||
if (minY % 16 != 0) {
|
if (minY % 16 != 0) {
|
||||||
throw new RuntimeException("Minimum Y must be a multiple of 16!");
|
throw new RuntimeException("Minimum Y must be a multiple of 16!");
|
||||||
|
@ -259,11 +256,6 @@ public class ChunkUtils {
|
||||||
session.getChunkCache().setMinY(minY);
|
session.getChunkCache().setMinY(minY);
|
||||||
session.getChunkCache().setHeightY(maxY);
|
session.getChunkCache().setHeightY(maxY);
|
||||||
|
|
||||||
// Load world coordinate scale for the world border
|
session.getWorldBorder().setWorldCoordinateScale(dimension.worldCoordinateScale());
|
||||||
double coordinateScale = ((Number) dimensionTag.get("coordinate_scale").getValue()).doubleValue();
|
|
||||||
session.getWorldBorder().setWorldCoordinateScale(coordinateScale);
|
|
||||||
|
|
||||||
// Set if piglins/hoglins should shake
|
|
||||||
session.setDimensionPiglinSafe(((Number) dimensionTag.get("piglin_safe").getValue()).byteValue() != (byte) 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,13 +26,10 @@
|
||||||
package org.geysermc.geyser.util;
|
package org.geysermc.geyser.util;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.Effect;
|
import com.github.steveice10.mc.protocol.data.game.entity.Effect;
|
||||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
|
||||||
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
import com.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket;
|
import com.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.MobEffectPacket;
|
import com.nukkitx.protocol.bedrock.packet.MobEffectPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.StopSoundPacket;
|
import com.nukkitx.protocol.bedrock.packet.StopSoundPacket;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
|
||||||
import org.geysermc.geyser.entity.type.Entity;
|
import org.geysermc.geyser.entity.type.Entity;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
|
||||||
|
@ -131,25 +128,6 @@ public class DimensionUtils {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines the new dimension based on the {@link CompoundTag} sent by either the {@link com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket}
|
|
||||||
* or {@link com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundRespawnPacket}.
|
|
||||||
*
|
|
||||||
* @param dimensionTag the packet's dimension tag.
|
|
||||||
* @return the dimension identifier.
|
|
||||||
*/
|
|
||||||
public static String getNewDimension(CompoundTag dimensionTag) {
|
|
||||||
if (dimensionTag == null || dimensionTag.isEmpty()) {
|
|
||||||
GeyserImpl.getInstance().getLogger().debug("Dimension tag was null or empty.");
|
|
||||||
return OVERWORLD;
|
|
||||||
}
|
|
||||||
if (dimensionTag.getValue().get("effects") != null) {
|
|
||||||
return ((StringTag) dimensionTag.getValue().get("effects")).getValue();
|
|
||||||
}
|
|
||||||
GeyserImpl.getInstance().getLogger().debug("Effects portion of the tag was null or empty.");
|
|
||||||
return OVERWORLD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Nether dimension in Bedrock does not permit building above Y128 - the Bedrock above the dimension.
|
* The Nether dimension in Bedrock does not permit building above Y128 - the Bedrock above the dimension.
|
||||||
* This workaround sets the Nether as the End dimension to ignore this limit.
|
* This workaround sets the Nether as the End dimension to ignore this limit.
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.geyser.util;
|
||||||
|
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.ListTag;
|
||||||
|
import com.github.steveice10.opennbt.tag.builtin.Tag;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
public record JavaCodecEntry() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over a Java Edition codec as a CompoundTag
|
||||||
|
*/
|
||||||
|
public static Iterable<CompoundTag> iterateOverTag(CompoundTag tag) {
|
||||||
|
ListTag value = tag.get("value");
|
||||||
|
Iterator<Tag> originalIterator = value.iterator();
|
||||||
|
return new Iterable<>() {
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public Iterator<CompoundTag> iterator() {
|
||||||
|
return new Iterator<>() {
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return originalIterator.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompoundTag next() {
|
||||||
|
return (CompoundTag) originalIterator.next();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue