Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-11-17 05:20:05 +01:00
Regenerate and refresh chunk methods
Dieser Commit ist enthalten in:
Ursprung
528b9b2e09
Commit
03a5bbc612
@ -21,8 +21,8 @@ import org.bukkit.event.world.ChunkUnloadEvent;
|
|||||||
|
|
||||||
public class ChunkProviderServer implements IChunkProvider {
|
public class ChunkProviderServer implements IChunkProvider {
|
||||||
public LongHashset a = new LongHashset(); // CraftBukkit
|
public LongHashset a = new LongHashset(); // CraftBukkit
|
||||||
private Chunk b;
|
public Chunk b; // CraftBukkit
|
||||||
private IChunkProvider c;
|
public IChunkProvider c; // CraftBukkit
|
||||||
private IChunkLoader d;
|
private IChunkLoader d;
|
||||||
public LongHashtable<Chunk> e = new LongHashtable<Chunk>(); // CraftBukkit
|
public LongHashtable<Chunk> e = new LongHashtable<Chunk>(); // CraftBukkit
|
||||||
public List f = new ArrayList(); // CraftBukkit
|
public List f = new ArrayList(); // CraftBukkit
|
||||||
|
@ -149,6 +149,48 @@ public class CraftWorld implements World {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean regenerateChunk(int x, int z) {
|
||||||
|
unloadChunk(x, z, false, false);
|
||||||
|
|
||||||
|
provider.a.remove(x, z);
|
||||||
|
|
||||||
|
net.minecraft.server.Chunk chunk = null;
|
||||||
|
|
||||||
|
if(provider.c == null) {
|
||||||
|
chunk = provider.b;
|
||||||
|
} else {
|
||||||
|
chunk = provider.c.b(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
chunkLoadPostProcess(chunk, x, z);
|
||||||
|
|
||||||
|
refreshChunk(x, z);
|
||||||
|
|
||||||
|
return chunk != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean refreshChunk(int x, int z) {
|
||||||
|
if(!isChunkLoaded(x, z)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int px = x<<4;
|
||||||
|
int pz = z<<4;
|
||||||
|
|
||||||
|
// If there are more than 10 updates to a chunk at once, it carries out the update as a cuboid
|
||||||
|
// This flags 16 blocks in a line along the bottom for update and then flags a block at the opposite corner at the top
|
||||||
|
// The cuboid that contains these 17 blocks covers the entire chunk
|
||||||
|
// The server will compress the chunk and send it to all clients
|
||||||
|
|
||||||
|
for(int xx = px; xx < (px + 16); xx++) {
|
||||||
|
world.g(xx, 0, pz);
|
||||||
|
}
|
||||||
|
world.g(px, 127, pz+15);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean isChunkInUse(int x, int z) {
|
public boolean isChunkInUse(int x, int z) {
|
||||||
Player[] players = server.getOnlinePlayers();
|
Player[] players = server.getOnlinePlayers();
|
||||||
|
|
||||||
@ -180,33 +222,37 @@ public class CraftWorld implements World {
|
|||||||
if (chunk == null) {
|
if (chunk == null) {
|
||||||
chunk = provider.e(x, z);
|
chunk = provider.e(x, z);
|
||||||
|
|
||||||
if (chunk != null) {
|
chunkLoadPostProcess(chunk, x, z);
|
||||||
provider.e.put(x, z, chunk);
|
|
||||||
provider.f.add(chunk);
|
|
||||||
|
|
||||||
chunk.c();
|
|
||||||
chunk.d();
|
|
||||||
|
|
||||||
if (!chunk.n && provider.a(x + 1, z + 1) && provider.a(x, z + 1) && provider.a(x + 1, z)) {
|
|
||||||
provider.a(provider, x, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (provider.a(x - 1, z) && !provider.b(x - 1, z).n && provider.a(x - 1, z + 1) && provider.a(x, z + 1) && provider.a(x - 1, z)) {
|
|
||||||
provider.a(provider, x - 1, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (provider.a(x, z - 1) && !provider.b(x, z - 1).n && provider.a(x + 1, z - 1) && provider.a(x, z - 1) && provider.a(x + 1, z)) {
|
|
||||||
provider.a(provider, x, z - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (provider.a(x - 1, z - 1) && !provider.b(x - 1, z - 1).n && provider.a(x - 1, z - 1) && provider.a(x, z - 1) && provider.a(x - 1, z)) {
|
|
||||||
provider.a(provider, x - 1, z - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return chunk != null;
|
return chunk != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void chunkLoadPostProcess(net.minecraft.server.Chunk chunk, int x, int z) {
|
||||||
|
if (chunk != null) {
|
||||||
|
provider.e.put(x, z, chunk);
|
||||||
|
provider.f.add(chunk);
|
||||||
|
|
||||||
|
chunk.c();
|
||||||
|
chunk.d();
|
||||||
|
|
||||||
|
if (!chunk.n && provider.a(x + 1, z + 1) && provider.a(x, z + 1) && provider.a(x + 1, z)) {
|
||||||
|
provider.a(provider, x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (provider.a(x - 1, z) && !provider.b(x - 1, z).n && provider.a(x - 1, z + 1) && provider.a(x, z + 1) && provider.a(x - 1, z)) {
|
||||||
|
provider.a(provider, x - 1, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (provider.a(x, z - 1) && !provider.b(x, z - 1).n && provider.a(x + 1, z - 1) && provider.a(x, z - 1) && provider.a(x + 1, z)) {
|
||||||
|
provider.a(provider, x, z - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (provider.a(x - 1, z - 1) && !provider.b(x - 1, z - 1).n && provider.a(x - 1, z - 1) && provider.a(x, z - 1) && provider.a(x - 1, z)) {
|
||||||
|
provider.a(provider, x - 1, z - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isChunkLoaded(Chunk chunk) {
|
public boolean isChunkLoaded(Chunk chunk) {
|
||||||
return isChunkLoaded(chunk.getX(), chunk.getZ());
|
return isChunkLoaded(chunk.getX(), chunk.getZ());
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren