Files
AkarinMC/patches/server/0023-Tuinity-Util-patch.patch
ㄗㄠˋ ㄑㄧˊ 1b66f4548e Tuinity View distance api
Based on my Tuinity fork: caf081984d
2020-04-18 20:01:29 +08:00

243 lines
14 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=84=97=E3=84=A0=CB=8B=20=E3=84=91=E3=84=A7=CB=8A?=
<tsao-chi@the-lingo.org>
Date: Sat, 18 Apr 2020 19:54:01 +0800
Subject: [PATCH] Tuinity Util patch
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
index 1119dd5048cbb8cdd5727e18b154ed15a9a06b63..6a2a6e671f230fd6a8adb5e6ccec22dede740f44 100644
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
@@ -683,11 +683,10 @@ public class ChunkProviderServer extends IChunkProvider {
EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values();
// Paper start - per player mob spawning
int[] worldMobCount;
- if (this.playerChunkMap.playerMobDistanceMap != null) {
+ // Tuinity start - use view distance map
+ if (this.world.paperConfig.perPlayerMobSpawns) {
// update distance map
- this.world.timings.playerMobDistanceMapUpdate.startTiming();
- this.playerChunkMap.playerMobDistanceMap.update(this.world.players, this.playerChunkMap.viewDistance);
- this.world.timings.playerMobDistanceMapUpdate.stopTiming();
+ // Tuinity end - use view distance map
// re-set mob counts
for (EntityPlayer player : this.world.players) {
Arrays.fill(player.mobCounts, 0);
@@ -770,9 +769,23 @@ public class ChunkProviderServer extends IChunkProvider {
if (this.world.paperConfig.perPlayerMobSpawns) {
int minDiff = Integer.MAX_VALUE;
- for (EntityPlayer entityplayer : this.playerChunkMap.playerMobDistanceMap.getPlayersInRange(chunk.getPos())) {
+ // Tuinity start - use view distance map
+ com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<EntityPlayer> players = this.playerChunkMap.playerViewDistanceMap.getObjectsInRange(chunk.coordinateKey);
+ if (players != null) {
+ Object[] backingSet = players.getBackingSet();
+ for (int index = 0, len = backingSet.length; index < len; ++index) {
+ Object temp = backingSet[index];
+ if (!(temp instanceof EntityPlayer)) {
+ continue;
+ }
+ EntityPlayer entityplayer = (EntityPlayer)temp;
+ if (entityplayer.isSpectator() || !entityplayer.affectsSpawning) {
+ continue;
+ }
+ // Tuinity end - use view distance map
minDiff = Math.min(limit - this.playerChunkMap.getMobCountNear(entityplayer, enumcreaturetype), minDiff);
}
+ } // Tuinity - use view distance map
difference = (minDiff == Integer.MAX_VALUE) ? 0 : minDiff;
}
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index b4c3dffaff5ea64d9189304c5e84c515bf40ed65..ec2f66ef0cc56229078dacad61cd6ab3a5c6cb11 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -110,6 +110,10 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<EntityPlayer> cachedSingleHashSet; // Paper
+ // Tuinity start
+ public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<EntityPlayer> cachedSingleHashSetTuinity;
+ // Tuinity end
+
public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) {
super((World) worldserver, gameprofile);
playerinteractmanager.player = this;
@@ -128,6 +132,9 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
this.canPickUpLoot = true;
this.maxHealthCache = this.getMaxHealth();
this.cachedSingleMobDistanceMap = new com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper
+ // Tuinity start
+ this.cachedSingleHashSetTuinity = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<>(this);
+ // Tuinity end
}
// Yes, this doesn't match Vanilla, but it's the best we can do for now.
diff --git a/src/main/java/net/minecraft/server/HeightMap.java b/src/main/java/net/minecraft/server/HeightMap.java
index 29cb545a864dea09ba52b6071f5280cdddd33808..37a6da9ee9aab7acaf2f1559917e415217444747 100644
--- a/src/main/java/net/minecraft/server/HeightMap.java
+++ b/src/main/java/net/minecraft/server/HeightMap.java
@@ -119,6 +119,7 @@ public class HeightMap {
}
}
+ public final int get(int x, int z) { return this.a(x, z); } // Tuinity - OBFHELPER
public int a(int i, int j) {
return this.a(c(i, j));
}
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
index 7b7e1b2b45dcfe55c4052dacdcc2ca629ca4521b..2acdb72d7ee4bba043f8b083a2ed6c2ec1a5111d 100644
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
@@ -81,7 +81,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
public final Int2ObjectMap<PlayerChunkMap.EntityTracker> trackedEntities;
private final Queue<Runnable> z;
int viewDistance; // Paper - private -> package private
- public final com.destroystokyo.paper.util.PlayerMobDistanceMap playerMobDistanceMap; // Paper
+ //public final com.destroystokyo.paper.util.PlayerMobDistanceMap playerMobDistanceMap; // Paper // Tuinity - replaced by view distance map
// CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback()
public final CallbackExecutor callbackExecutor = new CallbackExecutor();
@@ -136,6 +136,29 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
// Paper end
+ // Tuinity start - distance maps
+ final com.destroystokyo.paper.util.misc.PooledLinkedHashSets<EntityPlayer> pooledEntityPlayerSets = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets<>();
+ public final com.destroystokyo.paper.util.misc.PlayerAreaMap playerViewDistanceMap;
+
+ void addPlayerToDistanceMapsTuinity(EntityPlayer player) {
+ this.updateMapsTuinity(player);
+ }
+
+ void removePlayerFromDistanceMapsTuinity(EntityPlayer player) {
+ this.playerViewDistanceMap.remove(player);
+ }
+
+ void updateDistanceMapsTuinity(EntityPlayer player) {
+ this.updateMapsTuinity(player);
+ }
+
+ private void updateMapsTuinity(EntityPlayer player) {
+ int chunkX = net.minecraft.server.MCUtil.getChunkCoordinate(player.locX());
+ int chunkZ = net.minecraft.server.MCUtil.getChunkCoordinate(player.locZ());
+
+ this.playerViewDistanceMap.update(player, chunkX, chunkZ, this.viewDistance);
+ }
+ // Tuinity end
// Paper start - Reduce entity tracker updates on move
private double trackerUpdateDistanceSquared;
@@ -201,8 +224,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
this.l = supplier;
this.m = new VillagePlace(new File(this.w, "poi"), datafixer, this.world); // Paper
this.setViewDistance(i);
- this.playerMobDistanceMap = this.world.paperConfig.perPlayerMobSpawns ? new com.destroystokyo.paper.util.PlayerMobDistanceMap() : null; // Paper
+ //this.playerMobDistanceMap = this.world.paperConfig.perPlayerMobSpawns ? new com.destroystokyo.paper.util.PlayerMobDistanceMap() : null; // Paper // Tuinity - distance maps
this.trackerUpdateDistanceSquared = Math.pow(this.world.paperConfig.trackerUpdateDistance, 2); // Paper
+ // Tuinity start - distance maps
+ com.destroystokyo.paper.util.misc.PooledLinkedHashSets<EntityPlayer> sets = this.pooledEntityPlayerSets;
+ this.playerViewDistanceMap = new com.destroystokyo.paper.util.misc.PlayerAreaMap(sets);
+ // Tuinity end - distance maps
}
public void updatePlayerMobTypeMap(Entity entity) {
@@ -213,9 +240,23 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
int chunkZ = (int)Math.floor(entity.locZ()) >> 4;
int index = entity.getEntityType().getEnumCreatureType().ordinal();
- for (EntityPlayer player : this.playerMobDistanceMap.getPlayersInRange(chunkX, chunkZ)) {
+ // Tuinity start - use view distance map
+ com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<EntityPlayer> players = this.playerViewDistanceMap.getObjectsInRange(chunkX, chunkZ);
+ if (players != null) {
+ Object[] backingSet = players.getBackingSet();
+ for (int i = 0, len = backingSet.length; i < len; ++i) {
+ Object temp = backingSet[i];
+ if (!(temp instanceof EntityPlayer)) {
+ continue;
+ }
+ EntityPlayer player = (EntityPlayer)temp;
+ if (player.isSpectator() || !player.affectsSpawning) {
+ continue;
+ }
+ // Tuinity end - use view distance map
++player.mobCounts[index];
}
+ } // Tuinity - use view distance map
}
public int getMobCountNear(EntityPlayer entityPlayer, EnumCreatureType enumCreatureType) {
@@ -1545,7 +1586,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
this.updateMaps(entityplayer); // Paper - distance maps
-
+ this.updateDistanceMapsTuinity(entityplayer); // Tuinity - distance maps
}
@Override
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 75605d44bc4c051a7afa327a8749a0a67790b165..7129cb0260316e166b4b15cded0e0c0b32433b7f 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -1214,9 +1214,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
int k = MathHelper.floor((axisalignedbb.minZ - 2.0D) / 16.0D);
int l = MathHelper.floor((axisalignedbb.maxZ + 2.0D) / 16.0D);
+ ChunkProviderServer chunkProvider = ((ChunkProviderServer)this.chunkProvider); // Tuinity - optimize for loaded chunks
+
for (int i1 = i; i1 <= j; ++i1) {
for (int j1 = k; j1 <= l; ++j1) {
- Chunk chunk = (Chunk)this.getChunkIfLoadedImmediately(i1, j1); // Paper
+ Chunk chunk = chunkProvider.getChunkAtIfLoadedMainThread(i1, j1); // Paper // Tuinity - optimize for loaded chunks
if (chunk != null) {
chunk.a(entity, axisalignedbb, list, predicate);
@@ -1235,9 +1237,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
int l = MathHelper.f((axisalignedbb.maxZ + 2.0D) / 16.0D);
List<T> list = Lists.newArrayList();
+ ChunkProviderServer chunkProvider = ((ChunkProviderServer)this.chunkProvider); // Tuinity - optimize for loaded chunks
+
for (int i1 = i; i1 < j; ++i1) {
for (int j1 = k; j1 < l; ++j1) {
- Chunk chunk = (Chunk)this.getChunkIfLoadedImmediately(i1, j1); // Paper
+ Chunk chunk = chunkProvider.getChunkAtIfLoadedMainThread(i1, j1); // Paper // Tuinity - optimize for loaded chunks
if (chunk != null) {
chunk.a(entitytypes, axisalignedbb, list, predicate);
@@ -1257,10 +1261,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
int l = MathHelper.f((axisalignedbb.maxZ + 2.0D) / 16.0D);
List<T> list = Lists.newArrayList();
IChunkProvider ichunkprovider = this.getChunkProvider();
+ ChunkProviderServer chunkProvider = ((ChunkProviderServer)this.chunkProvider); // Tuinity - optimize for loaded chunks
for (int i1 = i; i1 < j; ++i1) {
for (int j1 = k; j1 < l; ++j1) {
- Chunk chunk = (Chunk)this.getChunkIfLoadedImmediately(i1, j1); // Paper
+ Chunk chunk = chunkProvider.getChunkAtIfLoadedMainThread(i1, j1); // Paper // Tuinity - optimize for loaded chunks
if (chunk != null) {
chunk.a(oclass, axisalignedbb, list, predicate);
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 78fdacdaf119b9c3fab477ee98089bbad5da2d73..4d080d74dc949ea93ce34aa1906144740b9c99f6 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -1227,6 +1227,7 @@ public class WorldServer extends World {
this.registerEntity(entityplayer);
this.getChunkProvider().playerChunkMap.addPlayerToDistanceMaps(entityplayer); // Paper - distance maps
+ this.getChunkProvider().playerChunkMap.addPlayerToDistanceMapsTuinity(entityplayer); // Tuinity - distance maps
}
// CraftBukkit start
@@ -1438,6 +1439,7 @@ public class WorldServer extends World {
this.players.remove(entityplayer);
this.getChunkProvider().playerChunkMap.removePlayerFromDistanceMaps(entityplayer); // Paper - distance maps
+ this.getChunkProvider().playerChunkMap.removePlayerFromDistanceMapsTuinity(entityplayer); // Tuinity - distance maps
}
this.getScoreboard().a(entity);