(Incomplete) Update MCProtocolLib

This commit is contained in:
DoctorMacc 2020-06-18 21:44:50 -04:00
parent 38ee19a32a
commit d6119375b2
34 changed files with 121 additions and 166 deletions

View file

@ -66,6 +66,12 @@
<version>8.3.1</version> <version>8.3.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.nukkitx.fastutil</groupId>
<artifactId>fastutil-int-byte-maps</artifactId>
<version>8.3.1</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>com.nukkitx.fastutil</groupId> <groupId>com.nukkitx.fastutil</groupId>
<artifactId>fastutil-int-double-maps</artifactId> <artifactId>fastutil-int-double-maps</artifactId>
@ -99,7 +105,7 @@
<dependency> <dependency>
<groupId>com.github.steveice10</groupId> <groupId>com.github.steveice10</groupId>
<artifactId>mcprotocollib</artifactId> <artifactId>mcprotocollib</artifactId>
<version>4c315aa206</version> <version>013e8e6dc4</version>
<scope>compile</scope> <scope>compile</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>

View file

@ -32,7 +32,6 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction; 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.data.game.world.block.BlockFace;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.mc.protocol.data.message.TextMessage; import com.github.steveice10.mc.protocol.data.message.TextMessage;
import com.github.steveice10.mc.protocol.data.message.TranslationMessage; import com.github.steveice10.mc.protocol.data.message.TranslationMessage;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket;
@ -335,7 +334,7 @@ public class Entity {
Vector3i lastInteractionPos = session.getLastInteractionPosition(); Vector3i lastInteractionPos = session.getLastInteractionPosition();
metadata.put(EntityData.BED_RESPAWN_POS, lastInteractionPos); metadata.put(EntityData.BED_RESPAWN_POS, lastInteractionPos);
if (session.getConnector().getConfig().isCacheChunks()) { if (session.getConnector().getConfig().isCacheChunks()) {
BlockState bed = session.getConnector().getWorldManager().getBlockAt(session, lastInteractionPos.getX(), int bed = session.getConnector().getWorldManager().getBlockAt(session, lastInteractionPos.getX(),
lastInteractionPos.getY(), lastInteractionPos.getZ()); lastInteractionPos.getY(), lastInteractionPos.getZ());
// Bed has to be updated, or else player is floating in the air // Bed has to be updated, or else player is floating in the air
ChunkUtils.updateBlock(session, bed, lastInteractionPos); ChunkUtils.updateBlock(session, bed, lastInteractionPos);

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.entity.living.monster; package org.geysermc.connector.entity.living.monster;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.EntityData; import com.nukkitx.protocol.bedrock.data.EntityData;
import com.nukkitx.protocol.bedrock.data.EntityFlag; import com.nukkitx.protocol.bedrock.data.EntityFlag;
@ -44,7 +43,7 @@ public class EndermanEntity extends MonsterEntity {
public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession session) { public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession session) {
// Held block // Held block
if (entityMetadata.getId() == 15) { if (entityMetadata.getId() == 15) {
metadata.put(EntityData.ENDERMAN_HELD_ITEM_ID, BlockTranslator.getBedrockBlockId((BlockState) entityMetadata.getValue())); metadata.put(EntityData.ENDERMAN_HELD_ITEM_ID, BlockTranslator.getBedrockBlockId((int) entityMetadata.getValue()));
} }
// 'Angry' - mouth open // 'Angry' - mouth open
if (entityMetadata.getId() == 16) { if (entityMetadata.getId() == 16) {

View file

@ -32,7 +32,6 @@ import com.github.steveice10.mc.protocol.MinecraftProtocol;
import com.github.steveice10.mc.protocol.data.SubProtocol; import com.github.steveice10.mc.protocol.data.SubProtocol;
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.window.VillagerTrade; import com.github.steveice10.mc.protocol.data.game.window.VillagerTrade;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.mc.protocol.packet.handshake.client.HandshakePacket; import com.github.steveice10.mc.protocol.packet.handshake.client.HandshakePacket;
import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerRespawnPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerRespawnPacket;
@ -146,7 +145,7 @@ public class GeyserSession implements CommandSender {
private boolean jumping; private boolean jumping;
@Setter @Setter
private BlockState breakingBlock; private int breakingBlock;
@Setter @Setter
private Vector3i lastBlockPlacePosition; private Vector3i lastBlockPlacePosition;

View file

@ -28,7 +28,6 @@ package org.geysermc.connector.network.session.cache;
import com.github.steveice10.mc.protocol.data.game.chunk.Chunk; 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.chunk.Column;
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.mc.protocol.data.game.world.block.BlockState;
import lombok.Getter; import lombok.Getter;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.world.block.BlockTranslator; import org.geysermc.connector.network.translators.world.block.BlockTranslator;
@ -58,7 +57,7 @@ public class ChunkCache {
chunks.put(position, chunk); chunks.put(position, chunk);
} }
public void updateBlock(Position position, BlockState block) { public void updateBlock(Position position, int block) {
if (!cache) { if (!cache) {
return; return;
} }
@ -74,7 +73,7 @@ public class ChunkCache {
} }
} }
public BlockState getBlockAt(Position position) { public int getBlockAt(Position position) {
if (!cache) { if (!cache) {
return BlockTranslator.AIR; return BlockTranslator.AIR;
} }

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.bedrock; package org.geysermc.connector.network.translators.bedrock;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientMoveItemToHotbarPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientMoveItemToHotbarPacket;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.protocol.bedrock.packet.BlockPickRequestPacket; import com.nukkitx.protocol.bedrock.packet.BlockPickRequestPacket;
@ -45,10 +44,10 @@ public class BedrockBlockPickRequestPacketTranslator extends PacketTranslator<Bl
@Override @Override
public void translate(BlockPickRequestPacket packet, GeyserSession session) { public void translate(BlockPickRequestPacket packet, GeyserSession session) {
Vector3i vector = packet.getBlockPosition(); Vector3i vector = packet.getBlockPosition();
BlockState blockToPick = session.getConnector().getWorldManager().getBlockAt(session, vector.getX(), vector.getY(), vector.getZ()); int blockToPick = session.getConnector().getWorldManager().getBlockAt(session, vector.getX(), vector.getY(), vector.getZ());
// Block is air - chunk caching is probably off // Block is air - chunk caching is probably off
if (blockToPick.getId() == 0) { if (blockToPick == 0) {
return; return;
} }

View file

@ -36,7 +36,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlaye
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPlaceBlockPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPlaceBlockPacket;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.LevelEventType; import com.nukkitx.protocol.bedrock.data.LevelEventType;
@ -146,8 +145,8 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
session.setLastInteractionPosition(packet.getBlockPosition()); session.setLastInteractionPosition(packet.getBlockPosition());
break; break;
case 2: case 2:
BlockState blockState = session.getConnector().getWorldManager().getBlockAt(session, packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ()); int blockState = session.getConnector().getWorldManager().getBlockAt(session, packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ());
double blockHardness = BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(blockState.getId()); double blockHardness = BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(blockState);
if (session.getGameMode() == GameMode.CREATIVE || (session.getConnector().getConfig().isCacheChunks() && blockHardness == 0)) { if (session.getGameMode() == GameMode.CREATIVE || (session.getConnector().getConfig().isCacheChunks() && blockHardness == 0)) {
session.setLastBlockPlacedId(null); session.setLastBlockPlacedId(null);
session.setLastBlockPlacePosition(null); session.setLastBlockPlacePosition(null);

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.inventory; package org.geysermc.connector.network.translators.inventory;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.protocol.bedrock.data.ContainerType; import com.nukkitx.protocol.bedrock.data.ContainerType;
import org.geysermc.connector.inventory.Inventory; import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
@ -40,7 +39,7 @@ public class BlockInventoryTranslator extends BaseInventoryTranslator {
public BlockInventoryTranslator(int size, String javaBlockIdentifier, ContainerType containerType, InventoryUpdater updater) { public BlockInventoryTranslator(int size, String javaBlockIdentifier, ContainerType containerType, InventoryUpdater updater) {
super(size); super(size);
BlockState javaBlockState = BlockTranslator.getJavaBlockState(javaBlockIdentifier); int javaBlockState = BlockTranslator.getJavaBlockState(javaBlockIdentifier);
int blockId = BlockTranslator.getBedrockBlockId(javaBlockState); int blockId = BlockTranslator.getBedrockBlockId(javaBlockState);
this.holder = new BlockInventoryHolder(blockId, containerType); this.holder = new BlockInventoryHolder(blockId, containerType);
this.updater = updater; this.updater = updater;

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.inventory; package org.geysermc.connector.network.translators.inventory;
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.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.CompoundTag;
import com.nukkitx.protocol.bedrock.data.ContainerType; import com.nukkitx.protocol.bedrock.data.ContainerType;
@ -36,15 +35,13 @@ import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
import org.geysermc.connector.inventory.Inventory; import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.world.block.BlockTranslator; import org.geysermc.connector.network.translators.world.block.BlockTranslator;
import org.geysermc.connector.network.translators.inventory.updater.ChestInventoryUpdater;
import org.geysermc.connector.network.translators.inventory.updater.InventoryUpdater;
public class DoubleChestInventoryTranslator extends ChestInventoryTranslator { public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
private final int blockId; private final int blockId;
public DoubleChestInventoryTranslator(int size) { public DoubleChestInventoryTranslator(int size) {
super(size, 54); super(size, 54);
BlockState javaBlockState = BlockTranslator.getJavaBlockState("minecraft:chest[facing=north,type=single,waterlogged=false]"); int javaBlockState = BlockTranslator.getJavaBlockState("minecraft:chest[facing=north,type=single,waterlogged=false]");
this.blockId = BlockTranslator.getBedrockBlockId(javaBlockState); this.blockId = BlockTranslator.getBedrockBlockId(javaBlockState);
} }
@ -110,7 +107,7 @@ public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
public void closeInventory(GeyserSession session, Inventory inventory) { public void closeInventory(GeyserSession session, Inventory inventory) {
Vector3i holderPos = inventory.getHolderPosition(); Vector3i holderPos = inventory.getHolderPosition();
Position pos = new Position(holderPos.getX(), holderPos.getY(), holderPos.getZ()); Position pos = new Position(holderPos.getX(), holderPos.getY(), holderPos.getZ());
BlockState realBlock = session.getConnector().getWorldManager().getBlockAt(session, pos.getX(), pos.getY(), pos.getZ()); int realBlock = session.getConnector().getWorldManager().getBlockAt(session, pos.getX(), pos.getY(), pos.getZ());
UpdateBlockPacket blockPacket = new UpdateBlockPacket(); UpdateBlockPacket blockPacket = new UpdateBlockPacket();
blockPacket.setDataLayer(0); blockPacket.setDataLayer(0);
blockPacket.setBlockPosition(holderPos); blockPacket.setBlockPosition(holderPos);

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.inventory; package org.geysermc.connector.network.translators.inventory;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.protocol.bedrock.data.ContainerType; import com.nukkitx.protocol.bedrock.data.ContainerType;
import org.geysermc.connector.inventory.Inventory; import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
@ -38,7 +37,7 @@ public class SingleChestInventoryTranslator extends ChestInventoryTranslator {
public SingleChestInventoryTranslator(int size) { public SingleChestInventoryTranslator(int size) {
super(size, 27); super(size, 27);
BlockState javaBlockState = BlockTranslator.getJavaBlockState("minecraft:chest[facing=north,type=single,waterlogged=false]"); int javaBlockState = BlockTranslator.getJavaBlockState("minecraft:chest[facing=north,type=single,waterlogged=false]");
this.holder = new BlockInventoryHolder(BlockTranslator.getBedrockBlockId(javaBlockState), ContainerType.CONTAINER); this.holder = new BlockInventoryHolder(BlockTranslator.getBedrockBlockId(javaBlockState), ContainerType.CONTAINER);
} }

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.inventory.holder; package org.geysermc.connector.network.translators.inventory.holder;
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.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.CompoundTag;
import com.nukkitx.protocol.bedrock.data.ContainerType; import com.nukkitx.protocol.bedrock.data.ContainerType;
@ -82,7 +81,7 @@ public class BlockInventoryHolder extends InventoryHolder {
public void closeInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) { public void closeInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) {
Vector3i holderPos = inventory.getHolderPosition(); Vector3i holderPos = inventory.getHolderPosition();
Position pos = new Position(holderPos.getX(), holderPos.getY(), holderPos.getZ()); Position pos = new Position(holderPos.getX(), holderPos.getY(), holderPos.getZ());
BlockState realBlock = session.getConnector().getWorldManager().getBlockAt(session, pos.getX(), pos.getY(), pos.getZ()); int realBlock = session.getConnector().getWorldManager().getBlockAt(session, pos.getX(), pos.getY(), pos.getZ());
UpdateBlockPacket blockPacket = new UpdateBlockPacket(); UpdateBlockPacket blockPacket = new UpdateBlockPacket();
blockPacket.setDataLayer(0); blockPacket.setDataLayer(0);
blockPacket.setBlockPosition(holderPos); blockPacket.setBlockPosition(holderPos);

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.java.world; package org.geysermc.connector.network.translators.java.world;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerBlockBreakAnimPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerBlockBreakAnimPacket;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
@ -44,8 +43,8 @@ public class JavaBlockBreakAnimTranslator extends PacketTranslator<ServerBlockBr
@Override @Override
public void translate(ServerBlockBreakAnimPacket packet, GeyserSession session) { public void translate(ServerBlockBreakAnimPacket packet, GeyserSession session) {
BlockState state = session.getConnector().getWorldManager().getBlockAt(session, packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()); int state = session.getConnector().getWorldManager().getBlockAt(session, packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ());
int breakTime = (int) (65535 / Math.ceil(BlockUtils.getBreakTime(BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(state.getId()), state.getId(), ItemEntry.AIR, new CompoundTag(""), null) * 20)); int breakTime = (int) (65535 / Math.ceil(BlockUtils.getBreakTime(BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(state), state, ItemEntry.AIR, new CompoundTag(""), null) * 20));
LevelEventPacket levelEventPacket = new LevelEventPacket(); LevelEventPacket levelEventPacket = new LevelEventPacket();
levelEventPacket.setPosition(Vector3f.from( levelEventPacket.setPosition(Vector3f.from(
packet.getPosition().getX(), packet.getPosition().getX(),

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.java.world; package org.geysermc.connector.network.translators.java.world;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
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.mc.protocol.packet.ingame.server.world.ServerChunkDataPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerChunkDataPacket;
import com.nukkitx.nbt.NbtUtils; import com.nukkitx.nbt.NbtUtils;
@ -105,7 +104,7 @@ public class JavaChunkDataTranslator extends PacketTranslator<ServerChunkDataPac
int x = blockEntityEntry.getKey().getInt("x"); int x = blockEntityEntry.getKey().getInt("x");
int y = blockEntityEntry.getKey().getInt("y"); int y = blockEntityEntry.getKey().getInt("y");
int z = blockEntityEntry.getKey().getInt("z"); int z = blockEntityEntry.getKey().getInt("z");
ChunkUtils.updateBlock(session, new BlockState(blockEntityEntry.getIntValue()), new Position(x, y, z)); ChunkUtils.updateBlock(session, blockEntityEntry.getIntValue(), new Position(x, y, z));
} }
chunkData.getLoadBlockEntitiesLater().clear(); chunkData.getLoadBlockEntitiesLater().clear();
session.getChunkCache().addToCache(packet.getColumn()); session.getChunkCache().addToCache(packet.getColumn());

View file

@ -27,13 +27,12 @@
package org.geysermc.connector.network.translators.world; package org.geysermc.connector.network.translators.world;
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.mc.protocol.data.game.world.block.BlockState;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
public class CachedChunkManager extends WorldManager { public class CachedChunkManager extends WorldManager {
@Override @Override
public BlockState getBlockAt(GeyserSession session, int x, int y, int z) { public int getBlockAt(GeyserSession session, int x, int y, int z) {
return session.getChunkCache().getBlockAt(new Position(x, y, z)); return session.getChunkCache().getBlockAt(new Position(x, y, z));
} }
} }

View file

@ -27,8 +27,6 @@
package org.geysermc.connector.network.translators.world; package org.geysermc.connector.network.translators.world;
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.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
@ -42,29 +40,29 @@ import org.geysermc.connector.network.session.GeyserSession;
public abstract class WorldManager { public abstract class WorldManager {
/** /**
* Gets the {@link BlockState} at the specified location * Gets the block state at the specified location
* *
* @param session the session * @param session the session
* @param position the position * @param position the position
* @return the block state at the specified location * @return the block state at the specified location
*/ */
public BlockState getBlockAt(GeyserSession session, Position position) { public int getBlockAt(GeyserSession session, Position position) {
return this.getBlockAt(session, position.getX(), position.getY(), position.getZ()); return this.getBlockAt(session, position.getX(), position.getY(), position.getZ());
} }
/** /**
* Gets the {@link BlockState} at the specified location * Gets the block state at the specified location
* *
* @param session the session * @param session the session
* @param vector the position * @param vector the position
* @return the block state at the specified location * @return the block state at the specified location
*/ */
public BlockState getBlockAt(GeyserSession session, Vector3i vector) { public int getBlockAt(GeyserSession session, Vector3i vector) {
return this.getBlockAt(session, vector.getX(), vector.getY(), vector.getZ()); return this.getBlockAt(session, vector.getX(), vector.getY(), vector.getZ());
} }
/** /**
* Gets the {@link BlockState} at the specified location * Gets the block state at the specified location
* *
* @param session the session * @param session the session
* @param x the x coordinate to get the block at * @param x the x coordinate to get the block at
@ -72,5 +70,5 @@ public abstract class WorldManager {
* @param z the z coordinate to get the block at * @param z the z coordinate to get the block at
* @return the block state at the specified location * @return the block state at the specified location
*/ */
public abstract BlockState getBlockAt(GeyserSession session, int x, int y, int z); public abstract int getBlockAt(GeyserSession session, int x, int y, int z);
} }

View file

@ -26,16 +26,8 @@
package org.geysermc.connector.network.translators.world.block; package org.geysermc.connector.network.translators.world.block;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.CompoundTag;
import it.unimi.dsi.fastutil.ints.Int2BooleanMap; import it.unimi.dsi.fastutil.ints.*;
import it.unimi.dsi.fastutil.ints.Int2BooleanOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ByteMap;
import it.unimi.dsi.fastutil.objects.Object2ByteOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -45,24 +37,24 @@ import java.util.Map;
*/ */
public class BlockStateValues { public class BlockStateValues {
private static final Object2IntMap<BlockState> BANNER_COLORS = new Object2IntOpenHashMap<>(); private static final Int2IntMap BANNER_COLORS = new Int2IntOpenHashMap();
private static final Object2ByteMap<BlockState> BED_COLORS = new Object2ByteOpenHashMap<>(); private static final Int2ByteMap BED_COLORS = new Int2ByteOpenHashMap();
private static final Int2ObjectMap<DoubleChestValue> DOUBLE_CHEST_VALUES = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<DoubleChestValue> DOUBLE_CHEST_VALUES = new Int2ObjectOpenHashMap<>();
private static final Int2ObjectMap<String> FLOWER_POT_VALUES = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<String> FLOWER_POT_VALUES = new Int2ObjectOpenHashMap<>();
private static final Map<String, CompoundTag> FLOWER_POT_BLOCKS = new HashMap<>(); private static final Map<String, CompoundTag> FLOWER_POT_BLOCKS = new HashMap<>();
private static final Object2IntMap<BlockState> NOTEBLOCK_PITCHES = new Object2IntOpenHashMap<>(); private static final Int2IntMap NOTEBLOCK_PITCHES = new Int2IntOpenHashMap();
private static final Int2BooleanMap IS_STICKY_PISTON = new Int2BooleanOpenHashMap(); private static final Int2BooleanMap IS_STICKY_PISTON = new Int2BooleanOpenHashMap();
private static final Int2BooleanMap PISTON_VALUES = new Int2BooleanOpenHashMap(); private static final Int2BooleanMap PISTON_VALUES = new Int2BooleanOpenHashMap();
private static final Object2ByteMap<BlockState> SKULL_VARIANTS = new Object2ByteOpenHashMap<>(); private static final Int2ByteMap SKULL_VARIANTS = new Int2ByteOpenHashMap();
private static final Object2ByteMap<BlockState> SKULL_ROTATIONS = new Object2ByteOpenHashMap<>(); private static final Int2ByteMap SKULL_ROTATIONS = new Int2ByteOpenHashMap();
private static final Object2ByteMap<BlockState> SHULKERBOX_DIRECTIONS = new Object2ByteOpenHashMap<>(); private static final Int2ByteMap SHULKERBOX_DIRECTIONS = new Int2ByteOpenHashMap();
/** /**
* Determines if the block state contains Bedrock block information * Determines if the block state contains Bedrock block information
* @param entry The String to JsonNode map used in BlockTranslator * @param entry The String to JsonNode map used in BlockTranslator
* @param javaBlockState the Java Block State of the block * @param javaBlockState the Java Block State of the block
*/ */
public static void storeBlockStateValues(Map.Entry<String, JsonNode> entry, BlockState javaBlockState) { public static void storeBlockStateValues(Map.Entry<String, JsonNode> entry, int javaBlockState) {
JsonNode bannerColor = entry.getValue().get("banner_color"); JsonNode bannerColor = entry.getValue().get("banner_color");
if (bannerColor != null) { if (bannerColor != null) {
BANNER_COLORS.put(javaBlockState, (byte) bannerColor.intValue()); BANNER_COLORS.put(javaBlockState, (byte) bannerColor.intValue());
@ -80,12 +72,12 @@ public class BlockStateValues {
boolean isDirectionPositive = ((entry.getValue().get("x") != null && entry.getValue().get("x").asBoolean()) || boolean isDirectionPositive = ((entry.getValue().get("x") != null && entry.getValue().get("x").asBoolean()) ||
(entry.getValue().get("z") != null && entry.getValue().get("z").asBoolean())); (entry.getValue().get("z") != null && entry.getValue().get("z").asBoolean()));
boolean isLeft = (entry.getValue().get("double_chest_position").asText().contains("left")); boolean isLeft = (entry.getValue().get("double_chest_position").asText().contains("left"));
DOUBLE_CHEST_VALUES.put(javaBlockState.getId(), new DoubleChestValue(isX, isDirectionPositive, isLeft)); DOUBLE_CHEST_VALUES.put(javaBlockState, new DoubleChestValue(isX, isDirectionPositive, isLeft));
return; return;
} }
if (entry.getKey().contains("potted_")) { if (entry.getKey().contains("potted_")) {
FLOWER_POT_VALUES.put(javaBlockState.getId(), entry.getKey().replace("potted_", "")); FLOWER_POT_VALUES.put(javaBlockState, entry.getKey().replace("potted_", ""));
return; return;
} }
@ -97,8 +89,8 @@ public class BlockStateValues {
if (entry.getKey().contains("piston")) { if (entry.getKey().contains("piston")) {
// True if extended, false if not // True if extended, false if not
PISTON_VALUES.put(javaBlockState.getId(), entry.getKey().contains("extended=true")); PISTON_VALUES.put(javaBlockState, entry.getKey().contains("extended=true"));
IS_STICKY_PISTON.put(javaBlockState.getId(), entry.getKey().contains("sticky")); IS_STICKY_PISTON.put(javaBlockState, entry.getKey().contains("sticky"));
return; return;
} }
@ -125,9 +117,9 @@ public class BlockStateValues {
* @param state BlockState of the block * @param state BlockState of the block
* @return Banner color integer or -1 if no color * @return Banner color integer or -1 if no color
*/ */
public static int getBannerColor(BlockState state) { public static int getBannerColor(int state) {
if (BANNER_COLORS.containsKey(state)) { if (BANNER_COLORS.containsKey(state)) {
return BANNER_COLORS.getInt(state); return BANNER_COLORS.get(state);
} }
return -1; return -1;
} }
@ -139,9 +131,9 @@ public class BlockStateValues {
* @param state BlockState of the block * @param state BlockState of the block
* @return Bed color byte or -1 if no color * @return Bed color byte or -1 if no color
*/ */
public static byte getBedColor(BlockState state) { public static byte getBedColor(int state) {
if (BED_COLORS.containsKey(state)) { if (BED_COLORS.containsKey(state)) {
return BED_COLORS.getByte(state); return BED_COLORS.get(state);
} }
return -1; return -1;
} }
@ -177,9 +169,9 @@ public class BlockStateValues {
* @param state BlockState of the block * @param state BlockState of the block
* @return note block note integer or -1 if not present * @return note block note integer or -1 if not present
*/ */
public static int getNoteblockPitch(BlockState state) { public static int getNoteblockPitch(int state) {
if (NOTEBLOCK_PITCHES.containsKey(state)) { if (NOTEBLOCK_PITCHES.containsKey(state)) {
return NOTEBLOCK_PITCHES.getInt(state); return NOTEBLOCK_PITCHES.get(state);
} }
return -1; return -1;
} }
@ -192,8 +184,8 @@ public class BlockStateValues {
return PISTON_VALUES; return PISTON_VALUES;
} }
public static boolean isStickyPiston(BlockState blockState) { public static boolean isStickyPiston(int blockState) {
return IS_STICKY_PISTON.get(blockState.getId()); return IS_STICKY_PISTON.get(blockState);
} }
/** /**
@ -203,9 +195,9 @@ public class BlockStateValues {
* @param state BlockState of the block * @param state BlockState of the block
* @return Skull variant byte or -1 if no variant * @return Skull variant byte or -1 if no variant
*/ */
public static byte getSkullVariant(BlockState state) { public static byte getSkullVariant(int state) {
if (SKULL_VARIANTS.containsKey(state)) { if (SKULL_VARIANTS.containsKey(state)) {
return SKULL_VARIANTS.getByte(state); return SKULL_VARIANTS.get(state);
} }
return -1; return -1;
} }
@ -217,9 +209,9 @@ public class BlockStateValues {
* @param state BlockState of the block * @param state BlockState of the block
* @return Skull rotation value or -1 if no value * @return Skull rotation value or -1 if no value
*/ */
public static byte getSkullRotation(BlockState state) { public static byte getSkullRotation(int state) {
if (SKULL_ROTATIONS.containsKey(state)) { if (SKULL_ROTATIONS.containsKey(state)) {
return SKULL_ROTATIONS.getByte(state); return SKULL_ROTATIONS.get(state);
} }
return -1; return -1;
} }
@ -232,9 +224,9 @@ public class BlockStateValues {
* @param state BlockState of the block * @param state BlockState of the block
* @return Shulker direction value or -1 if no value * @return Shulker direction value or -1 if no value
*/ */
public static byte getShulkerBoxDirection(BlockState state) { public static byte getShulkerBoxDirection(int state) {
if (SHULKERBOX_DIRECTIONS.containsKey(state)) { if (SHULKERBOX_DIRECTIONS.containsKey(state)) {
return SHULKERBOX_DIRECTIONS.getByte(state); return SHULKERBOX_DIRECTIONS.get(state);
} }
return -1; return -1;
} }

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.world.block; package org.geysermc.connector.network.translators.world.block;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.google.common.collect.BiMap; import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
@ -47,19 +46,19 @@ import java.util.*;
public class BlockTranslator { public class BlockTranslator {
public static final ListTag<CompoundTag> BLOCKS; public static final ListTag<CompoundTag> BLOCKS;
public static final BlockState AIR = new BlockState(0); public static final int AIR = 0;
public static final int BEDROCK_WATER_ID; public static final int BEDROCK_WATER_ID;
private static final Int2IntMap JAVA_TO_BEDROCK_BLOCK_MAP = new Int2IntOpenHashMap(); private static final Int2IntMap JAVA_TO_BEDROCK_BLOCK_MAP = new Int2IntOpenHashMap();
private static final Int2ObjectMap<BlockState> BEDROCK_TO_JAVA_BLOCK_MAP = new Int2ObjectOpenHashMap<>(); private static final Int2IntMap BEDROCK_TO_JAVA_BLOCK_MAP = new Int2IntOpenHashMap();
private static final BiMap<String, BlockState> JAVA_ID_BLOCK_MAP = HashBiMap.create(); private static final BiMap<String, Integer> JAVA_ID_BLOCK_MAP = HashBiMap.create();
private static final IntSet WATERLOGGED = new IntOpenHashSet(); private static final IntSet WATERLOGGED = new IntOpenHashSet();
private static final Object2IntMap<CompoundTag> ITEM_FRAMES = new Object2IntOpenHashMap<>(); private static final Object2IntMap<CompoundTag> ITEM_FRAMES = new Object2IntOpenHashMap<>();
// Bedrock carpet ID, used in LlamaEntity.java for decoration // Bedrock carpet ID, used in LlamaEntity.java for decoration
public static final int CARPET = 171; public static final int CARPET = 171;
private static final Map<BlockState, String> JAVA_ID_TO_BLOCK_ENTITY_MAP = new HashMap<>(); private static final Int2ObjectMap<String> JAVA_ID_TO_BLOCK_ENTITY_MAP = new Int2ObjectOpenHashMap<>();
public static final Int2DoubleMap JAVA_RUNTIME_ID_TO_HARDNESS = new Int2DoubleOpenHashMap(); public static final Int2DoubleMap JAVA_RUNTIME_ID_TO_HARDNESS = new Int2DoubleOpenHashMap();
public static final Int2BooleanMap JAVA_RUNTIME_ID_TO_CAN_HARVEST_WITH_HAND = new Int2BooleanOpenHashMap(); public static final Int2BooleanMap JAVA_RUNTIME_ID_TO_CAN_HARVEST_WITH_HAND = new Int2BooleanOpenHashMap();
@ -121,7 +120,6 @@ public class BlockTranslator {
javaRuntimeId++; javaRuntimeId++;
Map.Entry<String, JsonNode> entry = blocksIterator.next(); Map.Entry<String, JsonNode> entry = blocksIterator.next();
String javaId = entry.getKey(); String javaId = entry.getKey();
BlockState javaBlockState = new BlockState(javaRuntimeId);
CompoundTag blockTag = buildBedrockState(entry.getValue()); CompoundTag blockTag = buildBedrockState(entry.getValue());
// TODO fix this, (no block should have a null hardness) // TODO fix this, (no block should have a null hardness)
@ -145,7 +143,7 @@ public class BlockTranslator {
cobwebRuntimeId = javaRuntimeId; cobwebRuntimeId = javaRuntimeId;
} }
JAVA_ID_BLOCK_MAP.put(javaId, javaBlockState); JAVA_ID_BLOCK_MAP.put(javaId, javaRuntimeId);
// Used for adding all "special" Java block states to block state map // Used for adding all "special" Java block states to block state map
String identifier; String identifier;
@ -154,12 +152,12 @@ public class BlockTranslator {
identifier = clazz.getAnnotation(BlockEntity.class).regex(); identifier = clazz.getAnnotation(BlockEntity.class).regex();
// Endswith, or else the block bedrock gets picked up for bed // Endswith, or else the block bedrock gets picked up for bed
if (bedrock_identifer.endsWith(identifier) && !identifier.equals("")) { if (bedrock_identifer.endsWith(identifier) && !identifier.equals("")) {
JAVA_ID_TO_BLOCK_ENTITY_MAP.put(javaBlockState, clazz.getAnnotation(BlockEntity.class).name()); JAVA_ID_TO_BLOCK_ENTITY_MAP.put(javaRuntimeId, clazz.getAnnotation(BlockEntity.class).name());
break; break;
} }
} }
BlockStateValues.storeBlockStateValues(entry, javaBlockState); BlockStateValues.storeBlockStateValues(entry, javaRuntimeId);
// Get the tag needed for non-empty flower pots // Get the tag needed for non-empty flower pots
if (entry.getValue().get("pottable") != null) { if (entry.getValue().get("pottable") != null) {
@ -173,10 +171,10 @@ public class BlockTranslator {
|| javaId.contains("minecraft:bubble_column") || javaId.contains("minecraft:kelp") || javaId.contains("seagrass"); || javaId.contains("minecraft:bubble_column") || javaId.contains("minecraft:kelp") || javaId.contains("seagrass");
if (waterlogged) { if (waterlogged) {
BEDROCK_TO_JAVA_BLOCK_MAP.putIfAbsent(bedrockRuntimeId | 1 << 31, javaBlockState); BEDROCK_TO_JAVA_BLOCK_MAP.putIfAbsent(bedrockRuntimeId | 1 << 31, javaRuntimeId);
WATERLOGGED.add(javaRuntimeId); WATERLOGGED.add(javaRuntimeId);
} else { } else {
BEDROCK_TO_JAVA_BLOCK_MAP.putIfAbsent(bedrockRuntimeId, javaBlockState); BEDROCK_TO_JAVA_BLOCK_MAP.putIfAbsent(bedrockRuntimeId, javaRuntimeId);
} }
CompoundTag runtimeTag = blockStateMap.remove(blockTag); CompoundTag runtimeTag = blockStateMap.remove(blockTag);
@ -285,15 +283,11 @@ public class BlockTranslator {
return tagBuilder.tag(statesBuilder.build("states")).build("block"); return tagBuilder.tag(statesBuilder.build("states")).build("block");
} }
public static int getBedrockBlockId(BlockState state) { public static int getBedrockBlockId(int state) {
return JAVA_TO_BEDROCK_BLOCK_MAP.get(state.getId()); return JAVA_TO_BEDROCK_BLOCK_MAP.get(state);
} }
public static int getBedrockBlockId(int javaId) { public static int getJavaBlockState(int bedrockId) {
return JAVA_TO_BEDROCK_BLOCK_MAP.get(javaId);
}
public static BlockState getJavaBlockState(int bedrockId) {
return BEDROCK_TO_JAVA_BLOCK_MAP.get(bedrockId); return BEDROCK_TO_JAVA_BLOCK_MAP.get(bedrockId);
} }
@ -309,23 +303,23 @@ public class BlockTranslator {
return BLOCK_STATE_VERSION; return BLOCK_STATE_VERSION;
} }
public static BlockState getJavaBlockState(String javaId) { public static int getJavaBlockState(String javaId) {
return JAVA_ID_BLOCK_MAP.get(javaId); return JAVA_ID_BLOCK_MAP.get(javaId);
} }
public static String getBlockEntityString(BlockState javaId) { public static String getBlockEntityString(int javaId) {
return JAVA_ID_TO_BLOCK_ENTITY_MAP.get(javaId); return JAVA_ID_TO_BLOCK_ENTITY_MAP.get(javaId);
} }
public static boolean isWaterlogged(BlockState state) { public static boolean isWaterlogged(int state) {
return WATERLOGGED.contains(state.getId()); return WATERLOGGED.contains(state);
} }
public static BiMap<String, BlockState> getJavaIdBlockMap() { public static BiMap<String, Integer> getJavaIdBlockMap() {
return JAVA_ID_BLOCK_MAP; return JAVA_ID_BLOCK_MAP;
} }
public static BlockState getJavaWaterloggedState(int bedrockId) { public static int getJavaWaterloggedState(int bedrockId) {
return BEDROCK_TO_JAVA_BLOCK_MAP.get(1 << 31 | bedrockId); return BEDROCK_TO_JAVA_BLOCK_MAP.get(1 << 31 | bedrockId);
} }
} }

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.ListTag;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
@ -42,12 +41,12 @@ import java.util.List;
public class BannerBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState { public class BannerBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState {
@Override @Override
public boolean isBlock(BlockState blockState) { public boolean isBlock(int blockState) {
return BlockStateValues.getBannerColor(blockState) != -1; return BlockStateValues.getBannerColor(blockState) != -1;
} }
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
int bannerColor = BlockStateValues.getBannerColor(blockState); int bannerColor = BlockStateValues.getBannerColor(blockState);

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
import com.nukkitx.nbt.tag.ByteTag; import com.nukkitx.nbt.tag.ByteTag;
@ -39,12 +38,12 @@ import java.util.List;
public class BedBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState { public class BedBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState {
@Override @Override
public boolean isBlock(BlockState blockState) { public boolean isBlock(int blockState) {
return BlockStateValues.getBedColor(blockState) != -1; return BlockStateValues.getBedColor(blockState) != -1;
} }
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
byte bedcolor = BlockStateValues.getBedColor(blockState); byte bedcolor = BlockStateValues.getBedColor(blockState);
// Just in case... // Just in case...

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.CompoundTag;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
@ -42,7 +41,7 @@ public interface BedrockOnlyBlockEntity {
* @param blockState The Java block state. * @param blockState The Java block state.
* @param position The Bedrock block position. * @param position The Bedrock block position.
*/ */
void updateBlock(GeyserSession session, BlockState blockState, Vector3i position); void updateBlock(GeyserSession session, int blockState, Vector3i position);
/** /**
* Get the tag of the Bedrock-only block entity * Get the tag of the Bedrock-only block entity
@ -50,7 +49,7 @@ public interface BedrockOnlyBlockEntity {
* @param blockState Java BlockState of block. * @param blockState Java BlockState of block.
* @return Bedrock tag, or null if not a Bedrock-only Block Entity * @return Bedrock tag, or null if not a Bedrock-only Block Entity
*/ */
static CompoundTag getTag(Vector3i position, BlockState blockState) { static CompoundTag getTag(Vector3i position, int blockState) {
if (new FlowerPotBlockEntityTranslator().isBlock(blockState)) { if (new FlowerPotBlockEntityTranslator().isBlock(blockState)) {
return FlowerPotBlockEntityTranslator.getTag(blockState, position); return FlowerPotBlockEntityTranslator.getTag(blockState, position);
} else if (PistonBlockEntityTranslator.isBlock(blockState)) { } else if (PistonBlockEntityTranslator.isBlock(blockState)) {

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
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 com.github.steveice10.opennbt.tag.builtin.IntTag;
import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.StringTag;
@ -88,13 +87,13 @@ public abstract class BlockEntityTranslator {
} }
} }
public abstract List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState); public abstract List<Tag<?>> translateTag(CompoundTag tag, int blockState);
public abstract CompoundTag getDefaultJavaTag(String javaId, int x, int y, int z); public abstract CompoundTag getDefaultJavaTag(String javaId, int x, int y, int z);
public abstract com.nukkitx.nbt.tag.CompoundTag getDefaultBedrockTag(String bedrockId, int x, int y, int z); public abstract com.nukkitx.nbt.tag.CompoundTag getDefaultBedrockTag(String bedrockId, int x, int y, int z);
public com.nukkitx.nbt.tag.CompoundTag getBlockEntityTag(String id, CompoundTag tag, BlockState blockState) { public com.nukkitx.nbt.tag.CompoundTag getBlockEntityTag(String id, CompoundTag tag, int blockState) {
int x = Integer.parseInt(String.valueOf(tag.getValue().get("x").getValue())); int x = Integer.parseInt(String.valueOf(tag.getValue().get("x").getValue()));
int y = Integer.parseInt(String.valueOf(tag.getValue().get("y").getValue())); int y = Integer.parseInt(String.valueOf(tag.getValue().get("y").getValue()));
int z = Integer.parseInt(String.valueOf(tag.getValue().get("z").getValue())); int z = Integer.parseInt(String.valueOf(tag.getValue().get("z").getValue()));

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.ListTag;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
@ -41,7 +40,7 @@ import java.util.List;
public class CampfireBlockEntityTranslator extends BlockEntityTranslator { public class CampfireBlockEntityTranslator extends BlockEntityTranslator {
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
ListTag items = tag.get("Items"); ListTag items = tag.get("Items");
int i = 1; int i = 1;

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
@ -48,12 +47,12 @@ import java.util.List;
public class DoubleChestBlockEntityTranslator extends BlockEntityTranslator implements BedrockOnlyBlockEntity, RequiresBlockState { public class DoubleChestBlockEntityTranslator extends BlockEntityTranslator implements BedrockOnlyBlockEntity, RequiresBlockState {
@Override @Override
public boolean isBlock(BlockState blockState) { public boolean isBlock(int blockState) {
return BlockStateValues.getDoubleChestValues().containsKey(blockState.getId()); return BlockStateValues.getDoubleChestValues().containsKey(blockState);
} }
@Override @Override
public void updateBlock(GeyserSession session, BlockState blockState, Vector3i position) { public void updateBlock(GeyserSession session, int blockState, Vector3i position) {
CompoundTag javaTag = getConstantJavaTag("chest", position.getX(), position.getY(), position.getZ()); CompoundTag javaTag = getConstantJavaTag("chest", position.getX(), position.getY(), position.getZ());
CompoundTagBuilder tagBuilder = getConstantBedrockTag(BlockEntityUtils.getBedrockBlockEntityId("chest"), position.getX(), position.getY(), position.getZ()).toBuilder(); CompoundTagBuilder tagBuilder = getConstantBedrockTag(BlockEntityUtils.getBedrockBlockEntityId("chest"), position.getX(), position.getY(), position.getZ()).toBuilder();
translateTag(javaTag, blockState).forEach(tagBuilder::tag); translateTag(javaTag, blockState).forEach(tagBuilder::tag);
@ -61,10 +60,10 @@ public class DoubleChestBlockEntityTranslator extends BlockEntityTranslator impl
} }
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
if (blockState != null && BlockStateValues.getDoubleChestValues().containsKey(blockState.getId())) { if (BlockStateValues.getDoubleChestValues().containsKey(blockState)) {
DoubleChestValue chestValues = BlockStateValues.getDoubleChestValues().get(blockState.getId()); DoubleChestValue chestValues = BlockStateValues.getDoubleChestValues().get(blockState);
if (chestValues != null) { if (chestValues != null) {
int x = (int) tag.getValue().get("x").getValue(); int x = (int) tag.getValue().get("x").getValue();
int z = (int) tag.getValue().get("z").getValue(); int z = (int) tag.getValue().get("z").getValue();

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.nukkitx.nbt.tag.Tag; import com.nukkitx.nbt.tag.Tag;
@ -36,7 +35,7 @@ import java.util.List;
public class EmptyBlockEntityTranslator extends BlockEntityTranslator { public class EmptyBlockEntityTranslator extends BlockEntityTranslator {
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
return new ArrayList<>(); return new ArrayList<>();
} }

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.LongTag; import com.github.steveice10.opennbt.tag.builtin.LongTag;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
@ -40,7 +39,7 @@ import java.util.List;
public class EndGatewayBlockEntityTranslator extends BlockEntityTranslator { public class EndGatewayBlockEntityTranslator extends BlockEntityTranslator {
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
tags.add(new IntTag("Age", (int) (long) tag.get("Age").getValue())); tags.add(new IntTag("Age", (int) (long) tag.get("Age").getValue()));
// Java sometimes does not provide this tag, but Bedrock crashes if it doesn't exist // Java sometimes does not provide this tag, but Bedrock crashes if it doesn't exist

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.CompoundTag;
@ -39,12 +38,12 @@ import org.geysermc.connector.utils.BlockEntityUtils;
public class FlowerPotBlockEntityTranslator implements BedrockOnlyBlockEntity, RequiresBlockState { public class FlowerPotBlockEntityTranslator implements BedrockOnlyBlockEntity, RequiresBlockState {
@Override @Override
public boolean isBlock(BlockState blockState) { public boolean isBlock(int blockState) {
return (BlockStateValues.getFlowerPotValues().containsKey(blockState.getId())); return (BlockStateValues.getFlowerPotValues().containsKey(blockState));
} }
@Override @Override
public void updateBlock(GeyserSession session, BlockState blockState, Vector3i position) { public void updateBlock(GeyserSession session, int blockState, Vector3i position) {
BlockEntityUtils.updateBlockEntity(session, getTag(blockState, position), position); BlockEntityUtils.updateBlockEntity(session, getTag(blockState, position), position);
UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket();
updateBlockPacket.setDataLayer(0); updateBlockPacket.setDataLayer(0);
@ -58,11 +57,11 @@ public class FlowerPotBlockEntityTranslator implements BedrockOnlyBlockEntity, R
/** /**
* Get the Nukkit CompoundTag of the flower pot. * Get the Nukkit CompoundTag of the flower pot.
* @param blockState Java BlockState of flower pot. * @param blockState Java block state of flower pot.
* @param position Bedrock position of flower pot. * @param position Bedrock position of flower pot.
* @return Bedrock tag of flower pot. * @return Bedrock tag of flower pot.
*/ */
public static CompoundTag getTag(BlockState blockState, Vector3i position) { public static CompoundTag getTag(int blockState, Vector3i position) {
CompoundTagBuilder tagBuilder = CompoundTagBuilder.builder() CompoundTagBuilder tagBuilder = CompoundTagBuilder.builder()
.intTag("x", position.getX()) .intTag("x", position.getX())
.intTag("y", position.getY()) .intTag("y", position.getY())
@ -70,7 +69,7 @@ public class FlowerPotBlockEntityTranslator implements BedrockOnlyBlockEntity, R
.byteTag("isMovable", (byte) 1) .byteTag("isMovable", (byte) 1)
.stringTag("id", "FlowerPot"); .stringTag("id", "FlowerPot");
// Get the Java name of the plant inside. e.g. minecraft:oak_sapling // Get the Java name of the plant inside. e.g. minecraft:oak_sapling
String name = BlockStateValues.getFlowerPotValues().get(blockState.getId()); String name = BlockStateValues.getFlowerPotValues().get(blockState);
if (name != null) { if (name != null) {
// Get the Bedrock CompoundTag of the block. // Get the Bedrock CompoundTag of the block.
// This is where we need to store the *Java* name because Bedrock has six minecraft:sapling blocks with different block states. // This is where we need to store the *Java* name because Bedrock has six minecraft:sapling blocks with different block states.

View file

@ -27,7 +27,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
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.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.protocol.bedrock.packet.BlockEventPacket; import com.nukkitx.protocol.bedrock.packet.BlockEventPacket;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
@ -40,12 +39,12 @@ import org.geysermc.connector.utils.ChunkUtils;
public class NoteblockBlockEntityTranslator implements RequiresBlockState { public class NoteblockBlockEntityTranslator implements RequiresBlockState {
@Override @Override
public boolean isBlock(BlockState blockState) { public boolean isBlock(int blockState) {
return BlockStateValues.getNoteblockPitch(blockState) != -1; return BlockStateValues.getNoteblockPitch(blockState) != -1;
} }
public static void translate(GeyserSession session, Position position) { public static void translate(GeyserSession session, Position position) {
BlockState blockState = ChunkUtils.CACHED_BLOCK_ENTITIES.get(position); int blockState = ChunkUtils.CACHED_BLOCK_ENTITIES.getOrDefault(position, 0);
BlockEventPacket blockEventPacket = new BlockEventPacket(); BlockEventPacket blockEventPacket = new BlockEventPacket();
blockEventPacket.setBlockPosition(Vector3i.from(position.getX(), position.getY(), position.getZ())); blockEventPacket.setBlockPosition(Vector3i.from(position.getX(), position.getY(), position.getZ()));
blockEventPacket.setEventType(0); blockEventPacket.setEventType(0);

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.CompoundTag;
@ -42,25 +41,25 @@ public class PistonBlockEntityTranslator {
* @param blockState Java BlockState of block. * @param blockState Java BlockState of block.
* @return if block is a piston or not. * @return if block is a piston or not.
*/ */
public static boolean isBlock(BlockState blockState) { public static boolean isBlock(int blockState) {
return BlockStateValues.getPistonValues().containsKey(blockState.getId()); return BlockStateValues.getPistonValues().containsKey(blockState);
} }
/** /**
* Calculates the Nukkit CompoundTag to send to the client on chunk * Calculates the Nukkit CompoundTag to send to the client on chunk
* @param blockState Java BlockState of block. * @param blockState Java block state of block.
* @param position Bedrock position of piston. * @param position Bedrock position of piston.
* @return Bedrock tag of piston. * @return Bedrock tag of piston.
*/ */
public static CompoundTag getTag(BlockState blockState, Vector3i position) { public static CompoundTag getTag(int blockState, Vector3i position) {
CompoundTagBuilder tagBuilder = CompoundTagBuilder.builder() CompoundTagBuilder tagBuilder = CompoundTagBuilder.builder()
.intTag("x", position.getX()) .intTag("x", position.getX())
.intTag("y", position.getY()) .intTag("y", position.getY())
.intTag("z", position.getZ()) .intTag("z", position.getZ())
.byteTag("isMovable", (byte) 1) .byteTag("isMovable", (byte) 1)
.stringTag("id", "PistonArm"); .stringTag("id", "PistonArm");
if (BlockStateValues.getPistonValues().containsKey(blockState.getId())) { if (BlockStateValues.getPistonValues().containsKey(blockState)) {
boolean extended = BlockStateValues.getPistonValues().get(blockState.getId()); boolean extended = BlockStateValues.getPistonValues().get(blockState);
// 1f if extended, otherwise 0f // 1f if extended, otherwise 0f
tagBuilder.floatTag("Progress", (extended) ? 1.0f : 0.0f); tagBuilder.floatTag("Progress", (extended) ? 1.0f : 0.0f);
// 1 if sticky, 0 if not // 1 if sticky, 0 if not

View file

@ -25,8 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
/** /**
* Implemented in block entities if their Java block state is required for additional values in Bedrock * Implemented in block entities if their Java block state is required for additional values in Bedrock
*/ */
@ -37,6 +35,6 @@ public interface RequiresBlockState {
* @param blockState BlockState to be compared * @param blockState BlockState to be compared
* @return true if part of the class * @return true if part of the class
*/ */
boolean isBlock(BlockState blockState); boolean isBlock(int blockState);
} }

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
import com.nukkitx.nbt.tag.ByteTag; import com.nukkitx.nbt.tag.ByteTag;
@ -40,7 +39,7 @@ import java.util.List;
public class ShulkerBoxBlockEntityTranslator extends BlockEntityTranslator { public class ShulkerBoxBlockEntityTranslator extends BlockEntityTranslator {
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
byte direction = BlockStateValues.getShulkerBoxDirection(blockState); byte direction = BlockStateValues.getShulkerBoxDirection(blockState);

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.mc.protocol.data.message.Message; import com.github.steveice10.mc.protocol.data.message.Message;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
@ -41,7 +40,7 @@ import java.util.List;
public class SignBlockEntityTranslator extends BlockEntityTranslator { public class SignBlockEntityTranslator extends BlockEntityTranslator {
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
StringBuilder signText = new StringBuilder(); StringBuilder signText = new StringBuilder();

View file

@ -25,7 +25,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
import com.nukkitx.nbt.tag.ByteTag; import com.nukkitx.nbt.tag.ByteTag;
import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.CompoundTag;
@ -40,12 +39,12 @@ import java.util.List;
public class SkullBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState { public class SkullBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState {
@Override @Override
public boolean isBlock(BlockState blockState) { public boolean isBlock(int blockState) {
return BlockStateValues.getSkullVariant(blockState) != -1; return BlockStateValues.getSkullVariant(blockState) != -1;
} }
@Override @Override
public List<Tag<?>> translateTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
byte skullVariant = BlockStateValues.getSkullVariant(blockState); byte skullVariant = BlockStateValues.getSkullVariant(blockState);
float rotation = BlockStateValues.getSkullRotation(blockState) * 22.5f; float rotation = BlockStateValues.getSkullRotation(blockState) * 22.5f;

View file

@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.world.block.entity; package org.geysermc.connector.network.translators.world.block.entity;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.CompoundTagBuilder;
import com.nukkitx.nbt.tag.*; import com.nukkitx.nbt.tag.*;
@ -39,7 +38,7 @@ import java.util.List;
public class SpawnerBlockEntityTranslator extends BlockEntityTranslator { public class SpawnerBlockEntityTranslator extends BlockEntityTranslator {
@Override @Override
public List<Tag<?>> translateTag(CompoundTag tag, BlockState blockState) { public List<Tag<?>> translateTag(CompoundTag tag, int blockState) {
List<Tag<?>> tags = new ArrayList<>(); List<Tag<?>> tags = new ArrayList<>();
if (tag.get("MaxNearbyEntities") != null) { if (tag.get("MaxNearbyEntities") != null) {

View file

@ -28,7 +28,6 @@ package org.geysermc.connector.utils;
import com.github.steveice10.mc.protocol.data.game.chunk.Chunk; 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.chunk.Column;
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.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.StringTag;
import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.opennbt.tag.builtin.Tag;
@ -54,8 +53,6 @@ import org.geysermc.connector.network.translators.world.chunk.ChunkSection;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static org.geysermc.connector.network.translators.world.block.BlockTranslator.AIR; import static org.geysermc.connector.network.translators.world.block.BlockTranslator.AIR;
import static org.geysermc.connector.network.translators.world.block.BlockTranslator.BEDROCK_WATER_ID; import static org.geysermc.connector.network.translators.world.block.BlockTranslator.BEDROCK_WATER_ID;
@ -65,7 +62,7 @@ public class ChunkUtils {
/** /**
* Temporarily stores positions of BlockState values that are needed for certain block entities actively * Temporarily stores positions of BlockState values that are needed for certain block entities actively
*/ */
public static final Map<Position, BlockState> CACHED_BLOCK_ENTITIES = new HashMap<>(); public static final Object2IntMap<Position> CACHED_BLOCK_ENTITIES = new Object2IntOpenHashMap<>();
private static final com.nukkitx.nbt.tag.CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag(); private static final com.nukkitx.nbt.tag.CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag();
public static final byte[] EMPTY_LEVEL_CHUNK_DATA; public static final byte[] EMPTY_LEVEL_CHUNK_DATA;
@ -91,7 +88,7 @@ public class ChunkUtils {
CompoundTag[] blockEntities = column.getTileEntities(); CompoundTag[] blockEntities = column.getTileEntities();
// Temporarily stores positions of BlockState values per chunk load // Temporarily stores positions of BlockState values per chunk load
Map<Position, BlockState> blockEntityPositions = new HashMap<>(); Object2IntMap<Position> blockEntityPositions = new Object2IntOpenHashMap<>();
// Temporarily stores compound tags of Bedrock-only block entities // Temporarily stores compound tags of Bedrock-only block entities
ObjectArrayList<com.nukkitx.nbt.tag.CompoundTag> bedrockOnlyBlockEntities = new ObjectArrayList<>(); ObjectArrayList<com.nukkitx.nbt.tag.CompoundTag> bedrockOnlyBlockEntities = new ObjectArrayList<>();
@ -107,7 +104,7 @@ public class ChunkUtils {
for (int x = 0; x < 16; x++) { for (int x = 0; x < 16; x++) {
for (int y = 0; y < 16; y++) { for (int y = 0; y < 16; y++) {
for (int z = 0; z < 16; z++) { for (int z = 0; z < 16; z++) {
BlockState blockState = chunk.get(x, y, z); int blockState = chunk.get(x, y, z);
int id = BlockTranslator.getBedrockBlockId(blockState); int id = BlockTranslator.getBedrockBlockId(blockState);
// Check to see if the name is in BlockTranslator.getBlockEntityString, and therefore must be handled differently // Check to see if the name is in BlockTranslator.getBlockEntityString, and therefore must be handled differently
@ -119,8 +116,8 @@ public class ChunkUtils {
section.getBlockStorageArray()[0].setFullBlock(ChunkSection.blockPosition(x, y, z), id); section.getBlockStorageArray()[0].setFullBlock(ChunkSection.blockPosition(x, y, z), id);
// Check if block is piston or flower - only block entities in Bedrock // Check if block is piston or flower - only block entities in Bedrock
if (BlockStateValues.getFlowerPotValues().containsKey(blockState.getId()) || if (BlockStateValues.getFlowerPotValues().containsKey(blockState) ||
BlockStateValues.getPistonValues().containsKey(blockState.getId())) { BlockStateValues.getPistonValues().containsKey(blockState)) {
Position pos = new ChunkPosition(column.getX(), column.getZ()).getBlock(x, (chunkY << 4) + y, z); Position pos = new ChunkPosition(column.getX(), column.getZ()).getBlock(x, (chunkY << 4) + y, z);
bedrockOnlyBlockEntities.add(BedrockOnlyBlockEntity.getTag(Vector3i.from(pos.getX(), pos.getY(), pos.getZ()), blockState)); bedrockOnlyBlockEntities.add(BedrockOnlyBlockEntity.getTag(Vector3i.from(pos.getX(), pos.getY(), pos.getZ()), blockState));
} }
@ -161,7 +158,7 @@ public class ChunkUtils {
String id = BlockEntityUtils.getBedrockBlockEntityId(tagName); String id = BlockEntityUtils.getBedrockBlockEntityId(tagName);
BlockEntityTranslator blockEntityTranslator = BlockEntityUtils.getBlockEntityTranslator(id); BlockEntityTranslator blockEntityTranslator = BlockEntityUtils.getBlockEntityTranslator(id);
Position pos = new Position((int) tag.get("x").getValue(), (int) tag.get("y").getValue(), (int) tag.get("z").getValue()); Position pos = new Position((int) tag.get("x").getValue(), (int) tag.get("y").getValue(), (int) tag.get("z").getValue());
BlockState blockState = blockEntityPositions.get(pos); int blockState = blockEntityPositions.getOrDefault(pos, 0);
bedrockBlockEntities[i] = blockEntityTranslator.getBlockEntityTag(tagName, tag, blockState); bedrockBlockEntities[i] = blockEntityTranslator.getBlockEntityTag(tagName, tag, blockState);
i++; i++;
} }
@ -188,14 +185,14 @@ public class ChunkUtils {
} }
} }
public static void updateBlock(GeyserSession session, BlockState blockState, Position position) { public static void updateBlock(GeyserSession session, int blockState, Position position) {
Vector3i pos = Vector3i.from(position.getX(), position.getY(), position.getZ()); Vector3i pos = Vector3i.from(position.getX(), position.getY(), position.getZ());
updateBlock(session, blockState, pos); updateBlock(session, blockState, pos);
} }
public static void updateBlock(GeyserSession session, BlockState blockState, Vector3i position) { public static void updateBlock(GeyserSession session, int blockState, Vector3i position) {
// Checks for item frames so they aren't tripped up and removed // Checks for item frames so they aren't tripped up and removed
if (ItemFrameEntity.positionContainsItemFrame(session, position) && blockState.equals(AIR)) { if (ItemFrameEntity.positionContainsItemFrame(session, position) && blockState == AIR) {
((ItemFrameEntity) session.getEntityCache().getEntityByJavaId(ItemFrameEntity.getItemFrameEntityId(session, position))).updateBlock(session); ((ItemFrameEntity) session.getEntityCache().getEntityByJavaId(ItemFrameEntity.getItemFrameEntityId(session, position))).updateBlock(session);
return; return;
} else if (ItemFrameEntity.positionContainsItemFrame(session, position)) { } else if (ItemFrameEntity.positionContainsItemFrame(session, position)) {