mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Add type check in JavaBlockEntityDataTranslator, ensure deprecated setBlockEntity() method still sets piston behavior
This commit is contained in:
parent
82724b4020
commit
be5ff947f1
4 changed files with 17 additions and 14 deletions
|
|
@ -111,7 +111,7 @@ public interface JavaBlockState {
|
||||||
* @deprecated Does not have an effect. If you were using this to
|
* @deprecated Does not have an effect. If you were using this to
|
||||||
* * set piston behavior, use {@link #pistonBehavior(String)} instead.
|
* * set piston behavior, use {@link #pistonBehavior(String)} instead.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated(forRemoval = true)
|
||||||
Builder hasBlockEntity(boolean hasBlockEntity);
|
Builder hasBlockEntity(boolean hasBlockEntity);
|
||||||
|
|
||||||
JavaBlockState build();
|
JavaBlockState build();
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ public class GeyserJavaBlockState implements JavaBlockState {
|
||||||
boolean canBreakWithHand;
|
boolean canBreakWithHand;
|
||||||
String pickItem;
|
String pickItem;
|
||||||
String pistonBehavior;
|
String pistonBehavior;
|
||||||
boolean hasBlockEntity;
|
|
||||||
|
|
||||||
private GeyserJavaBlockState(Builder builder) {
|
private GeyserJavaBlockState(Builder builder) {
|
||||||
this.identifier = builder.identifier;
|
this.identifier = builder.identifier;
|
||||||
|
|
@ -28,7 +27,6 @@ public class GeyserJavaBlockState implements JavaBlockState {
|
||||||
this.canBreakWithHand = builder.canBreakWithHand;
|
this.canBreakWithHand = builder.canBreakWithHand;
|
||||||
this.pickItem = builder.pickItem;
|
this.pickItem = builder.pickItem;
|
||||||
this.pistonBehavior = builder.pistonBehavior;
|
this.pistonBehavior = builder.pistonBehavior;
|
||||||
this.hasBlockEntity = builder.hasBlockEntity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -76,9 +74,10 @@ public class GeyserJavaBlockState implements JavaBlockState {
|
||||||
return pistonBehavior;
|
return pistonBehavior;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("removal")
|
||||||
@Override
|
@Override
|
||||||
public boolean hasBlockEntity() {
|
public boolean hasBlockEntity() {
|
||||||
return hasBlockEntity;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder implements JavaBlockState.Builder {
|
public static class Builder implements JavaBlockState.Builder {
|
||||||
|
|
@ -91,7 +90,6 @@ public class GeyserJavaBlockState implements JavaBlockState {
|
||||||
private boolean canBreakWithHand;
|
private boolean canBreakWithHand;
|
||||||
private String pickItem;
|
private String pickItem;
|
||||||
private String pistonBehavior;
|
private String pistonBehavior;
|
||||||
private boolean hasBlockEntity;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Builder identifier(@NonNull String identifier) {
|
public Builder identifier(@NonNull String identifier) {
|
||||||
|
|
@ -147,9 +145,13 @@ public class GeyserJavaBlockState implements JavaBlockState {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("removal")
|
||||||
@Override
|
@Override
|
||||||
public Builder hasBlockEntity(boolean hasBlockEntity) {
|
public Builder hasBlockEntity(boolean hasBlockEntity) {
|
||||||
this.hasBlockEntity = hasBlockEntity;
|
// keep the current behavior
|
||||||
|
if (this.pistonBehavior == null && hasBlockEntity) {
|
||||||
|
this.pistonBehavior = "BLOCK";
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,11 +33,11 @@ import org.cloudburstmc.protocol.bedrock.data.structure.StructureMirror;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.structure.StructureRotation;
|
import org.cloudburstmc.protocol.bedrock.data.structure.StructureRotation;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.ContainerOpenPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.ContainerOpenPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket;
|
||||||
|
import org.geysermc.geyser.level.block.Blocks;
|
||||||
import org.geysermc.geyser.level.block.type.BlockState;
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
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.translator.level.block.entity.BlockEntityTranslator;
|
import org.geysermc.geyser.translator.level.block.entity.BlockEntityTranslator;
|
||||||
import org.geysermc.geyser.translator.level.block.entity.RequiresBlockState;
|
|
||||||
import org.geysermc.geyser.translator.level.block.entity.SkullBlockEntityTranslator;
|
import org.geysermc.geyser.translator.level.block.entity.SkullBlockEntityTranslator;
|
||||||
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;
|
||||||
|
|
@ -59,11 +59,11 @@ public class JavaBlockEntityDataTranslator extends PacketTranslator<ClientboundB
|
||||||
BlockEntityTranslator translator = BlockEntityUtils.getBlockEntityTranslator(type);
|
BlockEntityTranslator translator = BlockEntityUtils.getBlockEntityTranslator(type);
|
||||||
// The Java block state is used in BlockEntityTranslator.translateTag() to make up for some inconsistencies
|
// The Java block state is used in BlockEntityTranslator.translateTag() to make up for some inconsistencies
|
||||||
// between Java block states and Bedrock block entity data
|
// between Java block states and Bedrock block entity data
|
||||||
BlockState blockState;
|
BlockState blockState = BlockRegistries.BLOCK_STATES.getOrDefault(session.getGeyser().getWorldManager().getBlockAt(session, packet.getPosition()),
|
||||||
if (translator instanceof RequiresBlockState) {
|
Blocks.AIR.defaultBlockState());
|
||||||
blockState = BlockRegistries.BLOCK_STATES.get(session.getGeyser().getWorldManager().getBlockAt(session, packet.getPosition()));
|
|
||||||
} else {
|
if (blockState.block().blockEntityType() != type) {
|
||||||
blockState = BlockRegistries.BLOCK_STATES.get(0); //TODO
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3i position = packet.getPosition();
|
Vector3i position = packet.getPosition();
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelChunkPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelChunkPacket;
|
||||||
import org.geysermc.geyser.entity.type.ItemFrameEntity;
|
import org.geysermc.geyser.entity.type.ItemFrameEntity;
|
||||||
import org.geysermc.geyser.level.BedrockDimension;
|
import org.geysermc.geyser.level.BedrockDimension;
|
||||||
|
import org.geysermc.geyser.level.block.Blocks;
|
||||||
import org.geysermc.geyser.level.block.type.Block;
|
import org.geysermc.geyser.level.block.type.Block;
|
||||||
import org.geysermc.geyser.level.block.type.BlockState;
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.level.chunk.BlockStorage;
|
import org.geysermc.geyser.level.chunk.BlockStorage;
|
||||||
|
|
@ -398,7 +399,7 @@ public class JavaLevelChunkWithLightTranslator extends PacketTranslator<Clientbo
|
||||||
|
|
||||||
// Get the Java block state ID from block entity position
|
// Get the Java block state ID from block entity position
|
||||||
DataPalette section = javaChunks[(y >> 4) - yOffset];
|
DataPalette section = javaChunks[(y >> 4) - yOffset];
|
||||||
BlockState blockState = BlockRegistries.BLOCK_STATES.get(section.get(x, y & 0xF, z));
|
BlockState blockState = BlockRegistries.BLOCK_STATES.getOrDefault(section.get(x, y & 0xF, z), Blocks.AIR.defaultBlockState());
|
||||||
|
|
||||||
// Note that, since 1.20.5, tags can be null, but Bedrock still needs a default tag to render the item
|
// Note that, since 1.20.5, tags can be null, but Bedrock still needs a default tag to render the item
|
||||||
// Also, some properties - like banner base colors - are part of the tag and is processed here.
|
// Also, some properties - like banner base colors - are part of the tag and is processed here.
|
||||||
|
|
@ -406,7 +407,7 @@ public class JavaLevelChunkWithLightTranslator extends PacketTranslator<Clientbo
|
||||||
|
|
||||||
// The Java server can send block entity data for blocks that aren't actually those blocks.
|
// The Java server can send block entity data for blocks that aren't actually those blocks.
|
||||||
// A Java client ignores these
|
// A Java client ignores these
|
||||||
if (blockState != null && blockState.block().hasBlockEntity() && type.equals(blockState.block().blockEntityType())) {
|
if (blockState.block().hasBlockEntity() && type == blockState.block().blockEntityType()) {
|
||||||
bedrockBlockEntities.add(blockEntityTranslator.getBlockEntityTag(session, type, x + chunkBlockX, y, z + chunkBlockZ, tag, blockState));
|
bedrockBlockEntities.add(blockEntityTranslator.getBlockEntityTag(session, type, x + chunkBlockX, y, z + chunkBlockZ, tag, blockState));
|
||||||
|
|
||||||
// Check for custom skulls
|
// Check for custom skulls
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue