Skip to content

Commit 5f3628e

Browse files
committed
Survival fly block breaking
1 parent bf93cc3 commit 5f3628e

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

core/src/main/java/org/geysermc/geyser/session/cache/BlockBreakHandler.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,15 @@
4040
import org.cloudburstmc.protocol.bedrock.data.PlayerBlockActionData;
4141
import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition;
4242
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
43+
import org.cloudburstmc.protocol.bedrock.packet.MobEffectPacket;
4344
import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket;
4445
import org.geysermc.geyser.GeyserImpl;
4546
import org.geysermc.geyser.api.block.custom.CustomBlockState;
4647
import org.geysermc.geyser.entity.EntityDefinitions;
4748
import org.geysermc.geyser.entity.type.Entity;
4849
import org.geysermc.geyser.entity.type.ItemFrameEntity;
4950
import org.geysermc.geyser.inventory.GeyserItemStack;
51+
import org.geysermc.geyser.level.EffectType;
5052
import org.geysermc.geyser.level.block.Blocks;
5153
import org.geysermc.geyser.level.block.type.Block;
5254
import org.geysermc.geyser.level.block.type.BlockState;
@@ -59,7 +61,9 @@
5961
import org.geysermc.geyser.translator.protocol.bedrock.BedrockInventoryTransactionTranslator;
6062
import org.geysermc.geyser.translator.protocol.java.level.JavaBlockDestructionTranslator;
6163
import org.geysermc.geyser.util.BlockUtils;
64+
import org.geysermc.mcprotocollib.protocol.data.game.entity.Effect;
6265
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.BlockBreakStage;
66+
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
6367
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.InteractAction;
6468
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.PlayerAction;
6569
import org.geysermc.mcprotocollib.protocol.data.game.item.component.AdventureModePredicate;
@@ -327,6 +331,17 @@ protected void handleStartBreak(@NonNull Vector3i position, @NonNull BlockState
327331
this.serverSideBlockBreaking = true;
328332
}
329333

334+
// Survival fly in Bedrock doesn't come with a mining speed penalty, but we can use effects to lower the mining speed to match Java's one
335+
if (session.getGameMode() == GameMode.SURVIVAL && session.isFlying()) {
336+
MobEffectPacket mobEffectPacket = new MobEffectPacket();
337+
mobEffectPacket.setAmplifier(0);
338+
mobEffectPacket.setDuration((int) (1 / BlockUtils.getBlockMiningProgressPerTick(session, state.block(), item)));
339+
mobEffectPacket.setEvent(MobEffectPacket.Event.ADD);
340+
mobEffectPacket.setRuntimeEntityId(session.getPlayerEntity().geyserId());
341+
mobEffectPacket.setEffectId(EffectType.MINING_FATIGUE.getBedrockId());
342+
session.sendUpstreamPacket(mobEffectPacket);
343+
}
344+
330345
LevelEventPacket startBreak = new LevelEventPacket();
331346
startBreak.setType(LevelEvent.BLOCK_START_BREAK);
332347
startBreak.setPosition(position.toFloat());

0 commit comments

Comments
 (0)