mirror of
https://github.com/PaperMC/Paper.git
synced 2025-08-09 16:42:03 -07:00
bouquet o' patches
This commit is contained in:
@@ -16,9 +16,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
if (throwable instanceof TimeoutException) {
|
if (throwable instanceof TimeoutException) {
|
||||||
Connection.LOGGER.debug("Timeout", throwable);
|
Connection.LOGGER.debug("Timeout", throwable);
|
||||||
+ if (player != null) player.quitReason = org.bukkit.event.player.PlayerQuitEvent.QuitReason.TIMED_OUT; // Paper
|
+ if (player != null) player.quitReason = org.bukkit.event.player.PlayerQuitEvent.QuitReason.TIMED_OUT; // Paper
|
||||||
this.disconnect(new TranslatableComponent("disconnect.timeout"));
|
this.disconnect(Component.translatable("disconnect.timeout"));
|
||||||
} else {
|
} else {
|
||||||
TranslatableComponent chatmessage = new TranslatableComponent("disconnect.genericReason", new Object[]{"Internal Exception: " + throwable});
|
MutableComponent ichatmutablecomponent = Component.translatable("disconnect.genericReason", "Internal Exception: " + throwable);
|
||||||
|
|
||||||
+ if (player != null) player.quitReason = org.bukkit.event.player.PlayerQuitEvent.QuitReason.ERRONEOUS_STATE; // Paper
|
+ if (player != null) player.quitReason = org.bukkit.event.player.PlayerQuitEvent.QuitReason.ERRONEOUS_STATE; // Paper
|
||||||
if (flag) {
|
if (flag) {
|
||||||
@@ -34,8 +34,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> cachedSingleHashSet; // Paper
|
public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> cachedSingleHashSet; // Paper
|
||||||
+ public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event
|
+ public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event
|
||||||
|
|
||||||
public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) {
|
public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile, @Nullable ProfilePublicKey publicKey) {
|
||||||
super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile);
|
super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile, publicKey);
|
||||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
@@ -29,7 +29,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
--- a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
|
--- a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
|
||||||
+++ b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
|
+++ b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
|
||||||
@@ -0,0 +0,0 @@ public class MerchantOffer {
|
@@ -0,0 +0,0 @@ public class MerchantOffer {
|
||||||
public int demand; // PAIL private -> public
|
public int demand;
|
||||||
public float priceMultiplier;
|
public float priceMultiplier;
|
||||||
public int xp;
|
public int xp;
|
||||||
+ public boolean ignoreDiscounts; // Paper
|
+ public boolean ignoreDiscounts; // Paper
|
@@ -21,4 +21,4 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ // Paper end
|
+ // Paper end
|
||||||
campfire.items.set(i, ItemStack.EMPTY);
|
campfire.items.set(i, ItemStack.EMPTY);
|
||||||
world.sendBlockUpdated(pos, state, state, 3);
|
world.sendBlockUpdated(pos, state, state, 3);
|
||||||
}
|
world.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(state));
|
@@ -21,21 +21,22 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
--- a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java
|
--- a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java
|
||||||
+++ b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java
|
+++ b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java
|
||||||
@@ -0,0 +0,0 @@ public class PathFinder {
|
@@ -0,0 +0,0 @@ public class PathFinder {
|
||||||
this.openSet.clear();
|
if (node == null) {
|
||||||
this.nodeEvaluator.prepare(world, mob);
|
return null;
|
||||||
Node node = this.nodeEvaluator.getStart();
|
} else {
|
||||||
- Map<Target, BlockPos> map = positions.stream().collect(Collectors.toMap((pos) -> {
|
- Map<Target, BlockPos> map = positions.stream().collect(Collectors.toMap((pos) -> {
|
||||||
- return this.nodeEvaluator.getGoal((double)pos.getX(), (double)pos.getY(), (double)pos.getZ());
|
- return this.nodeEvaluator.getGoal((double)pos.getX(), (double)pos.getY(), (double)pos.getZ());
|
||||||
- }, Function.identity()));
|
- }, Function.identity()));
|
||||||
+ // Paper start - remove streams - and optimize collection
|
+ // Paper start - remove streams - and optimize collection
|
||||||
+ List<Map.Entry<Target, BlockPos>> map = Lists.newArrayList();
|
+ List<Map.Entry<Target, BlockPos>> map = Lists.newArrayList();
|
||||||
+ for (BlockPos blockPos : positions) {
|
+ for (BlockPos pos : positions) {
|
||||||
+ map.add(new java.util.AbstractMap.SimpleEntry<>(this.nodeEvaluator.getGoal(blockPos.getX(), blockPos.getY(), blockPos.getZ()), blockPos));
|
+ map.add(new java.util.AbstractMap.SimpleEntry<>(this.nodeEvaluator.getGoal(pos.getX(), pos.getY(), pos.getZ()), pos));
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end
|
+ // Paper end
|
||||||
Path path = this.findPath(world.getProfiler(), node, map, followRange, distance, rangeMultiplier);
|
Path path = this.findPath(world.getProfiler(), node, map, followRange, distance, rangeMultiplier);
|
||||||
this.nodeEvaluator.done();
|
this.nodeEvaluator.done();
|
||||||
return path;
|
return path;
|
||||||
|
@@ -0,0 +0,0 @@ public class PathFinder {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -45,7 +46,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
profiler.push("find_path");
|
profiler.push("find_path");
|
||||||
profiler.markForCharting(MetricCategory.PATH_FINDING);
|
profiler.markForCharting(MetricCategory.PATH_FINDING);
|
||||||
- Set<Target> set = positions.keySet();
|
- Set<Target> set = positions.keySet();
|
||||||
+ //Set<Target> set = positions.keySet();
|
+ // Set<Target> set = positions.keySet();
|
||||||
startNode.g = 0.0F;
|
startNode.g = 0.0F;
|
||||||
- startNode.h = this.getBestH(startNode, set);
|
- startNode.h = this.getBestH(startNode, set);
|
||||||
+ startNode.h = this.getBestH(startNode, positions); // Paper - optimize collection
|
+ startNode.h = this.getBestH(startNode, positions); // Paper - optimize collection
|
||||||
@@ -53,7 +54,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
this.openSet.clear();
|
this.openSet.clear();
|
||||||
this.openSet.insert(startNode);
|
this.openSet.insert(startNode);
|
||||||
- Set<Node> set2 = ImmutableSet.of();
|
- Set<Node> set2 = ImmutableSet.of();
|
||||||
+ //Set<Node> set2 = ImmutableSet.of(); // Paper - unused - diff on change
|
+ // Set<Node> set2 = ImmutableSet.of(); // Paper - unused - diff on change
|
||||||
int i = 0;
|
int i = 0;
|
||||||
- Set<Target> set3 = Sets.newHashSetWithExpectedSize(set.size());
|
- Set<Target> set3 = Sets.newHashSetWithExpectedSize(set.size());
|
||||||
+ List<Map.Entry<Target, BlockPos>> entryList = Lists.newArrayListWithExpectedSize(positions.size()); // Paper - optimize collection
|
+ List<Map.Entry<Target, BlockPos>> entryList = Lists.newArrayListWithExpectedSize(positions.size()); // Paper - optimize collection
|
||||||
@@ -95,8 +96,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- Optional<Path> optional = !set3.isEmpty() ? set3.stream().map((target) -> {
|
- Optional<Path> optional = !set3.isEmpty() ? set3.stream().map((node) -> {
|
||||||
- return this.reconstructPath(target.getBestNode(), positions.get(target), true);
|
- return this.reconstructPath(node.getBestNode(), positions.get(node), true);
|
||||||
- }).min(Comparator.comparingInt(Path::getNodeCount)) : set.stream().map((target) -> {
|
- }).min(Comparator.comparingInt(Path::getNodeCount)) : set.stream().map((target) -> {
|
||||||
- return this.reconstructPath(target.getBestNode(), positions.get(target), false);
|
- return this.reconstructPath(target.getBestNode(), positions.get(target), false);
|
||||||
- }).min(Comparator.comparingDouble(Path::getDistToTarget).thenComparingInt(Path::getNodeCount));
|
- }).min(Comparator.comparingDouble(Path::getDistToTarget).thenComparingInt(Path::getNodeCount));
|
||||||
@@ -116,6 +117,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ // Paper end
|
+ // Paper end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected float distance(Node a, Node b) {
|
||||||
|
return a.distanceTo(b);
|
||||||
|
}
|
||||||
|
|
||||||
- private float getBestH(Node node, Set<Target> targets) {
|
- private float getBestH(Node node, Set<Target> targets) {
|
||||||
+ private float getBestH(Node node, List<Map.Entry<Target, BlockPos>> targets) { // Paper - optimize collection - Set<Target> -> List<Map.Entry<Target, BlockPos>>
|
+ private float getBestH(Node node, List<Map.Entry<Target, BlockPos>> targets) { // Paper - optimize collection - Set<Target> -> List<Map.Entry<Target, BlockPos>>
|
||||||
float f = Float.MAX_VALUE;
|
float f = Float.MAX_VALUE;
|
@@ -1,65 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
|
||||||
Date: Tue, 8 Dec 2020 20:24:52 -0600
|
|
||||||
Subject: [PATCH] MC-4: Fix item position desync
|
|
||||||
|
|
||||||
This fixes item position desync (MC-4) by running the item coordinates
|
|
||||||
through the encode/decode methods of the packet that causes the precision
|
|
||||||
loss, which forces the server to lose the same precision as the client
|
|
||||||
keeping them in sync.
|
|
||||||
|
|
||||||
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
||||||
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
||||||
@@ -0,0 +0,0 @@ public class PaperConfig {
|
|
||||||
trackPluginScoreboards = getBoolean("settings.track-plugin-scoreboards", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ public static boolean fixEntityPositionDesync = true;
|
|
||||||
+ private static void fixEntityPositionDesync() {
|
|
||||||
+ fixEntityPositionDesync = getBoolean("settings.fix-entity-position-desync", fixEntityPositionDesync);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
public static void registerCommands() {
|
|
||||||
for (Map.Entry<String, Command> entry : commands.entrySet()) {
|
|
||||||
MinecraftServer.getServer().server.getCommandMap().register(entry.getKey(), "Paper", entry.getValue());
|
|
||||||
diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundMoveEntityPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundMoveEntityPacket.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundMoveEntityPacket.java
|
|
||||||
+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundMoveEntityPacket.java
|
|
||||||
@@ -0,0 +0,0 @@ public abstract class ClientboundMoveEntityPacket implements Packet<ClientGamePa
|
|
||||||
protected final boolean hasPos;
|
|
||||||
|
|
||||||
public static long entityToPacket(double coord) {
|
|
||||||
- return Mth.lfloor(coord * 4096.0D);
|
|
||||||
+ return Mth.lfloor(coord * 4096.0D); // Paper - check ItemEntity#setPosRaw on update
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double packetToEntity(long coord) {
|
|
||||||
- return (double)coord / 4096.0D;
|
|
||||||
+ return (double)coord / 4096.0D; // Paper - check ItemEntity#setPosRaw on update
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vec3 updateEntityPosition(Vec3 orig) {
|
|
||||||
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 {
|
|
||||||
}
|
|
||||||
public final void setPosRaw(double x, double y, double z, boolean forceBoundingBoxUpdate) {
|
|
||||||
// Paper end
|
|
||||||
+ // Paper start - fix MC-4
|
|
||||||
+ if (this instanceof ItemEntity) {
|
|
||||||
+ if (com.destroystokyo.paper.PaperConfig.fixEntityPositionDesync) {
|
|
||||||
+ // encode/decode from PacketPlayOutEntity
|
|
||||||
+ x = Mth.lfloor(x * 4096.0D) * (1 / 4096.0D);
|
|
||||||
+ y = Mth.lfloor(y * 4096.0D) * (1 / 4096.0D);
|
|
||||||
+ z = Mth.lfloor(z * 4096.0D) * (1 / 4096.0D);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ // Paper end - fix MC-4
|
|
||||||
if (this.position.x != x || this.position.y != y || this.position.z != z) {
|
|
||||||
this.position = new Vec3(x, y, z);
|
|
||||||
int i = Mth.floor(x);
|
|
@@ -1,63 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: SuperCoder7979 <25208576+SuperCoder7979@users.noreply.github.com>
|
|
||||||
Date: Tue, 3 Nov 2020 23:48:05 -0600
|
|
||||||
Subject: [PATCH] Significantly improve performance of the end generation
|
|
||||||
|
|
||||||
This patch implements a noise cache for the end which significantly reduces the computation time of generation. This results in about a 3x improvement.
|
|
||||||
|
|
||||||
Original code by SuperCoder7979 and Gegy in Lithium, licensed under LGPL-3.0 (Source: https://github.com/jellysquid3/lithium-fabric)
|
|
||||||
|
|
||||||
Co-authored-by: Gegy <gegy1000@gmail.com>
|
|
||||||
Co-authored-by: Dylan Xaldin <Puremin0rez515@gmail.com>
|
|
||||||
Co-authored-by: pop4959 <pop4959@gmail.com>
|
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/world/level/biome/TheEndBiomeSource.java b/src/main/java/net/minecraft/world/level/biome/TheEndBiomeSource.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/world/level/biome/TheEndBiomeSource.java
|
|
||||||
+++ b/src/main/java/net/minecraft/world/level/biome/TheEndBiomeSource.java
|
|
||||||
@@ -0,0 +0,0 @@ public class TheEndBiomeSource extends BiomeSource {
|
|
||||||
private final Holder<Biome> midlands;
|
|
||||||
private final Holder<Biome> islands;
|
|
||||||
private final Holder<Biome> barrens;
|
|
||||||
+ // Paper start
|
|
||||||
+ private static final class NoiseCache {
|
|
||||||
+ public long[] keys = new long[8192];
|
|
||||||
+ public float[] values = new float[8192];
|
|
||||||
+ public NoiseCache() {
|
|
||||||
+ java.util.Arrays.fill(keys, Long.MIN_VALUE);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ private static final ThreadLocal<java.util.Map<SimplexNoise, NoiseCache>> noiseCache = ThreadLocal.withInitial(java.util.WeakHashMap::new);
|
|
||||||
+ // Paper end
|
|
||||||
|
|
||||||
public TheEndBiomeSource(Registry<Biome> biomeRegistry, long seed) {
|
|
||||||
this(seed, biomeRegistry.getOrCreateHolder(Biomes.THE_END), biomeRegistry.getOrCreateHolder(Biomes.END_HIGHLANDS), biomeRegistry.getOrCreateHolder(Biomes.END_MIDLANDS), biomeRegistry.getOrCreateHolder(Biomes.SMALL_END_ISLANDS), biomeRegistry.getOrCreateHolder(Biomes.END_BARRENS));
|
|
||||||
@@ -0,0 +0,0 @@ public class TheEndBiomeSource extends BiomeSource {
|
|
||||||
float f = 100.0F - Mth.sqrt((long) i * (long) i + (long) j * (long) j) * 8.0F; // Paper - cast ints to long to avoid integer overflow
|
|
||||||
f = Mth.clamp(f, -100.0F, 80.0F);
|
|
||||||
|
|
||||||
+ NoiseCache cache = noiseCache.get().computeIfAbsent(simplexNoise, noiseKey -> new NoiseCache()); // Paper
|
|
||||||
for(int o = -12; o <= 12; ++o) {
|
|
||||||
for(int p = -12; p <= 12; ++p) {
|
|
||||||
long q = (long)(k + o);
|
|
||||||
long r = (long)(l + p);
|
|
||||||
- if (q * q + r * r > 4096L && simplexNoise.getValue((double)q, (double)r) < (double)-0.9F) {
|
|
||||||
- float g = (Mth.abs((float)q) * 3439.0F + Mth.abs((float)r) * 147.0F) % 13.0F + 9.0F;
|
|
||||||
+ // Paper start - Significantly improve end generation performance by using a noise cache
|
|
||||||
+ long key = net.minecraft.world.level.ChunkPos.asLong((int) q, (int) r);
|
|
||||||
+ int index = (int) it.unimi.dsi.fastutil.HashCommon.mix(key) & 8191;
|
|
||||||
+ float g = Float.MIN_VALUE;
|
|
||||||
+ if (cache.keys[index] == key) {
|
|
||||||
+ g = cache.values[index];
|
|
||||||
+ } else {
|
|
||||||
+ if (q * q + r * r > 4096L && simplexNoise.getValue((double)q, (double)r) < (double)-0.9F) {
|
|
||||||
+ g = (Mth.abs((float) q) * 3439.0F + Mth.abs((float) r) * 147.0F) % 13.0F + 9.0F;
|
|
||||||
+ }
|
|
||||||
+ cache.keys[index] = key;
|
|
||||||
+ cache.values[index] = g;
|
|
||||||
+ }
|
|
||||||
+ if (g != Float.MIN_VALUE) {
|
|
||||||
+ // Paper end
|
|
||||||
float h = (float)(m - o * 2);
|
|
||||||
float s = (float)(n - p * 2);
|
|
||||||
float t = 100.0F - Mth.sqrt(h * h + s * s) * g;
|
|
Reference in New Issue
Block a user