From 207626c7793b80c8b1304e07cdbb4e7f267fb726 Mon Sep 17 00:00:00 2001 From: MC_XiaoHei Date: Wed, 8 Oct 2025 13:46:16 +0800 Subject: [PATCH] feat: finish jade protocol --- .../protocol/jade/accessor/BlockAccessor.java | 8 ++++++ .../jade/accessor/BlockAccessorImpl.java | 28 ++++++++++++++++--- .../jade/accessor/EntityAccessor.java | 5 ++++ .../jade/accessor/EntityAccessorImpl.java | 17 ++++++++++- .../leaves/protocol/jade/util/CommonUtil.java | 15 ---------- 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java index b981cdd0..00840725 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java @@ -1,8 +1,10 @@ package org.leavesmc.leaves.protocol.jade.accessor; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -35,6 +37,12 @@ public interface BlockAccessor extends Accessor { return blockEntity(() -> blockEntity); } + Builder serverData(CompoundTag serverData); + + Builder showDetails(boolean showDetails); + + Builder serversideRep(ItemStack stack); + Builder blockEntity(Supplier blockEntity); Builder from(BlockAccessor accessor); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java index cfcf71b1..41d76fd1 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java @@ -2,6 +2,7 @@ package org.leavesmc.leaves.protocol.jade.accessor; import com.google.common.base.Suppliers; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -91,6 +92,21 @@ public class BlockAccessorImpl extends AccessorImpl implements B return this; } + @Override + public Builder serverData(CompoundTag serverData) { + return this; + } + + @Override + public Builder showDetails(boolean showDetails) { + return this; + } + + @Override + public Builder serversideRep(ItemStack stack) { + return this; + } + @Override public Builder blockEntity(Supplier blockEntity) { this.blockEntity = blockEntity; @@ -113,30 +129,34 @@ public class BlockAccessorImpl extends AccessorImpl implements B } } - public record SyncData(boolean showDetails, BlockHitResult hit, BlockState blockState, ItemStack fakeBlock) { + public record SyncData(boolean showDetails, BlockHitResult hit, ItemStack serversideRep, CompoundTag data) { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.BOOL, SyncData::showDetails, StreamCodec.of(FriendlyByteBuf::writeBlockHitResult, FriendlyByteBuf::readBlockHitResult), SyncData::hit, - ByteBufCodecs.idMapper(Block.BLOCK_STATE_REGISTRY), - SyncData::blockState, ItemStack.OPTIONAL_STREAM_CODEC, - SyncData::fakeBlock, + SyncData::serversideRep, + ByteBufCodecs.COMPOUND_TAG, + SyncData::data, SyncData::new ); public BlockAccessor unpack(ServerPlayer player) { Supplier blockEntity = null; + BlockState blockState = player.level().getBlockState(hit.getBlockPos()); if (blockState.hasBlockEntity()) { blockEntity = Suppliers.memoize(() -> player.level().getBlockEntity(hit.getBlockPos())); } return new Builder() .level(player.level()) .player(player) + .showDetails(showDetails) .hit(hit) .blockState(blockState) .blockEntity(blockEntity) + .serversideRep(serversideRep) + .serverData(data) .build(); } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java index f46108cf..5d489733 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java @@ -1,5 +1,6 @@ package org.leavesmc.leaves.protocol.jade.accessor; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -29,6 +30,10 @@ public interface EntityAccessor extends Accessor { Builder hit(Supplier hit); + Builder serverData(CompoundTag serverData); + + Builder showDetails(boolean showDetails); + default Builder entity(Entity entity) { return entity(() -> entity); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java index 6486f4e9..4979652e 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java @@ -1,6 +1,7 @@ package org.leavesmc.leaves.protocol.jade.accessor; import com.google.common.base.Suppliers; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; @@ -65,6 +66,16 @@ public class EntityAccessorImpl extends AccessorImpl implements return this; } + @Override + public Builder serverData(CompoundTag serverData) { + return this; + } + + @Override + public Builder showDetails(boolean showDetails) { + return this; + } + @Override public Builder entity(Supplier entity) { this.entity = entity; @@ -86,7 +97,7 @@ public class EntityAccessorImpl extends AccessorImpl implements } } - public record SyncData(boolean showDetails, int id, int partIndex, Vec3 hitVec) { + public record SyncData(boolean showDetails, int id, int partIndex, Vec3 hitVec, CompoundTag data) { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.BOOL, SyncData::showDetails, @@ -96,6 +107,8 @@ public class EntityAccessorImpl extends AccessorImpl implements SyncData::partIndex, ByteBufCodecs.VECTOR3F.map(Vec3::new, Vec3::toVector3f), SyncData::hitVec, + ByteBufCodecs.COMPOUND_TAG, + SyncData::data, SyncData::new ); @@ -104,8 +117,10 @@ public class EntityAccessorImpl extends AccessorImpl implements return new EntityAccessorImpl.Builder() .level(player.level()) .player(player) + .showDetails(showDetails) .entity(entity) .hit(Suppliers.memoize(() -> new EntityHitResult(entity.get(), hitVec))) + .serverData(data) .build(); } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/CommonUtil.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/CommonUtil.java index 5eba3338..30deeb81 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/CommonUtil.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/CommonUtil.java @@ -1,20 +1,15 @@ package org.leavesmc.leaves.protocol.jade.util; -import com.mojang.authlib.GameProfile; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.boss.EnderDragonPart; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; -import org.jetbrains.annotations.Nullable; import org.leavesmc.leaves.LeavesLogger; import org.leavesmc.leaves.protocol.jade.accessor.Accessor; import org.leavesmc.leaves.protocol.jade.provider.IServerExtensionProvider; import java.util.List; import java.util.Map; -import java.util.Optional; -import java.util.UUID; public class CommonUtil { @@ -42,16 +37,6 @@ public class CommonUtil { } - @Nullable - public static String getLastKnownUsername(@Nullable UUID uuid) { - if (uuid == null) { - return null; - } - Optional optional = MinecraftServer.getServer().services.profileResolver().fetchById(uuid); - return optional.map(GameProfile::name).orElse(null); - } - - public static Map.Entry>> getServerExtensionData( Accessor accessor, WrappedHierarchyLookup> lookup) {