mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-26 12:36:07 +01:00
improve implementation of chunk access patch
This commit is contained in:
parent
c0e1410682
commit
081420d738
@ -1,4 +1,4 @@
|
||||
From 90e134ecf1742e7882e0b1d9a0fea51236fd0317 Mon Sep 17 00:00:00 2001
|
||||
From 2abc0d00312f85e3dcef3520fc9cb106ae4bad3b Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Thu, 27 Aug 2015 01:15:02 -0400
|
||||
Subject: [PATCH] Optimize Chunk Access
|
||||
@ -29,10 +29,10 @@ index ac35cf4..6e3d17b 100644
|
||||
|
||||
for (int k = 0; k < this.entitySlices.length; ++k) {
|
||||
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
index f5a2580..f31ffe2 100644
|
||||
index f5a2580..5ec5bf6 100644
|
||||
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
@@ -24,7 +24,18 @@ public class ChunkProviderServer implements IChunkProvider {
|
||||
@@ -24,7 +24,26 @@ public class ChunkProviderServer implements IChunkProvider {
|
||||
public final ChunkUnloadQueue unloadQueue = new ChunkUnloadQueue(); // CraftBukkit - LongHashSet // Paper -> ChunkUnloadQueue
|
||||
public final ChunkGenerator chunkGenerator; // CraftBukkit - public
|
||||
private final IChunkLoader chunkLoader;
|
||||
@ -47,68 +47,19 @@ index f5a2580..f31ffe2 100644
|
||||
+ }
|
||||
+ return lastChunkByPos = super.get(key);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public Chunk remove(long key) {
|
||||
+ if (lastChunkByPos != null && key == lastChunkByPos.chunkKey) {
|
||||
+ lastChunkByPos = null;
|
||||
+ }
|
||||
+ return super.remove(key);
|
||||
+ }
|
||||
+ }; // CraftBukkit
|
||||
+ // Paper end
|
||||
// private final LongHashMap<Chunk> chunks = new LongHashMap();
|
||||
// private final List<Chunk> chunkList = Lists.newArrayList();
|
||||
public final WorldServer world;
|
||||
@@ -53,6 +64,7 @@ public class ChunkProviderServer implements IChunkProvider {
|
||||
|
||||
Chunk c = chunks.get(LongHash.toLong(i, j));
|
||||
if (c != null) {
|
||||
+ world.testResetChunkCache(c); // Paper
|
||||
c.mustSave = true;
|
||||
}
|
||||
// CraftBukkit end
|
||||
@@ -328,6 +340,7 @@ public class ChunkProviderServer implements IChunkProvider {
|
||||
chunk.removeEntities();
|
||||
this.saveChunk(chunk);
|
||||
this.saveChunkNOP(chunk);
|
||||
+ world.testResetChunkCache(chunk); // Paper
|
||||
this.chunks.remove(chunkcoordinates); // CraftBukkit
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index 0a3cfbc..825e931 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -156,6 +156,12 @@ public abstract class World implements IBlockAccess {
|
||||
public Chunk getChunkIfLoaded(BlockPosition blockposition) {
|
||||
return this.chunkProvider.getLoadedChunkAt(blockposition.getX() >> 4, blockposition.getZ() >> 4);
|
||||
}
|
||||
+
|
||||
+ public void testResetChunkCache(Chunk chunk) {
|
||||
+ if (chunk == ((ChunkProviderServer) chunkProvider).lastChunkByPos) {
|
||||
+ ((ChunkProviderServer) chunkProvider).lastChunkByPos = null;
|
||||
+ }
|
||||
+ }
|
||||
// Paper end
|
||||
|
||||
public Chunk getChunkIfLoaded(int x, int z) {
|
||||
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
index 47dbea8..b859c51 100644
|
||||
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
@@ -203,6 +203,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
||||
// CraftBukkit end
|
||||
|
||||
public void doTick() {
|
||||
+ ((ChunkProviderServer) chunkProvider).lastChunkByPos = null; // Paper
|
||||
super.doTick();
|
||||
if (this.getWorldData().isHardcore() && this.getDifficulty() != EnumDifficulty.HARD) {
|
||||
this.getWorldData().setDifficulty(EnumDifficulty.HARD);
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
index c81dfee..ec62b1f 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
@@ -224,6 +224,7 @@ public class CraftWorld implements World {
|
||||
|
||||
world.getChunkProviderServer().unloadQueue.remove(x, z);
|
||||
world.getChunkProviderServer().chunks.remove(LongHash.toLong(x, z));
|
||||
+ world.testResetChunkCache(chunk); // Paper
|
||||
|
||||
// Update neighbor counts
|
||||
for (int xx = -2; xx < 3; xx++) {
|
||||
--
|
||||
2.8.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From d5b3a0eaf851f658b423b98f759603d1c8ed763f Mon Sep 17 00:00:00 2001
|
||||
From b42d5a8bb9526ec8f77411eea0076b7e30e2c8b7 Mon Sep 17 00:00:00 2001
|
||||
From: Zach Brown <zach.brown@destroystokyo.com>
|
||||
Date: Tue, 22 Mar 2016 12:04:28 -0500
|
||||
Subject: [PATCH] Configurable spawn chances for skeleton horses
|
||||
@ -19,10 +19,10 @@ index 26c1b72..55b211e 100644
|
||||
+ }
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
index b859c51..fd1150b 100644
|
||||
index 47dbea8..0acce3e 100644
|
||||
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
@@ -429,7 +429,10 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
||||
@@ -428,7 +428,10 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
||||
if (this.isRainingAt(blockposition)) {
|
||||
DifficultyDamageScaler difficultydamagescaler = this.D(blockposition);
|
||||
|
||||
@ -35,5 +35,5 @@ index b859c51..fd1150b 100644
|
||||
|
||||
entityhorse.setType(EnumHorseType.SKELETON);
|
||||
--
|
||||
2.7.4
|
||||
2.8.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 551294f564c0fa74d282ee54ad8efea388161f38 Mon Sep 17 00:00:00 2001
|
||||
From 3adef9813ff8d283b34b7c5ec9a2b47e8f72cc79 Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Tue, 22 Mar 2016 23:41:34 -0400
|
||||
Subject: [PATCH] Optimize isValidLocation for inlining
|
||||
@ -22,10 +22,10 @@ index c5b6a34..17bbfb0 100644
|
||||
|
||||
public BaseBlockPosition(int i, int j, int k) {
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index 825e931..b5406e9 100644
|
||||
index c1cb133..1a9a847 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -284,8 +284,8 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -278,8 +278,8 @@ public abstract class World implements IBlockAccess {
|
||||
return this.getType(blockposition1);
|
||||
}
|
||||
|
||||
@ -36,7 +36,7 @@ index 825e931..b5406e9 100644
|
||||
}
|
||||
|
||||
public boolean isEmpty(BlockPosition blockposition) {
|
||||
@@ -297,7 +297,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -291,7 +291,7 @@ public abstract class World implements IBlockAccess {
|
||||
}
|
||||
|
||||
public boolean a(BlockPosition blockposition, boolean flag) {
|
||||
@ -45,7 +45,7 @@ index 825e931..b5406e9 100644
|
||||
}
|
||||
|
||||
public boolean areChunksLoaded(BlockPosition blockposition, int i) {
|
||||
@@ -377,7 +377,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -371,7 +371,7 @@ public abstract class World implements IBlockAccess {
|
||||
return true;
|
||||
}
|
||||
// CraftBukkit end
|
||||
@ -54,7 +54,7 @@ index 825e931..b5406e9 100644
|
||||
return false;
|
||||
} else if (!this.isClientSide && this.worldData.getType() == WorldType.DEBUG_ALL_BLOCK_STATES) {
|
||||
return false;
|
||||
@@ -655,7 +655,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -649,7 +649,7 @@ public abstract class World implements IBlockAccess {
|
||||
// Paper start - test if meets light level, return faster
|
||||
// logic copied from below
|
||||
public boolean isLightLevel(BlockPosition blockposition, int level) {
|
||||
@ -63,7 +63,7 @@ index 825e931..b5406e9 100644
|
||||
if (this.getType(blockposition).f()) {
|
||||
if (this.c(blockposition.up(), false) >= level) {
|
||||
return true;
|
||||
@@ -768,7 +768,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -762,7 +762,7 @@ public abstract class World implements IBlockAccess {
|
||||
blockposition = new BlockPosition(blockposition.getX(), 0, blockposition.getZ());
|
||||
}
|
||||
|
||||
@ -72,7 +72,7 @@ index 825e931..b5406e9 100644
|
||||
return enumskyblock.c;
|
||||
} else if (!this.isLoaded(blockposition)) {
|
||||
return enumskyblock.c;
|
||||
@@ -780,7 +780,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -774,7 +774,7 @@ public abstract class World implements IBlockAccess {
|
||||
}
|
||||
|
||||
public void a(EnumSkyBlock enumskyblock, BlockPosition blockposition, int i) {
|
||||
@ -81,7 +81,7 @@ index 825e931..b5406e9 100644
|
||||
if (this.isLoaded(blockposition)) {
|
||||
Chunk chunk = this.getChunkAtWorldCoords(blockposition);
|
||||
|
||||
@@ -816,7 +816,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -810,7 +810,7 @@ public abstract class World implements IBlockAccess {
|
||||
// CraftBukkit end
|
||||
Chunk chunk = this.getChunkIfLoaded(blockposition);
|
||||
if (chunk != null) {
|
||||
@ -90,7 +90,7 @@ index 825e931..b5406e9 100644
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -834,7 +834,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -828,7 +828,7 @@ public abstract class World implements IBlockAccess {
|
||||
}
|
||||
}
|
||||
// CraftBukkit end
|
||||
@ -99,7 +99,7 @@ index 825e931..b5406e9 100644
|
||||
return Blocks.AIR.getBlockData();
|
||||
} else {
|
||||
Chunk chunk = this.getChunkAtWorldCoords(blockposition);
|
||||
@@ -2063,7 +2063,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -2057,7 +2057,7 @@ public abstract class World implements IBlockAccess {
|
||||
public Map<BlockPosition, TileEntity> capturedTileEntities = Maps.newHashMap();
|
||||
|
||||
public TileEntity getTileEntity(BlockPosition blockposition) {
|
||||
@ -108,7 +108,7 @@ index 825e931..b5406e9 100644
|
||||
return null;
|
||||
} else {
|
||||
// CraftBukkit start
|
||||
@@ -2166,7 +2166,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -2160,7 +2160,7 @@ public abstract class World implements IBlockAccess {
|
||||
}
|
||||
|
||||
public boolean d(BlockPosition blockposition, boolean flag) {
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 7624eaca661b3e694061922c8117852adae8f5be Mon Sep 17 00:00:00 2001
|
||||
From 89d4f6537a88b323c9072af629b4a54d6fe54db6 Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Mon, 28 Mar 2016 19:55:45 -0400
|
||||
Subject: [PATCH] Option to disable BlockPhysicsEvent for Redstone
|
||||
@ -25,10 +25,10 @@ index 55b211e..d6b8f72 100644
|
||||
+ }
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index b5406e9..fcd7cd6 100644
|
||||
index 1a9a847..c6463b2 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -574,7 +574,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -568,7 +568,7 @@ public abstract class World implements IBlockAccess {
|
||||
try {
|
||||
// CraftBukkit start
|
||||
CraftWorld world = ((WorldServer) this).getWorld();
|
||||
@ -38,7 +38,7 @@ index b5406e9..fcd7cd6 100644
|
||||
this.getServer().getPluginManager().callEvent(event);
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
index fd1150b..f170d7a 100644
|
||||
index 0acce3e..c8e536c 100644
|
||||
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
||||
@@ -32,6 +32,7 @@ import org.bukkit.event.weather.LightningStrikeEvent;
|
||||
@ -49,7 +49,7 @@ index fd1150b..f170d7a 100644
|
||||
private final MinecraftServer server;
|
||||
public EntityTracker tracker;
|
||||
private final PlayerChunkMap manager;
|
||||
@@ -742,6 +743,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
||||
@@ -741,6 +742,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
||||
|
||||
if (iblockdata.getMaterial() != Material.AIR && Block.a(iblockdata.getBlock(), nextticklistentry.a())) {
|
||||
try {
|
||||
@ -57,7 +57,7 @@ index fd1150b..f170d7a 100644
|
||||
iblockdata.getBlock().b((World) this, nextticklistentry.a, iblockdata, this.random);
|
||||
} catch (Throwable throwable) {
|
||||
CrashReport crashreport = CrashReport.a(throwable, "Exception while ticking a block");
|
||||
@@ -749,7 +751,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
||||
@@ -748,7 +750,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
||||
|
||||
CrashReportSystemDetails.a(crashreportsystemdetails, nextticklistentry.a, iblockdata);
|
||||
throw new ReportedException(crashreport);
|
||||
@ -67,5 +67,5 @@ index fd1150b..f170d7a 100644
|
||||
timing.stopTiming(); // Paper
|
||||
} else {
|
||||
--
|
||||
2.7.4
|
||||
2.8.0
|
||||
|
||||
|
@ -1,14 +1,14 @@
|
||||
From 9cfb72beaff0ebaa90f24e86e409410a268d565c Mon Sep 17 00:00:00 2001
|
||||
From 86c09e0420200254be71440c724732e4af463d59 Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Mon, 28 Mar 2016 20:32:58 -0400
|
||||
Subject: [PATCH] Entity AddTo/RemoveFrom World Events
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index fcd7cd6..fa84bad 100644
|
||||
index c6463b2..d5ba601 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -1119,6 +1119,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -1113,6 +1113,7 @@ public abstract class World implements IBlockAccess {
|
||||
}
|
||||
|
||||
entity.valid = true; // CraftBukkit
|
||||
@ -16,7 +16,7 @@ index fcd7cd6..fa84bad 100644
|
||||
}
|
||||
|
||||
protected void c(Entity entity) {
|
||||
@@ -1126,6 +1127,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -1120,6 +1121,7 @@ public abstract class World implements IBlockAccess {
|
||||
((IWorldAccess) this.u.get(i)).b(entity);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 26605472c71f3844ee15539ee80f49d6234ce140 Mon Sep 17 00:00:00 2001
|
||||
From c56be574082969f54bed8a2553ebb2ff7d5ce052 Mon Sep 17 00:00:00 2001
|
||||
From: Aikar <aikar@aikar.co>
|
||||
Date: Thu, 31 Mar 2016 19:17:58 -0400
|
||||
Subject: [PATCH] Do not load chunks for light checks
|
||||
@ -7,10 +7,10 @@ Should only happen for blocks on the edge that uses neighbors light level
|
||||
(certain blocks). In that case, there will be 3-4 other neighbors to get a light level from.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||||
index fa84bad..89103d6 100644
|
||||
index d5ba601..ea187f9 100644
|
||||
--- a/src/main/java/net/minecraft/server/World.java
|
||||
+++ b/src/main/java/net/minecraft/server/World.java
|
||||
@@ -723,6 +723,7 @@ public abstract class World implements IBlockAccess {
|
||||
@@ -717,6 +717,7 @@ public abstract class World implements IBlockAccess {
|
||||
if (blockposition.getY() >= 256) {
|
||||
blockposition = new BlockPosition(blockposition.getX(), 255, blockposition.getZ());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user