From 6a9023862cc0d244e56fb086b3a848dd722cf5cf Mon Sep 17 00:00:00 2001
From: Andrew Steinborn <git@steinborn.me>
Date: Thu, 12 Aug 2021 22:55:41 +0000
Subject: [PATCH] Optimize indirect passenger iteration (#6366)

---
 ...ptimize-indirect-passenger-iteration.patch | 52 +++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100644 patches/server/Optimize-indirect-passenger-iteration.patch

diff --git a/patches/server/Optimize-indirect-passenger-iteration.patch b/patches/server/Optimize-indirect-passenger-iteration.patch
new file mode 100644
index 0000000000..f3e5508474
--- /dev/null
+++ b/patches/server/Optimize-indirect-passenger-iteration.patch
@@ -0,0 +1,52 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Andrew Steinborn <git@steinborn.me>
+Date: Mon, 9 Aug 2021 00:38:37 -0400
+Subject: [PATCH] Optimize indirect passenger iteration
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n
+     }
+ 
+     private Stream<Entity> getIndirectPassengersStream() {
++        if (this.passengers.isEmpty()) { return Stream.of(); } // Paper
+         return ImmutableList.copyOf(this.passengers).stream().flatMap(Entity::getSelfAndPassengers); // Paper
+     }
+ 
+     @Override
+     public Stream<Entity> getSelfAndPassengers() {
++        if (this.passengers.isEmpty()) { return Stream.of(this); } // Paper
+         return Stream.concat(Stream.of(this), this.getIndirectPassengersStream());
+     }
+ 
+     @Override
+     public Stream<Entity> getPassengersAndSelf() {
++        if (this.passengers.isEmpty()) { return Stream.of(this); } // Paper
+         return Stream.concat(this.passengers.stream().flatMap(Entity::getPassengersAndSelf), Stream.of(this));
+     }
+ 
+     public Iterable<Entity> getIndirectPassengers() {
++        // Paper start - rewrite this method
++        if (this.passengers.isEmpty()) { return ImmutableList.of(); }
++        ImmutableList.Builder<Entity> indirectPassengers = ImmutableList.builder();
++        for (Entity passenger : this.passengers) {
++            indirectPassengers.add(passenger);
++            indirectPassengers.addAll(passenger.getIndirectPassengers());
++        }
++        return indirectPassengers.build();
++    }
++    private Iterable<Entity> getIndirectPassengers_old() {
++        // Paper end
+         return () -> {
+             return this.getIndirectPassengersStream().iterator();
+         };
+     }
+ 
+     public boolean hasExactlyOnePlayerPassenger() {
++        if (this.passengers.isEmpty()) { return false; } // Paper
+         return this.getIndirectPassengersStream().filter((entity) -> {
+             return entity instanceof Player;
+         }).count() == 1L;