From 0601c47be54c1f33759ffb411e21e13c66a76837 Mon Sep 17 00:00:00 2001 From: CraftBukkit/Spigot Date: Wed, 7 Apr 2021 15:03:30 +1000 Subject: [PATCH] SPIGOT-6413: Server Corruption Changing Blocks in Piston Events By: md_5 --- .../minecraft/server/level/WorldServer.patch | 88 ++++++++++--------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch b/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch index d6259ef0bd..0f6c2bbfc9 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch @@ -76,7 +76,7 @@ this.portalTravelAgent = new PortalTravelAgent(this); this.Q(); this.R(); -@@ -201,14 +238,48 @@ +@@ -201,14 +238,50 @@ iworlddataserver.setGameType(minecraftserver.getGamemode()); } @@ -116,8 +116,10 @@ + + if (type instanceof ITileEntity) { + TileEntity replacement = ((ITileEntity) type).createTile(this); -+ replacement.setLocation(this, pos); -+ this.setTileEntity(pos, replacement); ++ if (replacement != null) { ++ replacement.setLocation(this, pos); ++ this.setTileEntity(pos, replacement); ++ } + return replacement; + } else { + return found; @@ -127,7 +129,7 @@ public void a(int i, int j, boolean flag, boolean flag1) { this.worldDataServer.setClearWeatherTime(i); -@@ -299,6 +370,7 @@ +@@ -299,6 +372,7 @@ this.rainLevel = MathHelper.a(this.rainLevel, 0.0F, 1.0F); } @@ -135,7 +137,7 @@ if (this.lastRainLevel != this.rainLevel) { this.server.getPlayerList().a((Packet) (new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.h, this.rainLevel)), this.getDimensionKey()); } -@@ -317,18 +389,47 @@ +@@ -317,18 +391,47 @@ this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.h, this.rainLevel)); this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.i, this.thunderLevel)); } @@ -188,7 +190,7 @@ if (this.getGameRules().getBoolean(GameRules.DO_WEATHER_CYCLE)) { this.clearWeather(); } -@@ -350,7 +451,7 @@ +@@ -350,7 +453,7 @@ this.ak(); this.ticking = false; gameprofilerfiller.exitEnter("entities"); @@ -197,7 +199,7 @@ if (flag3) { this.resetEmptyTime(); -@@ -369,6 +470,7 @@ +@@ -369,6 +472,7 @@ Entity entity = (Entity) entry.getValue(); Entity entity1 = entity.getVehicle(); @@ -205,7 +207,7 @@ if (!this.server.getSpawnAnimals() && (entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal)) { entity.die(); } -@@ -376,6 +478,7 @@ +@@ -376,6 +480,7 @@ if (!this.server.getSpawnNPCs() && entity instanceof NPC) { entity.die(); } @@ -213,7 +215,7 @@ gameprofilerfiller.enter("checkDespawn"); if (!entity.dead) { -@@ -450,7 +553,7 @@ +@@ -450,7 +555,7 @@ } private void wakeupPlayers() { @@ -222,7 +224,7 @@ entityplayer.wakeup(false, false); }); } -@@ -477,14 +580,14 @@ +@@ -477,14 +582,14 @@ entityhorseskeleton.t(true); entityhorseskeleton.setAgeRaw(0); entityhorseskeleton.setPosition((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); @@ -239,7 +241,7 @@ } } -@@ -495,11 +598,11 @@ +@@ -495,11 +600,11 @@ BiomeBase biomebase = this.getBiome(blockposition); if (biomebase.a(this, blockposition1)) { @@ -253,7 +255,7 @@ } if (flag && this.getBiome(blockposition1).c() == BiomeBase.Precipitation.RAIN) { -@@ -546,7 +649,7 @@ +@@ -546,7 +651,7 @@ protected BlockPosition a(BlockPosition blockposition) { BlockPosition blockposition1 = this.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING, blockposition); AxisAlignedBB axisalignedbb = (new AxisAlignedBB(blockposition1, new BlockPosition(blockposition1.getX(), this.getBuildHeight(), blockposition1.getZ()))).g(3.0D); @@ -262,7 +264,7 @@ return entityliving != null && entityliving.isAlive() && this.e(entityliving.getChunkCoordinates()); }); -@@ -575,7 +678,7 @@ +@@ -575,7 +680,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -271,7 +273,7 @@ ++i; } else if (entityplayer.isSleeping()) { ++j; -@@ -593,10 +696,22 @@ +@@ -593,10 +698,22 @@ } private void clearWeather() { @@ -296,7 +298,7 @@ } public void resetEmptyTime() { -@@ -637,6 +752,7 @@ +@@ -637,6 +754,7 @@ }); gameprofilerfiller.c("tickNonPassenger"); entity.tick(); @@ -304,7 +306,7 @@ gameprofilerfiller.exit(); } -@@ -669,6 +785,7 @@ +@@ -669,6 +787,7 @@ }); gameprofilerfiller.c("tickPassenger"); entity1.passengerTick(); @@ -312,7 +314,7 @@ gameprofilerfiller.exit(); } -@@ -725,6 +842,7 @@ +@@ -725,6 +844,7 @@ ChunkProviderServer chunkproviderserver = this.getChunkProvider(); if (!flag1) { @@ -320,7 +322,7 @@ if (iprogressupdate != null) { iprogressupdate.a(new ChatMessage("menu.savingLevel")); } -@@ -736,11 +854,19 @@ +@@ -736,11 +856,19 @@ chunkproviderserver.save(flag); } @@ -341,7 +343,7 @@ } this.getChunkProvider().getWorldPersistentData().a(); -@@ -801,11 +927,24 @@ +@@ -801,11 +929,24 @@ @Override public boolean addEntity(Entity entity) { @@ -368,7 +370,7 @@ } public void addEntityTeleport(Entity entity) { -@@ -855,13 +994,18 @@ +@@ -855,13 +996,18 @@ this.registerEntity(entityplayer); } @@ -389,7 +391,7 @@ IChunkAccess ichunkaccess = this.getChunkAt(MathHelper.floor(entity.locX() / 16.0D), MathHelper.floor(entity.locZ() / 16.0D), ChunkStatus.FULL, entity.attachedToPlayer); if (!(ichunkaccess instanceof Chunk)) { -@@ -890,7 +1034,7 @@ +@@ -890,7 +1036,7 @@ if (entity1 == null) { return false; } else { @@ -398,7 +400,7 @@ return true; } } -@@ -919,10 +1063,16 @@ +@@ -919,10 +1065,16 @@ } public boolean addAllEntitiesSafely(Entity entity) { @@ -416,7 +418,7 @@ return true; } } -@@ -973,10 +1123,17 @@ +@@ -973,10 +1125,17 @@ } this.getScoreboard().a(entity); @@ -434,7 +436,7 @@ } private void registerEntity(Entity entity) { -@@ -997,9 +1154,16 @@ +@@ -997,9 +1156,16 @@ this.entitiesByUUID.put(entity.getUniqueID(), entity); this.getChunkProvider().addEntity(entity); @@ -451,7 +453,7 @@ } } -@@ -1015,7 +1179,7 @@ +@@ -1015,7 +1181,7 @@ } private void removeEntityFromChunk(Entity entity) { @@ -460,7 +462,7 @@ if (ichunkaccess instanceof Chunk) { ((Chunk) ichunkaccess).b(entity); -@@ -1029,10 +1193,33 @@ +@@ -1029,10 +1195,33 @@ this.everyoneSleeping(); } @@ -494,7 +496,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); -@@ -1041,6 +1228,12 @@ +@@ -1041,6 +1230,12 @@ double d1 = (double) blockposition.getY() - entityplayer.locY(); double d2 = (double) blockposition.getZ() - entityplayer.locZ(); @@ -507,7 +509,7 @@ if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { entityplayer.playerConnection.sendPacket(new PacketPlayOutBlockBreakAnimation(i, blockposition, j)); } -@@ -1079,7 +1272,18 @@ +@@ -1079,7 +1274,18 @@ Iterator iterator = this.navigators.iterator(); while (iterator.hasNext()) { @@ -527,7 +529,7 @@ if (!navigationabstract.i()) { navigationabstract.b(blockposition); -@@ -1101,10 +1305,20 @@ +@@ -1101,10 +1307,20 @@ @Override public Explosion createExplosion(@Nullable Entity entity, @Nullable DamageSource damagesource, @Nullable ExplosionDamageCalculator explosiondamagecalculator, double d0, double d1, double d2, float f, boolean flag, Explosion.Effect explosion_effect) { @@ -548,7 +550,7 @@ if (explosion_effect == Explosion.Effect.NONE) { explosion.clearBlocks(); } -@@ -1169,13 +1383,20 @@ +@@ -1169,13 +1385,20 @@ } public int a(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { @@ -571,7 +573,7 @@ ++j; } } -@@ -1217,7 +1438,7 @@ +@@ -1217,7 +1440,7 @@ @Nullable public BlockPosition a(StructureGenerator structuregenerator, BlockPosition blockposition, int i, boolean flag) { @@ -580,7 +582,7 @@ } @Nullable -@@ -1255,7 +1476,13 @@ +@@ -1255,7 +1478,13 @@ @Override public WorldMap a(String s) { return (WorldMap) this.getMinecraftServer().E().getWorldPersistentData().b(() -> { @@ -595,7 +597,7 @@ }, s); } -@@ -1386,9 +1613,9 @@ +@@ -1386,9 +1615,9 @@ reputationhandler.a(reputationevent, entity); } @@ -607,7 +609,7 @@ Throwable throwable = null; try { -@@ -1432,7 +1659,7 @@ +@@ -1432,7 +1661,7 @@ CrashReport crashreport = new CrashReport("Level dump", new Exception("dummy")); this.a(crashreport); @@ -616,7 +618,7 @@ Throwable throwable3 = null; try { -@@ -1455,8 +1682,8 @@ +@@ -1455,8 +1684,8 @@ } @@ -627,7 +629,7 @@ Throwable throwable6 = null; try { -@@ -1479,8 +1706,8 @@ +@@ -1479,8 +1708,8 @@ } @@ -638,7 +640,7 @@ Throwable throwable9 = null; try { -@@ -1503,8 +1730,8 @@ +@@ -1503,8 +1732,8 @@ } @@ -649,7 +651,7 @@ Throwable throwable12 = null; try { -@@ -1566,6 +1793,11 @@ +@@ -1566,6 +1795,11 @@ @Override public void update(BlockPosition blockposition, Block block) { if (!this.isDebugWorld()) { @@ -661,7 +663,7 @@ this.applyPhysics(blockposition, block); } -@@ -1580,12 +1812,12 @@ +@@ -1580,12 +1814,12 @@ } public boolean isFlatWorld() { @@ -676,7 +678,7 @@ } @Nullable -@@ -1605,9 +1837,9 @@ +@@ -1605,9 +1839,9 @@ @VisibleForTesting public String F() { @@ -688,7 +690,7 @@ return IRegistry.BLOCK_ENTITY_TYPE.getKey(tileentity.getTileType()); }), this.getBlockTickList().a(), this.getFluidTickList().a(), this.P()); } -@@ -1615,7 +1847,7 @@ +@@ -1615,7 +1849,7 @@ private static String a(Collection collection, Function function) { try { Object2IntOpenHashMap object2intopenhashmap = new Object2IntOpenHashMap(); @@ -697,7 +699,7 @@ while (iterator.hasNext()) { T t0 = iterator.next(); -@@ -1624,7 +1856,8 @@ +@@ -1624,7 +1858,8 @@ object2intopenhashmap.addTo(minecraftkey, 1); } @@ -707,7 +709,7 @@ return it_unimi_dsi_fastutil_objects_object2intmap_entry.getKey() + ":" + it_unimi_dsi_fastutil_objects_object2intmap_entry.getIntValue(); }).collect(Collectors.joining(",")); } catch (Exception exception) { -@@ -1633,16 +1866,32 @@ +@@ -1633,16 +1868,32 @@ } public static void a(WorldServer worldserver) {