Paper: Fix for MC-160177

Created on 21 Nov 2019  路  2Comments  路  Source: PaperMC/Paper

An explanation of the issue can be found on Mojangs bug tracker:
https://bugs.mojang.com/browse/MC-160177
In short: You can't see other players breaking blocks.

The issue was fixed in 19w45a by Mojang. I generated a git diff for 19w44a and 19w45a and extracted the relevant part:
```diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java
index 938c93b..3497070 100644
--- a/net/minecraft/server/level/ServerPlayerGameMode.java
+++ b/net/minecraft/server/level/ServerPlayerGameMode.java
@@ -85,7 +85,7 @@ public class ServerPlayerGameMode {
this.hasDelayedDestroy = false;
}
else {
- final float float3 = this.incrementDestroyProgress(bya2, this.delayedDestroyPos);
+ final float float3 = this.incrementDestroyProgress(bya2, this.delayedDestroyPos, this.delayedTickStart);
if (float3 >= 1.0f) {
this.hasDelayedDestroy = false;
this.destroyBlock(this.delayedDestroyPos);
@@ -100,20 +100,20 @@ public class ServerPlayerGameMode {
this.isDestroyingBlock = false;
}
else {
- this.incrementDestroyProgress(bya2, this.destroyPos);
+ this.incrementDestroyProgress(bya2, this.destroyPos, this.destroyProgressStart);
}
}
}

  • private float incrementDestroyProgress(final BlockState bya, final BlockPos fh) {
  • final int integer4 = this.gameTicks - this.delayedTickStart;
  • final float float5 = bya.getDestroyProgress(this.player, this.player.level, fh) * (integer4 + 1);
  • final int integer5 = (int)(float5 * 10.0f);
  • if (integer5 != this.lastSentState) {
  • this.level.destroyBlockProgress(this.player.getId(), fh, integer5);
  • this.lastSentState = integer5;
  • private float incrementDestroyProgress(final BlockState bya, final BlockPos fh, final int integer) {
  • final int integer2 = this.gameTicks - integer;
  • final float float6 = bya.getDestroyProgress(this.player, this.player.level, fh) * (integer2 + 1);
  • final int integer3 = (int)(float6 * 10.0f);
  • if (integer3 != this.lastSentState) {
  • this.level.destroyBlockProgress(this.player.getId(), fh, integer3);
  • this.lastSentState = integer3;
    }
  • return float5;
  • return float6;
    }

    public void handleBlockBreakAction(final BlockPos fh, final ServerboundPlayerActionPacket.Action a, final Direction fm, final int integer) {
    `` The matching class in Spigot is calledPlayerInteractManager. The methods area()anda(IBlockData, BlockPosition). delayedTickStartisk. destroyProgressStartislastDigTick`.

All 2 comments

I just saw copyrighted reverse-engineered code.
You've destroyed my life as a cleanroom dev.

I hope Mojang doesn't sue me :(

Was this page helpful?
0 / 5 - 0 ratings