Yatopia/patches/server/0032-Use-block-distance-in-portal-search-radius.patch

57 lines
3.1 KiB
Diff
Raw Normal View History

2020-08-11 21:29:06 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Patrick Hemmer <patrick.hemmer@gmail.com>
Date: Tue, 11 Aug 2020 22:11:53 +0300
Subject: [PATCH] Use block distance in portal search radius
Original author: Patrick Hemmer <patrick.hemmer@gmail.com>
Previously when searching for a portal, the server would use the search radius to determine which chunks it needs to search, and then would
consider any portal within those chunks as a match, even if it is outside the search radius.
This changes it so that the portal list is filtered to only include portals within the configured search radius (ignoring the Y coordinate).
Ported to Yatopia and added per world config option by MrIvanPlays <ivan@mrivanplays.com>
diff --git a/src/main/java/de/minebench/origami/OrigamiConfig.java b/src/main/java/de/minebench/origami/OrigamiConfig.java
index 4794197d2dd3f81d2b8405f22dabe8519af9cc40..dfb7a053ed0e64734a0c227c566109074321dddd 100644
2020-08-11 21:29:06 +02:00
--- a/src/main/java/de/minebench/origami/OrigamiConfig.java
+++ b/src/main/java/de/minebench/origami/OrigamiConfig.java
@@ -171,6 +171,11 @@ public final class OrigamiConfig {
2020-08-11 21:29:06 +02:00
&& pillagerCollisions && ironGolemCollisions && miscCollisions && itemCollisions
&& waterCreatureCollisions && waterAmbientCollisions;
}
+
+ public boolean useBlockDistanceInPortalSearchRadius = false;
+ private void useBlockDistanceInPortalSearchRadius() {
+ useBlockDistanceInPortalSearchRadius = getBoolean("use-block-distance-in-portal-search-radius", false);
+ }
// Yatopia end
}
diff --git a/src/main/java/net/minecraft/server/PortalTravelAgent.java b/src/main/java/net/minecraft/server/PortalTravelAgent.java
index 5dce3c862166783e1fc479cd4ecce8b80daa90b2..eb33c274182ec3cdde5d35e028617357c1355782 100644
2020-08-11 21:29:06 +02:00
--- a/src/main/java/net/minecraft/server/PortalTravelAgent.java
+++ b/src/main/java/net/minecraft/server/PortalTravelAgent.java
@@ -30,12 +30,22 @@ public class PortalTravelAgent {
return villageplacerecord.f().getY();
});
java.util.List<VillagePlaceRecord> list = villageplace.b(type -> type == VillagePlaceType.v, blockposition, i, VillagePlace.Occupancy.ANY).collect(java.util.stream.Collectors.toList());
2020-08-11 21:29:06 +02:00
+ // Yatopia start - fix portal bug
+ if (world.origamiConfig.useBlockDistanceInPortalSearchRadius) {
+ list.removeIf(villagePlaceRecord -> {
+ BlockPosition portalPosition = villagePlaceRecord.getPosition();
+ return Math.abs(portalPosition.getX() - blockposition.getX()) > i
+ || Math.abs(portalPosition.getZ() - blockposition.getZ()) > i;
2020-08-11 21:29:06 +02:00
+ });
+ }
+ if (!list.isEmpty()) {
for (VillagePlaceRecord villagePlaceRecord : list) {
if (!seen || comparator.compare(villagePlaceRecord, best) < 0) {
seen = true;
2020-08-11 21:29:06 +02:00
best = villagePlaceRecord;
}
}
+ } // Yatopia end
Optional<VillagePlaceRecord> optional = seen ? Optional.of(best) : Optional.empty();
return optional.map((villageplacerecord) -> {