From 86699b5adf099847749c256c5ea71a05b810fb28 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Mon, 10 Jun 2024 16:50:22 +0800 Subject: [PATCH] feat: implement block break time calculation --- .../component/common/BlockBaseComponent.java | 94 ++++++++++++ .../api/container/BaseContainerHolder.java | 5 + .../api/container/ContainerHolder.java | 2 + .../component/common/EntityBaseComponent.java | 26 ++++ .../component/common/ItemBaseComponent.java | 7 + .../common/BlockBaseComponentImpl.java | 1 + .../common/EntityBaseComponentImpl.java | 11 ++ .../common/ItemBaseComponentImpl.java | 17 +++ docs/protocol_research/block_breaking.zh.md | 142 ++++++++++++++++++ 9 files changed, 305 insertions(+) create mode 100644 docs/protocol_research/block_breaking.zh.md diff --git a/Allay-API/src/main/java/org/allaymc/api/block/component/common/BlockBaseComponent.java b/Allay-API/src/main/java/org/allaymc/api/block/component/common/BlockBaseComponent.java index 8128a4545..178c6f31e 100644 --- a/Allay-API/src/main/java/org/allaymc/api/block/component/common/BlockBaseComponent.java +++ b/Allay-API/src/main/java/org/allaymc/api/block/component/common/BlockBaseComponent.java @@ -4,7 +4,20 @@ import org.allaymc.api.block.component.BlockComponent; import org.allaymc.api.block.function.*; import org.allaymc.api.block.property.type.BlockPropertyType; +import org.allaymc.api.block.type.BlockState; import org.allaymc.api.block.type.BlockType; +import org.allaymc.api.block.type.BlockTypes; +import org.allaymc.api.container.FullContainerType; +import org.allaymc.api.container.impl.PlayerArmorContainer; +import org.allaymc.api.data.VanillaItemTags; +import org.allaymc.api.entity.Entity; +import org.allaymc.api.entity.component.common.EntityContainerHolderComponent; +import org.allaymc.api.entity.effect.type.EffectConduitPowerType; +import org.allaymc.api.entity.effect.type.EffectHasteType; +import org.allaymc.api.item.ItemStack; +import org.allaymc.api.item.enchantment.type.EnchantmentAquaAffinityType; +import org.allaymc.api.item.enchantment.type.EnchantmentEfficiencyType; +import org.allaymc.api.item.tag.ItemTag; import org.allaymc.api.world.Dimension; /** @@ -33,4 +46,85 @@ default void updateBlockProperty(BlockPropertyType property chunk.setBlockState(xIndex, y, zIndex, newBlockState, layer); chunk.sendChunkPacket(Dimension.createBlockUpdatePacket(newBlockState, x, y, z, layer)); } + + default double calculateBreakTime(BlockState blockState, ItemStack usedItem, Entity entity) { + checkBlockType(blockState); + double blockHardness = blockState.getBlockAttributes().hardness(); + if (blockHardness == 0) return 0; + boolean isCorrectTool = isCorrectTool(blockState, usedItem); + boolean hasAquaAffinity = false; + boolean isInWater = false; + boolean isOnGround = true; + int hasteEffectLevel = 0; + int miningFatigueLevel = 0; + int efficiencyLevel = 0; + + if (entity != null) { + isInWater = entity.isInWater(); + isOnGround = entity.isOnGround(); + hasteEffectLevel = entity.getEffectLevel(EffectHasteType.HASTE_TYPE); + // 潮涌核心保证至少两级的急速效果 + if (entity.hasEffect(EffectConduitPowerType.CONDUIT_POWER_TYPE)) { + hasteEffectLevel = Integer.max(hasteEffectLevel, 2); + } + miningFatigueLevel = entity.getEffectLevel(EffectHasteType.HASTE_TYPE); + if (entity instanceof EntityContainerHolderComponent containerHolder) { + if (containerHolder.hasContainer(FullContainerType.ARMOR)) { + hasAquaAffinity = containerHolder.getContainer(FullContainerType.ARMOR).getItemStack(0).hasEnchantment(EnchantmentAquaAffinityType.AQUA_AFFINITY_TYPE); + } + if (containerHolder.hasContainer(FullContainerType.PLAYER_INVENTORY)) { + efficiencyLevel = containerHolder.getContainer(FullContainerType.PLAYER_INVENTORY).getItemInHand().getEnchantmentLevel(EnchantmentEfficiencyType.EFFICIENCY_TYPE); + } + } + } + + // Calculate break time + double speed = 1.0d / blockHardness; + if (isCorrectTool) { + // 若是正确的工具,初始速度除以1.5 + speed /= 1.5d; + // 工具等级(木制,石制,铁制,etc...)加成 + speed *= toolBreakTimeBonus(usedItem, blockState); + // 工具效率附魔加成 + speed += speedBonusByEfficiency(efficiencyLevel); + } else { + // 若不是正确的工具,初始速度除以5 + speed /= 5.0d; + } + // 实体急迫药水效果加成 + speed *= 1.0d + (0.2d * hasteEffectLevel); + // 实体挖掘疲劳效果负加成 + if (miningFatigueLevel != 0) speed /= Math.pow(miningFatigueLevel, 3); + // 在水中但是没有水下速挖掘效果 + if (isInWater && !hasAquaAffinity) speed *= 0.2d; + // 在半空中 + if (!isInWater && !isOnGround) speed *= 0.2d; + return 1.0d / speed; + } + + private static double speedBonusByEfficiency(int efficiencyLevel) { + if (efficiencyLevel == 0) return 0; + return efficiencyLevel * efficiencyLevel + 1; + } + + private double toolBreakTimeBonus(ItemStack usedItem, BlockState blockState) { + // TODO: 实现剑破坏蜘蛛网,剪刀破坏羊毛和树叶和蜘蛛网的加速 + var itemType = usedItem.getItemType(); + if (itemType.hasItemTag(VanillaItemTags.GOLDEN_TIER)) return 12.0; + if (itemType.hasItemTag(VanillaItemTags.NETHERITE_TIER)) return 9.0; + if (itemType.hasItemTag(VanillaItemTags.DIAMOND_TIER)) return 8.0; + if (itemType.hasItemTag(VanillaItemTags.IRON_TIER)) return 6.0; + if (itemType.hasItemTag(VanillaItemTags.STONE_TIER)) return 4.0; + if (itemType.hasItemTag(VanillaItemTags.WOODEN_TIER)) return 2.0; + return 1.0; + } + + default boolean isCorrectTool(BlockState blockState, ItemStack usedItem) { + checkBlockType(blockState); + return false; + } + + private void checkBlockType(BlockState blockState) { + if (blockState.getBlockType() != getBlockType()) throw new IllegalArgumentException("Block type is not match! Expected: " + getBlockType().getIdentifier() + ", actual: " + blockState.getBlockType().getIdentifier()); + } } diff --git a/Allay-API/src/main/java/org/allaymc/api/container/BaseContainerHolder.java b/Allay-API/src/main/java/org/allaymc/api/container/BaseContainerHolder.java index cf7da4227..79ebf4ffb 100644 --- a/Allay-API/src/main/java/org/allaymc/api/container/BaseContainerHolder.java +++ b/Allay-API/src/main/java/org/allaymc/api/container/BaseContainerHolder.java @@ -31,6 +31,11 @@ public BaseContainerHolder(Container... containers) { return Collections.unmodifiableMap(typeToContainer); } + @Override + public boolean hasContainer(FullContainerType type) { + return typeToContainer.containsKey(type); + } + @Override public T getContainer(FullContainerType type) { return (T) typeToContainer.get(type); diff --git a/Allay-API/src/main/java/org/allaymc/api/container/ContainerHolder.java b/Allay-API/src/main/java/org/allaymc/api/container/ContainerHolder.java index 22dd2ba04..35790b59d 100644 --- a/Allay-API/src/main/java/org/allaymc/api/container/ContainerHolder.java +++ b/Allay-API/src/main/java/org/allaymc/api/container/ContainerHolder.java @@ -14,6 +14,8 @@ public interface ContainerHolder { @UnmodifiableView Map, Container> getContainers(); + boolean hasContainer(FullContainerType type); + T getContainer(FullContainerType type); T getContainerBySlotType(ContainerSlotType slotType); diff --git a/Allay-API/src/main/java/org/allaymc/api/entity/component/common/EntityBaseComponent.java b/Allay-API/src/main/java/org/allaymc/api/entity/component/common/EntityBaseComponent.java index 632ccd6b1..20617e122 100644 --- a/Allay-API/src/main/java/org/allaymc/api/entity/component/common/EntityBaseComponent.java +++ b/Allay-API/src/main/java/org/allaymc/api/entity/component/common/EntityBaseComponent.java @@ -1,6 +1,8 @@ package org.allaymc.api.entity.component.common; import org.allaymc.api.block.data.BlockFace; +import org.allaymc.api.block.type.BlockType; +import org.allaymc.api.block.type.BlockTypes; import org.allaymc.api.command.CommandSender; import org.allaymc.api.entity.Entity; import org.allaymc.api.entity.component.EntityComponent; @@ -203,6 +205,10 @@ default NbtMap saveNBTWithoutPos() { void onFall(); + boolean hasEffect(EffectType effectType); + + int getEffectLevel(EffectType effectType); + void addEffect(EffectInstance effectInstance); void removeEffect(EffectType effectType); @@ -333,4 +339,24 @@ default boolean canCriticalAttack() { @UnmodifiableView Set getTags(); + + default boolean isInWater() { + var loc = getLocation(); + int fx = (int) loc.x(); + int fy = (int) loc.y(); + int fz = (int) loc.z(); + var blockType = getDimension().getBlockState(fx, fy, fz).getBlockType(); + if (isWaterType(blockType)) { + return true; + } + blockType = getDimension().getBlockState(fx, fy, fz, 1).getBlockType(); + if (isWaterType(blockType)) { + return true; + } + return false; + } + + private static boolean isWaterType(BlockType blockType) { + return blockType == BlockTypes.FLOWING_WATER_TYPE || blockType == BlockTypes.WATER_TYPE; + } } diff --git a/Allay-API/src/main/java/org/allaymc/api/item/component/common/ItemBaseComponent.java b/Allay-API/src/main/java/org/allaymc/api/item/component/common/ItemBaseComponent.java index 25dfacc5e..5fdd6cd9d 100644 --- a/Allay-API/src/main/java/org/allaymc/api/item/component/common/ItemBaseComponent.java +++ b/Allay-API/src/main/java/org/allaymc/api/item/component/common/ItemBaseComponent.java @@ -5,6 +5,7 @@ import org.allaymc.api.entity.interfaces.EntityPlayer; import org.allaymc.api.item.ItemStack; import org.allaymc.api.item.component.ItemComponent; +import org.allaymc.api.item.enchantment.EnchantmentType; import org.allaymc.api.item.type.ItemType; import org.allaymc.api.world.Dimension; import org.cloudburstmc.nbt.NbtMap; @@ -109,4 +110,10 @@ default NbtMap saveNBT() { } float calculateAttackDamage(); + + boolean hasEnchantment(EnchantmentType enchantmentType); + + short getEnchantmentLevel(EnchantmentType enchantmentType); + + void addEnchantment(EnchantmentType enchantmentType, short level); } diff --git a/Allay-Server/src/main/java/org/allaymc/server/block/component/common/BlockBaseComponentImpl.java b/Allay-Server/src/main/java/org/allaymc/server/block/component/common/BlockBaseComponentImpl.java index dee09b51e..c362d11b7 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/block/component/common/BlockBaseComponentImpl.java +++ b/Allay-Server/src/main/java/org/allaymc/server/block/component/common/BlockBaseComponentImpl.java @@ -11,6 +11,7 @@ import org.allaymc.api.block.function.Place; import org.allaymc.api.block.type.BlockState; import org.allaymc.api.block.type.BlockType; +import org.allaymc.api.entity.Entity; import org.allaymc.api.utils.Identifier; import org.allaymc.api.component.annotation.ComponentIdentifier; import org.allaymc.api.component.annotation.Manager; diff --git a/Allay-Server/src/main/java/org/allaymc/server/entity/component/common/EntityBaseComponentImpl.java b/Allay-Server/src/main/java/org/allaymc/server/entity/component/common/EntityBaseComponentImpl.java index 5a476d36d..80f4e7ae5 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/entity/component/common/EntityBaseComponentImpl.java +++ b/Allay-Server/src/main/java/org/allaymc/server/entity/component/common/EntityBaseComponentImpl.java @@ -696,6 +696,17 @@ public void onFall() { this.fallDistance = 0; } + @Override + public boolean hasEffect(EffectType effectType) { + return effects.containsKey(effectType); + } + + @Override + public int getEffectLevel(EffectType effectType) { + var effect = effects.get(effectType); + return effect == null ? 0 : effect.getAmplifier() + 1; + } + @Override public void addEffect(EffectInstance effectInstance) { var old = effects.put(effectInstance.getType(), effectInstance); diff --git a/Allay-Server/src/main/java/org/allaymc/server/item/component/common/ItemBaseComponentImpl.java b/Allay-Server/src/main/java/org/allaymc/server/item/component/common/ItemBaseComponentImpl.java index 2eddad382..be9baeec2 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/item/component/common/ItemBaseComponentImpl.java +++ b/Allay-Server/src/main/java/org/allaymc/server/item/component/common/ItemBaseComponentImpl.java @@ -4,6 +4,7 @@ import org.allaymc.api.block.data.BlockFace; import org.allaymc.api.block.type.BlockState; import org.allaymc.api.block.type.BlockType; +import org.allaymc.api.item.enchantment.SimpleEnchantmentInstance; import org.allaymc.api.utils.Identifier; import org.allaymc.api.component.annotation.ComponentIdentifier; import org.allaymc.api.component.annotation.ComponentedObject; @@ -325,4 +326,20 @@ public ItemStack copy() { public float calculateAttackDamage() { return attributeComponent.getItemAttributes().attackDamage(); } + + @Override + public boolean hasEnchantment(EnchantmentType enchantmentType) { + return enchantments.containsKey(enchantmentType); + } + + @Override + public short getEnchantmentLevel(EnchantmentType enchantmentType) { + var instance = enchantments.get(enchantmentType); + return instance == null ? 0 : instance.getLevel(); + } + + @Override + public void addEnchantment(EnchantmentType enchantmentType, short level) { + enchantments.put(enchantmentType, new SimpleEnchantmentInstance(enchantmentType, level)); + } } diff --git a/docs/protocol_research/block_breaking.zh.md b/docs/protocol_research/block_breaking.zh.md new file mode 100644 index 000000000..d083f9d20 --- /dev/null +++ b/docs/protocol_research/block_breaking.zh.md @@ -0,0 +1,142 @@ +--- +comments: true +--- + +Game version: 1.20.81 +System: Windows + +## 创造模式 + +### 单次点击左键 + +数据包明细: + +```txt +[14:46:53:676] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:676] [SERVER BOUND] - PlayerActionPacket(runtimeEntityId=16, action=DIMENSION_CHANGE_REQUEST_OR_CREATIVE_DESTROY_BLOCK, blockPosition=(15, -61, -11), resultPosition=(0, 0, 0), face=5) +[14:46:53:676] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:691] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:691] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:691] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:691] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:691] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:691] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:692] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:692] [SERVER BOUND] - AnimatePacket(rowingTime=0.0, action=SWING_ARM, runtimeEntityId=16) +[14:46:53:692] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(48.23723, 129.61163, 129.61163), position=(17.297148, -58.37999, -9.432415), motion=(0.0, 0.0), inputData=[PERFORM_ITEM_INTERACTION, PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=441, delta=(-0.0, -0.0784, -0.0), itemUseTransaction=ItemUseTransaction(legacyRequestId=0, legacySlots=[], usingNetIds=false, actions=[], actionType=2, blockPosition=(15, -61, -11), blockFace=5, hotbarSlot=5, itemInHand=BaseItemData(definition=SimpleItemDefinition(identifier=minecraft:air, runtimeId=0, componentBased=false), damage=0, count=0, tag=null, canPlace=[], canBreak=[], blockingTicks=0, blockDefinition=null, usingNetId=false, netId=0), playerPosition=(17.297148, -58.37999, -9.432415), clickPosition=(0.0, 0.0, 0.0), blockDefinition=UnknownDefinition[runtimeId=0]), itemStackRequest=null, playerActions=[PlayerBlockActionData(action=START_BREAK, blockPosition=(15, -61, -11), face=5), PlayerBlockActionData(action=STOP_BREAK, blockPosition=null, face=0), PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -11), face=5)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:46:53:737] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(48.23723, 129.61163, 129.61163), position=(17.297148, -58.37999, -9.432415), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=442, delta=(-0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -62, -11), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:46:53:767] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_STOP_BREAK, position=(0.0, 0.0, 0.0), data=0) +[14:46:53:767] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -10.5), data=83896678) +[14:46:53:767] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_DESTROY_BLOCK, position=(15.5, -60.5, -10.5), data=10598) +[14:46:53:768] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -61.5, -10.5), data=16786775) +[14:46:53:813] [CLIENT BOUND] - UpdateBlockPacket(flags=[NEIGHBORS, NETWORK], blockPosition=(15, -61, -11), definition=UnknownDefinition[runtimeId=11881], dataLayer=0) +``` + +客户端发送的大量AnimatePacket应该是win版客户端的bug,暂不清楚其他平台客户端是否存在相同情况。 +理论上客户端应该只发送一次AnimatePacket。针对这种情况,服务端应该有所防备。 + +LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(3.5, -60.5, -1.5), data=50342246)中的data字段指的是方块的BlockStateHash + +LevelEventPacket(type=PARTICLE_DESTROY_BLOCK, position=(3.5, -60.5, -1.5), data=10598)中的data字段指代的其实也是方块,但是是旧的网络id(不知道为什么没用新的BlockStateHash) + +附: 50342246和10598分别是minecraft:grass_block的BlockStateHash和旧的网络id + +## 生存模式 + +### 按住并破坏一个方块 + +数据包明细: + +```txt +[14:50:16:878] [SERVER BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=, babySound=false, relativeVolumeDisabled=false) +[14:50:16:878] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4505, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=START_BREAK, blockPosition=(15, -61, -8), face=1), PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:16:924] [CLIENT BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=minecraft:, babySound=false, relativeVolumeDisabled=false) +[14:50:16:924] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_START_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:16:924] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:16:924] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:16:940] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4506, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:16:987] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4507, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:018] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:018] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:018] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:018] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:033] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4508, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:065] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:065] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:081] [SERVER BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=, babySound=false, relativeVolumeDisabled=false) +[14:50:17:081] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4509, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:128] [CLIENT BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=minecraft:, babySound=false, relativeVolumeDisabled=false) +[14:50:17:128] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4510, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:128] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:128] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:173] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:173] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:189] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4511, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:219] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:219] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:234] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4512, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:266] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:266] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:281] [SERVER BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=, babySound=false, relativeVolumeDisabled=false) +[14:50:17:281] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4513, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:328] [CLIENT BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=minecraft:, babySound=false, relativeVolumeDisabled=false) +[14:50:17:328] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4514, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:328] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:328] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:375] [CLIENT BOUND] - EntityEventPacket(runtimeEntityId=16, type=CHECK_TREASURE_HUNTER_ACHIEVEMENT, data=0) +[14:50:17:376] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:376] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:391] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4515, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:437] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4516, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:468] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:468] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:468] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:468] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:484] [SERVER BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=, babySound=false, relativeVolumeDisabled=false) +[14:50:17:484] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4517, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:515] [CLIENT BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=minecraft:, babySound=false, relativeVolumeDisabled=false) +[14:50:17:515] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:515] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:530] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4518, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:576] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:576] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:592] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4519, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:638] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4520, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:668] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:668] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:668] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:668] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:684] [SERVER BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=, babySound=false, relativeVolumeDisabled=false) +[14:50:17:684] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4521, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:715] [CLIENT BOUND] - LevelSoundEvent2Packet(sound=HIT, position=(15.5, -60.5, -7.5), extraData=10598, identifier=minecraft:, babySound=false, relativeVolumeDisabled=false) +[14:50:17:715] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:715] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:746] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_ITEM_INTERACTION, PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4522, delta=(0.0, -0.0784, -0.0), itemUseTransaction=ItemUseTransaction(legacyRequestId=0, legacySlots=[], usingNetIds=false, actions=[], actionType=2, blockPosition=(15, -61, -8), blockFace=1, hotbarSlot=4, itemInHand=BaseItemData(definition=SimpleItemDefinition(identifier=minecraft:air, runtimeId=0, componentBased=false), damage=0, count=0, tag=null, canPlace=[], canBreak=[], blockingTicks=0, blockDefinition=null, usingNetId=false, netId=0), playerPosition=(15.952356, -55.37999, -7.325912), clickPosition=(0.0, 0.0, 0.0), blockDefinition=UnknownDefinition[runtimeId=0]), itemStackRequest=null, playerActions=[PlayerBlockActionData(action=STOP_BREAK, blockPosition=null, face=0), PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -61, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:794] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4523, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -62, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:825] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_STOP_BREAK, position=(0.0, 0.0, 0.0), data=0) +[14:50:17:825] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -60.5, -7.5), data=16787814) +[14:50:17:825] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640) +[14:50:17:825] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_DESTROY_BLOCK, position=(15.5, -60.5, -7.5), data=10598) +[14:50:17:840] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4524, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -62, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:872] [CLIENT BOUND] - UpdateBlockPacket(flags=[NEIGHBORS, NETWORK], blockPosition=(15, -61, -8), definition=UnknownDefinition[runtimeId=11881], dataLayer=0) +[14:50:17:872] [CLIENT BOUND] - AddItemEntityPacket(metadata={FLAGS=[HAS_COLLISION, HAS_GRAVITY], STRUCTURAL_INTEGRITY=1i, VARIANT=0i, BLOCK=UnknownDefinition[runtimeId=0], COLOR=0b, NAME="", OWNER_EID=-1l, AIR_SUPPLY=300s, CHARGE_AMOUNT=0b, LEASH_HOLDER=0l, SCALE=1.0f, HAS_NPC=false, AIR_SUPPLY_MAX=300s, MARK_VARIANT=0i, CONTAINER_TYPE=0b, CONTAINER_SIZE=0i, CONTAINER_STRENGTH_MODIFIER=0i, WIDTH=0.25f, HEIGHT=0.25f, SEAT_OFFSET=(0.0, 0.0, 0.0), SEAT_LOCK_RIDER_ROTATION=false, SEAT_LOCK_RIDER_ROTATION_DEGREES=0.0f, SEAT_HAS_ROTATION=false, SEAT_ROTATION_OFFSET_DEGREES=0.0f, COMMAND_BLOCK_ENABLED=false, COMMAND_BLOCK_NAME="", COMMAND_BLOCK_LAST_OUTPUT="", COMMAND_BLOCK_TRACK_OUTPUT=true, STRENGTH=0i, STRENGTH_MAX=0i, EVOKER_SPELL_CASTING_COLOR=0i, DATA_LIFETIME_TICKS=-1i, NAMETAG_ALWAYS_SHOW=-1b, COLOR_2=0b, TRADE_TIER=0i, MAX_TRADE_TIER=0i, TRADE_EXPERIENCE=0i, SKIN_ID=0i, COMMAND_BLOCK_TICK_DELAY=3i, COMMAND_BLOCK_EXECUTE_ON_FIRST_TICK=true, AMBIENT_SOUND_INTERVAL=8.0f, AMBIENT_SOUND_INTERVAL_RANGE=16.0f, AMBIENT_SOUND_EVENT_NAME="ambient", FALL_DAMAGE_MULTIPLIER=1.0f, CAN_RIDE_TARGET=false, LOW_TIER_CURED_TRADE_DISCOUNT=0i, HIGH_TIER_CURED_TRADE_DISCOUNT=0i, NEARBY_CURED_TRADE_DISCOUNT=0i, NEARBY_CURED_DISCOUNT_TIME_STAMP=0i, HITBOX={}, IS_BUOYANT=false, FREEZING_EFFECT_STRENGTH=0.0f, MOVEMENT_SOUND_DISTANCE_OFFSET=1.0f, HEARTBEAT_INTERVAL_TICKS=20i, HEARTBEAT_SOUND_EVENT=521i}, uniqueEntityId=-8589934588, runtimeEntityId=19, itemInHand=BaseItemData(definition=SimpleItemDefinition(identifier=minecraft:dirt, runtimeId=3, componentBased=false), damage=0, count=1, tag=null, canPlace=[], canBreak=[], blockingTicks=0, blockDefinition=UnknownDefinition[runtimeId=9559], usingNetId=false, netId=0), position=(15.708327, -60.191227, -7.599922), motion=(-0.028899074, 0.2, 0.0041115656), fromFishing=false) +[14:50:17:872] [CLIENT BOUND] - UpdateAttributesPacket(runtimeEntityId=16, attributes=[AttributeData(name=minecraft:player.exhaustion, minimum=0.0, maximum=20.0, value=0.315, defaultValue=0.0, modifiers=[])], tick=0) +[14:50:17:872] [CLIENT BOUND] - SetEntityDataPacket(metadata={FLAGS=[HAS_COLLISION, HAS_GRAVITY], STRUCTURAL_INTEGRITY=1i, VARIANT=0i, BLOCK=UnknownDefinition[runtimeId=0], COLOR=0b, NAME="", OWNER_EID=-1l, AIR_SUPPLY=300s, CHARGE_AMOUNT=0b, LEASH_HOLDER=0l, HAS_NPC=false, AIR_SUPPLY_MAX=300s, MARK_VARIANT=0i, CONTAINER_TYPE=0b, CONTAINER_SIZE=0i, CONTAINER_STRENGTH_MODIFIER=0i, WIDTH=0.25f, HEIGHT=0.25f, SEAT_LOCK_RIDER_ROTATION=false, SEAT_LOCK_RIDER_ROTATION_DEGREES=0.0f, SEAT_HAS_ROTATION=false, SEAT_ROTATION_OFFSET_DEGREES=0.0f, COMMAND_BLOCK_ENABLED=false, COMMAND_BLOCK_NAME="", COMMAND_BLOCK_LAST_OUTPUT="", COMMAND_BLOCK_TRACK_OUTPUT=true, STRENGTH=0i, STRENGTH_MAX=0i, EVOKER_SPELL_CASTING_COLOR=0i, DATA_LIFETIME_TICKS=-1i, NAMETAG_ALWAYS_SHOW=-1b, COLOR_2=0b, TRADE_TIER=0i, MAX_TRADE_TIER=0i, TRADE_EXPERIENCE=0i, SKIN_ID=0i, COMMAND_BLOCK_TICK_DELAY=3i, COMMAND_BLOCK_EXECUTE_ON_FIRST_TICK=true, AMBIENT_SOUND_INTERVAL=8.0f, AMBIENT_SOUND_INTERVAL_RANGE=16.0f, AMBIENT_SOUND_EVENT_NAME="ambient", FALL_DAMAGE_MULTIPLIER=1.0f, CAN_RIDE_TARGET=false, LOW_TIER_CURED_TRADE_DISCOUNT=0i, HIGH_TIER_CURED_TRADE_DISCOUNT=0i, NEARBY_CURED_TRADE_DISCOUNT=0i, NEARBY_CURED_DISCOUNT_TIME_STAMP=0i, HITBOX={}, IS_BUOYANT=false, FREEZING_EFFECT_STRENGTH=0.0f, MOVEMENT_SOUND_DISTANCE_OFFSET=1.0f, HEARTBEAT_INTERVAL_TICKS=20i, HEARTBEAT_SOUND_EVENT=521i}, runtimeEntityId=19, tick=0, properties=EntityProperties(intProperties=[], floatProperties=[])) +[14:50:17:873] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -61.5, -7.5), data=16786775) +[14:50:17:873] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -62.0, -8.0), data=4369) +[14:50:17:887] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4525, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -62, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:918] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -61.5, -7.5), data=16786775) +[14:50:17:918] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -62.0, -8.0), data=4369) +[14:50:17:918] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -61.5, -7.5), data=16786775) +[14:50:17:919] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -62.0, -8.0), data=4369) +[14:50:17:935] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4526, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -62, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:17:966] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -61.5, -7.5), data=16786775) +[14:50:17:966] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -62.0, -8.0), data=4369) +[14:50:17:982] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4527, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=CONTINUE_BREAK, blockPosition=(15, -62, -8), face=1)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:18:013] [CLIENT BOUND] - LevelEventPacket(type=PARTICLE_CRACK_BLOCK, position=(15.5, -61.5, -7.5), data=16786775) +[14:50:18:013] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -62.0, -8.0), data=4369) +[14:50:18:029] [SERVER BOUND] - PlayerAuthInputPacket(rotation=(88.464355, 90.27551, 90.27551), position=(15.952356, -55.37999, -7.325912), motion=(0.0, 0.0), inputData=[PERFORM_BLOCK_ACTIONS], inputMode=MOUSE, playMode=SCREEN, vrGazeDirection=null, tick=4528, delta=(0.0, -0.0784, -0.0), itemUseTransaction=null, itemStackRequest=null, playerActions=[PlayerBlockActionData(action=ABORT_BREAK, blockPosition=(15, -61, -8), face=0)], inputInteractionModel=TOUCH, analogMoveVector=(0.0, 0.0), predictedVehicle=0, vehicleRotation=null) +[14:50:18:075] [CLIENT BOUND] - LevelEventPacket(type=BLOCK_STOP_BREAK, position=(15.0, -61.0, -8.0), data=0) +``` + +LevelEventPacket(type=BLOCK_UPDATE_BREAK, position=(15.0, -61.0, -8.0), data=3640)中的data字段指的是挖掘进度 \ No newline at end of file