Yatopia/patches/server/0063-Replace-some-hot-streams.patch
Ivan Pekov 22da8648e3
Ensure Chunk.getEntitySlices is not used in code
Use Chunk.getAsSlices instead to save some cpu time.
getEntitySlices needs to be kept like that to ensure some plugins working properly, otherwise we'd have server owners crying
2020-10-18 19:30:29 +03:00

387 lines
19 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ivan Pekov <ivan@mrivanplays.com>
Date: Wed, 7 Oct 2020 17:38:05 +0300
Subject: [PATCH] Replace some hot streams
diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
index 30d4589c9cdad11809fc09cb51235d6da8e03195..bf7d5394a59186aa516497e8eaae8e5000db6a62 100644
--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
+++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
@@ -430,9 +430,20 @@ public class ChunkRegionLoader {
for (int i = -1; i < 17; ++i) { // Paper - conflict on loop parameter change
int finalI = i; // CraftBukkit - decompile errors
+ // Yatopia start - replace stream
+ /*
ChunkSection chunksection = (ChunkSection) Arrays.stream(achunksection).filter((chunksection1) -> {
return chunksection1 != null && chunksection1.getYPosition() >> 4 == finalI; // CraftBukkit - decompile errors
}).findFirst().orElse(Chunk.a);
+ */
+ ChunkSection chunksection = Chunk.EMPTY_CHUNK_SECTION;
+ for (ChunkSection section : achunksection) {
+ if (section != null && section.getYPosition() >> 4 == i) {
+ chunksection = section;
+ break;
+ }
+ }
+ // Yatopia end
// Paper start - async chunk save for unload
NibbleArray nibblearray; // block light
NibbleArray nibblearray1; // sky light
@@ -728,6 +739,8 @@ public class ChunkRegionLoader {
while (iterator.hasNext()) {
String s = (String) iterator.next();
+ // Yatopia start - replace stream
+ /*
map.put(StructureGenerator.a.get(s.toLowerCase(Locale.ROOT)), new LongOpenHashSet(Arrays.stream(nbttagcompound1.getLongArray(s)).filter((i) -> {
ChunkCoordIntPair chunkcoordintpair1 = new ChunkCoordIntPair(i);
@@ -738,6 +751,22 @@ public class ChunkRegionLoader {
return true;
}
}).toArray()));
+ */
+ long[] longArray = nbttagcompound1.getLongArray(s);
+ LongSet set = new LongOpenHashSet();
+ for (long value : longArray) {
+ // got from ChunkCoordIntPair
+ // avoid creating additional object
+ int x = (int) value;
+ int z = (int) (value >> 32);
+ if (Math.max(Math.abs(x - chunkcoordintpair.x), Math.abs(z - chunkcoordintpair.z)) > 8) {
+ ChunkRegionLoader.LOGGER.warn("Found invalid structure reference [ {} @ {} ] for chunk {}. ", s, "[" + x + ", " + z + "]", chunkcoordintpair);
+ } else {
+ set.add(value);
+ }
+ }
+ map.put(StructureGenerator.a.get(s.toLowerCase(Locale.ROOT)), set);
+ // Yatopia end
}
return map;
diff --git a/src/main/java/net/minecraft/server/DefinedStructure.java b/src/main/java/net/minecraft/server/DefinedStructure.java
index 8974d7944f159b9346680c639daf0f8c06767cfe..bd610bfcd9571d7478ed13a0c35bc959cab07f0f 100644
--- a/src/main/java/net/minecraft/server/DefinedStructure.java
+++ b/src/main/java/net/minecraft/server/DefinedStructure.java
@@ -811,9 +811,18 @@ public class DefinedStructure {
public List<DefinedStructure.BlockInfo> a(Block block) {
return (List) this.b.computeIfAbsent(block, (block1) -> {
+ // Yatopia start - replace stream
+ /*
return (List) this.a.stream().filter((definedstructure_blockinfo) -> {
return definedstructure_blockinfo.b.a(block1);
}).collect(Collectors.toList());
+ */
+ List<DefinedStructure.BlockInfo> ret = new net.yatopia.server.list.GlueList<>();
+ for (BlockInfo info : a) {
+ if (info.b.isBlock(block1)) { ret.add(info); }
+ }
+ return ret;
+ // Yatopia end
});
}
}
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 3be9be2df7623ec1068f5782261d70fb34b2aa54..2f5bc2bde2f1231781b3738de57b4f9acc6113df 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -2529,6 +2529,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
return this.world.getScoreboard().getPlayerTeam(this.getName());
}
+ public final boolean isAlly(Entity entity) { return r(entity); } // Yatopia - OBFHELPER
public boolean r(Entity entity) {
return this.a(entity.getScoreboardTeam());
}
diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java
index a60bb54270b98bad9cc8caa9ce2538f54b03fbfe..3b9ba7c012586c7620e69cf450b8d1c1fee3b215 100644
--- a/src/main/java/net/minecraft/server/EntityPigZombie.java
+++ b/src/main/java/net/minecraft/server/EntityPigZombie.java
@@ -101,6 +101,8 @@ public class EntityPigZombie extends EntityZombie implements IEntityAngerable {
double d0 = this.b(GenericAttributes.FOLLOW_RANGE);
AxisAlignedBB axisalignedbb = AxisAlignedBB.a(this.getPositionVector()).grow(d0, 10.0D, d0);
+ // Yatopia start - replace stream
+ /*
this.world.b(EntityPigZombie.class, axisalignedbb).stream().filter((entitypigzombie) -> {
return entitypigzombie != this;
}).filter((entitypigzombie) -> {
@@ -110,6 +112,13 @@ public class EntityPigZombie extends EntityZombie implements IEntityAngerable {
}).forEach((entitypigzombie) -> {
entitypigzombie.setGoalTarget(this.getGoalTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit
});
+ */
+ for (EntityPigZombie zombie : world.b(EntityPigZombie.class, axisalignedbb)) {
+ if (zombie != this && zombie.getGoalTarget() == null && !zombie.isAlly(getGoalTarget())) {
+ zombie.setGoalTarget(getGoalTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true);
+ }
+ }
+ // Yatopia end
}
private void fa() {
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index b43b02c0bdd5dbf0b7d30de90bdc2f74c015ecc8..b113d60408bcb77762587109ede7dc855d983254 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -761,11 +761,20 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
private void eV() {
AxisAlignedBB axisalignedbb = (new AxisAlignedBB(this.getChunkCoordinates())).grow(32.0D, 10.0D, 32.0D);
+ // Yatopia start - replace stream
+ /*
this.world.b(EntityInsentient.class, axisalignedbb).stream().filter((entityinsentient) -> {
return entityinsentient instanceof IEntityAngerable;
}).forEach((entityinsentient) -> {
((IEntityAngerable) entityinsentient).b(this);
});
+ */
+ for (EntityInsentient insentient : world.b(EntityInsentient.class, axisalignedbb)) {
+ if (insentient instanceof IEntityAngerable) {
+ insentient.b(this);
+ }
+ }
+ // Yatopia end
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
index 939ef3bd6439a68dba4224661d050c6af0164178..ab3348a89b6864184d432e4a73fe02ac195b8629 100644
--- a/src/main/java/net/minecraft/server/EntityVillager.java
+++ b/src/main/java/net/minecraft/server/EntityVillager.java
@@ -678,11 +678,20 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
if (optional.isPresent()) {
WorldServer worldserver = (WorldServer) this.world;
+ // Yatopia start - replace stream
+ /*
((List) optional.get()).stream().filter((entityliving) -> {
return entityliving instanceof ReputationHandler;
}).forEach((entityliving) -> {
worldserver.a(ReputationEvent.d, entity, (ReputationHandler) entityliving);
});
+ */
+ for (EntityLiving livingEntity : optional.get()) {
+ if (livingEntity instanceof ReputationHandler) {
+ worldserver.a(ReputationEvent.d, entity, (ReputationHandler) livingEntity);
+ }
+ }
+ // Yatopia end
}
}
}
diff --git a/src/main/java/net/minecraft/server/InventorySubcontainer.java b/src/main/java/net/minecraft/server/InventorySubcontainer.java
index db5def8b1d4179a64b28366339a3634af593cd5e..8627fb85f5f8b3309caf681eede4c3455bdc618c 100644
--- a/src/main/java/net/minecraft/server/InventorySubcontainer.java
+++ b/src/main/java/net/minecraft/server/InventorySubcontainer.java
@@ -90,9 +90,19 @@ public class InventorySubcontainer implements IInventory, AutoRecipeOutput {
}
public List<ItemStack> f() {
+ // Yatopia start - replace stream
+ /*
List<ItemStack> list = (List) this.items.stream().filter((itemstack) -> {
return !itemstack.isEmpty();
}).collect(Collectors.toList());
+ */
+ List<ItemStack> list = new net.yatopia.server.list.GlueList<>();
+ for (ItemStack item : items) {
+ if (!item.isEmpty()) {
+ list.add(item);
+ }
+ }
+ // Yatopia end
this.clear();
return list;
diff --git a/src/main/java/net/minecraft/server/LootTable.java b/src/main/java/net/minecraft/server/LootTable.java
index 9922c8b2a7fbb55cfb8b9cea9545c9ec0a0dcbf8..0e8c52f64dd3ffe5e9510227cc6cbaf5b38a5e87 100644
--- a/src/main/java/net/minecraft/server/LootTable.java
+++ b/src/main/java/net/minecraft/server/LootTable.java
@@ -85,7 +85,7 @@ public class LootTable {
}
public List<ItemStack> populateLoot(LootTableInfo loottableinfo) {
- List<ItemStack> list = Lists.newArrayList();
+ List<ItemStack> list = new net.yatopia.server.list.GlueList<>(); // Yatopia
this.populateLoot(loottableinfo, list::add);
return list;
@@ -122,7 +122,15 @@ public class LootTable {
if (event.isCancelled()) {
return;
}
+ // Yatopia start - replace stream
+ /*
list = event.getLoot().stream().map(CraftItemStack::asNMSCopy).collect(Collectors.toList());
+ */
+ list = new net.yatopia.server.list.GlueList<>();
+ for (org.bukkit.inventory.ItemStack bukkitItem : event.getLoot()) {
+ list.add(CraftItemStack.asNMSCopy(bukkitItem));
+ }
+ // Yatopia end
// CraftBukkit end
List<Integer> list1 = this.a(iinventory, random);
diff --git a/src/main/java/net/minecraft/server/PiglinAI.java b/src/main/java/net/minecraft/server/PiglinAI.java
index 0407fa1751d89a037da8cb01f5ceef9b9833dd18..a4e98b11e4ce4a4c9f3aa0986b7b2018b1f24f33 100644
--- a/src/main/java/net/minecraft/server/PiglinAI.java
+++ b/src/main/java/net/minecraft/server/PiglinAI.java
@@ -359,6 +359,8 @@ public class PiglinAI {
public static void a(EntityHuman entityhuman, boolean flag) {
List<EntityPiglinAbstract> list = entityhuman.world.a(EntityPiglin.class, entityhuman.getBoundingBox().g(16.0D)); // CraftBukkit - decompile error
+ // Yatopia start - replace stream
+ /*
list.stream().filter(PiglinAI::d).filter((entitypiglin) -> {
return !flag || BehaviorUtil.c(entitypiglin, entityhuman);
}).forEach((entitypiglin) -> {
@@ -369,6 +371,17 @@ public class PiglinAI {
}
});
+ */
+ for (EntityPiglinAbstract piglinAbstract : list) {
+ if (PiglinAI.d(piglinAbstract) && (!flag || BehaviorUtil.c(piglinAbstract, entityhuman))) {
+ if (piglinAbstract.world.getGameRules().getBoolean(GameRules.UNIVERSAL_ANGER)) {
+ d(piglinAbstract, entityhuman);
+ } else {
+ c(piglinAbstract, entityhuman);
+ }
+ }
+ }
+ // Yatopia end
}
public static EnumInteractionResult a(EntityPiglin entitypiglin, EntityHuman entityhuman, EnumHand enumhand) {
diff --git a/src/main/java/net/minecraft/server/Raid.java b/src/main/java/net/minecraft/server/Raid.java
index 89464cc770b4875ad65c5e84315e462689cea57b..ed13f8fe725ce7601e5c506b590042cedbac7b54 100644
--- a/src/main/java/net/minecraft/server/Raid.java
+++ b/src/main/java/net/minecraft/server/Raid.java
@@ -794,7 +794,16 @@ public class Raid {
// CraftBukkit start - a method to get all raiders
public java.util.Collection<EntityRaider> getRaiders() {
+ // Yatopia start - replace stream
+ /*
return this.raiders.values().stream().flatMap(Set::stream).collect(java.util.stream.Collectors.toSet());
+ */
+ java.util.List<EntityRaider> ret = new net.yatopia.server.list.GlueList<>();
+ for (Set<EntityRaider> raid : raiders.values()) {
+ ret.addAll(raid);
+ }
+ return ret;
+ // Yatopia end
}
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index b739e19cb50e4f86f1cb100b88cf91fbbbf796b4..e41f0ae32f66e5bf3b5ca1e10be2293f945bb5b1 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -60,11 +60,11 @@ public class WorldServer extends World implements GeneratorAccessSeed {
public final Int2ObjectMap<Entity> entitiesById = new Int2ObjectLinkedOpenHashMap(); final com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<Entity> entitiesForIteration = new com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<>(2048, 0.5f, 2048, 0.2, true); // Tuinity - make removing entities while ticking safe
private final Map<UUID, Entity> entitiesByUUID = Maps.newHashMap();
private final Queue<Entity> entitiesToAdd = Queues.newArrayDeque();
- public final List<EntityPlayer> players = Lists.newArrayList(); // Paper - private -> public
+ public final List<EntityPlayer> players = new net.yatopia.server.list.GlueList<>(); // Paper - private -> public // Yatopia
public final ChunkProviderServer chunkProvider; // Paper - public
boolean tickingEntities;
// Paper start
- List<java.lang.Runnable> afterEntityTickingTasks = Lists.newArrayList();
+ List<java.lang.Runnable> afterEntityTickingTasks = new net.yatopia.server.list.GlueList<>(); // Yatopia
public void doIfNotEntityTicking(java.lang.Runnable run) {
if (tickingEntities) {
afterEntityTickingTasks.add(run);
@@ -828,6 +828,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
// */
// Yatopia start
+ boolean sleepyMatch = true;
for (EntityPlayer player : players) {
if (player.world == this) {
player.tickWeather();
@@ -835,6 +836,11 @@ public class WorldServer extends World implements GeneratorAccessSeed {
player.updateWeather(this.lastRainLevel, this.rainLevel, this.lastThunderLevel, this.thunderLevel);
// Yatopia end
}
+ // Yatopia start
+ if (sleepyMatch && !player.isSpectator() && !player.isDeeplySleeping() && !player.fauxSleeping) {
+ sleepyMatch = false;
+ }
+ // Yatopia end
}
/* // Yatopia start - moved up
@@ -854,9 +860,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
// CraftBukkit end
*/ // Yatopia end
- if (this.everyoneSleeping && this.players.stream().noneMatch((entityplayer) -> {
- return !entityplayer.isSpectator() && !entityplayer.isDeeplySleeping() && !entityplayer.fauxSleeping; // CraftBukkit
- })) {
+ if (this.everyoneSleeping && sleepyMatch) { // Yatopia
// CraftBukkit start
long l = this.worldData.getDayTime() + 24000L;
TimeSkipEvent event = new TimeSkipEvent(this.getWorld(), TimeSkipEvent.SkipReason.NIGHT_SKIP, (l - l % 24000L) - this.getDayTime());
@@ -1026,9 +1030,9 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
private void wakeupPlayers() {
- (this.players.stream().filter(EntityLiving::isSleeping).collect(Collectors.toList())).forEach((entityplayer) -> { // CraftBukkit - decompile error
+ for (EntityPlayer entityplayer : players) { if (entityplayer.isSleeping()) { // Yatopia
entityplayer.wakeup(false, false);
- });
+ }} // Yatopia
}
// Paper start - optimise random block ticking
@@ -1794,8 +1798,9 @@ public class WorldServer extends World implements GeneratorAccessSeed {
// Spigot start
if ( entity instanceof EntityHuman )
{
- this.getMinecraftServer().worldServer.values().stream().map( WorldServer::getWorldPersistentData ).forEach( (worldData) ->
+ for ( WorldServer worldServer : getMinecraftServer().worldServer.values() ) // Yatopia
{
+ WorldPersistentData worldData = worldServer.getWorldPersistentData(); // Yatopia
for (Object o : worldData.data.values() )
{
if ( o instanceof WorldMap )
@@ -1812,7 +1817,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
}
}
- } );
+ } // Yatopia
}
// Spigot end
// Spigot Start
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRaid.java b/src/main/java/org/bukkit/craftbukkit/CraftRaid.java
index 360a4901f5159a3f0606214f1abf2f8cee2ecbe1..450a64396f8fe167bc0accb7fdfcfeebb16351ac 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftRaid.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftRaid.java
@@ -91,11 +91,20 @@ public final class CraftRaid implements Raid {
@Override
public List<Raider> getRaiders() {
+ // Yatopia start - replace stream
+ /*
return handle.getRaiders().stream().map(new Function<EntityRaider, Raider>() {
@Override
public Raider apply(EntityRaider entityRaider) {
return (Raider) entityRaider.getBukkitEntity();
}
}).collect(ImmutableList.toImmutableList());
+ */
+ List<Raider> ret = new net.yatopia.server.list.GlueList<>();
+ for (EntityRaider raider : handle.getRaiders()) {
+ ret.add((Raider) raider.getBukkitEntity());
+ }
+ return Collections.unmodifiableList(ret);
+ // Yatopia end
}
}