Skip to content

Commit 8832df4

Browse files
committed
Survival fly block breaking
1 parent bf93cc3 commit 8832df4

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

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

Lines changed: 23 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;
@@ -60,6 +62,7 @@
6062
import org.geysermc.geyser.translator.protocol.java.level.JavaBlockDestructionTranslator;
6163
import org.geysermc.geyser.util.BlockUtils;
6264
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.BlockBreakStage;
65+
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
6366
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.InteractAction;
6467
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.PlayerAction;
6568
import org.geysermc.mcprotocollib.protocol.data.game.item.component.AdventureModePredicate;
@@ -327,6 +330,17 @@ protected void handleStartBreak(@NonNull Vector3i position, @NonNull BlockState
327330
this.serverSideBlockBreaking = true;
328331
}
329332

333+
// 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
334+
if (session.getGameMode() == GameMode.SURVIVAL && session.isFlying() && breakProgress > 0) {
335+
MobEffectPacket mobEffectPacket = new MobEffectPacket();
336+
mobEffectPacket.setAmplifier(0);
337+
mobEffectPacket.setDuration((int) BlockUtils.reciprocal(breakProgress));
338+
mobEffectPacket.setEvent(MobEffectPacket.Event.ADD);
339+
mobEffectPacket.setRuntimeEntityId(session.getPlayerEntity().geyserId());
340+
mobEffectPacket.setEffectId(EffectType.MINING_FATIGUE.getBedrockId());
341+
session.sendUpstreamPacket(mobEffectPacket);
342+
}
343+
330344
LevelEventPacket startBreak = new LevelEventPacket();
331345
startBreak.setType(LevelEvent.BLOCK_START_BREAK);
332346
startBreak.setPosition(position.toFloat());
@@ -419,6 +433,15 @@ private void handleAbortBreaking(Vector3i position) {
419433
session.sendDownstreamGamePacket(abortBreakingPacket);
420434
}
421435

436+
// Remove effect again which is applied to simulate survival fly block breaking
437+
if (session.getGameMode() == GameMode.SURVIVAL && session.isFlying()) {
438+
MobEffectPacket mobEffectPacket = new MobEffectPacket();
439+
mobEffectPacket.setEvent(MobEffectPacket.Event.REMOVE);
440+
mobEffectPacket.setRuntimeEntityId(session.getPlayerEntity().geyserId());
441+
mobEffectPacket.setEffectId(EffectType.MINING_FATIGUE.getBedrockId());
442+
session.sendUpstreamPacket(mobEffectPacket);
443+
}
444+
422445
BlockUtils.sendBedrockStopBlockBreak(session, position.toFloat());
423446
this.clearCurrentVariables();
424447
}

0 commit comments

Comments
 (0)