diff --git a/patches/server/0035-Don-t-save-fireworks.patch b/patches/server/0035-Don-t-save-fireworks.patch index a84da1c..e4a5b83 100644 --- a/patches/server/0035-Don-t-save-fireworks.patch +++ b/patches/server/0035-Don-t-save-fireworks.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Etil <81570777+etil2jz@users.noreply.github.com> -Date: Fri, 10 Dec 2021 22:00:25 +0100 +Date: Fri, 10 Dec 2021 22:50:17 +0100 Subject: [PATCH] Don't save Fireworks Original code by Starlis, licensed under GNU General Public License v3.0 diff --git a/patches/server/0042-Mitigate-ConcurrentModificationException-by-copying-.patch b/patches/server/0042-Mitigate-ConcurrentModificationException-by-copying-.patch new file mode 100644 index 0000000..ae3bc69 --- /dev/null +++ b/patches/server/0042-Mitigate-ConcurrentModificationException-by-copying-.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Fri, 10 Dec 2021 22:46:37 +0100 +Subject: [PATCH] Mitigate ConcurrentModificationException by copying + entitySection access + +Original code by Starlis, licensed under GNU General Public License v3.0 +You can find the original code on https://github.com/starlis/empirecraft + +diff --git a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java +index bd7967680d7a75caff98a827895c795f2d101f99..a3acd40f24aae3c9809b76ce6f3e1b2d20acc5b1 100644 +--- a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java ++++ b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java +@@ -264,23 +264,23 @@ public class PersistentEntitySectionManager implements A + if (flag2 && !flag3) { + entitysection.getEntities().filter((entityaccess) -> { + return !entityaccess.isAlwaysTicking(); +- }).forEach(this::stopTicking); ++ }).collect(Collectors.toList()).forEach(this::stopTicking); // EMC + } + + if (flag && !flag1) { + entitysection.getEntities().filter((entityaccess) -> { + return !entityaccess.isAlwaysTicking(); +- }).forEach(this::stopTracking); ++ }).collect(Collectors.toList()).forEach(this::stopTracking); // EMC + } else if (!flag && flag1) { + entitysection.getEntities().filter((entityaccess) -> { + return !entityaccess.isAlwaysTicking(); +- }).forEach(this::startTracking); ++ }).collect(Collectors.toList()).forEach(this::startTracking); // EMC + } + + if (!flag2 && flag3) { + entitysection.getEntities().filter((entityaccess) -> { + return !entityaccess.isAlwaysTicking(); +- }).forEach(this::startTicking); ++ }).collect(Collectors.toList()).forEach(this::startTicking); // EMC + } + + }); diff --git a/patches/server/0043-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0043-Fix-cow-rotation-when-shearing-mooshroom.patch new file mode 100644 index 0000000..2d2fbe5 --- /dev/null +++ b/patches/server/0043-Fix-cow-rotation-when-shearing-mooshroom.patch @@ -0,0 +1,26 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Fri, 10 Dec 2021 22:55:42 +0100 +Subject: [PATCH] Fix cow rotation when shearing mooshroom + +Original code by PurpurMC, licensed under MIT +You can find the original code on https://github.com/PurpurMC/Purpur + +diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +index a91c8d37b818161fb7e2dc0def82a56d7db04fc1..75b745bc8bf4d96946b3000c0a20c4c6c952225a 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java ++++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +@@ -181,7 +181,13 @@ public class MushroomCow extends Cow implements Shearable { + + entitycow.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); + entitycow.setHealth(this.getHealth()); ++ // Purpur start ++ entitycow.copyPosition(this); + entitycow.yBodyRot = this.yBodyRot; ++ entitycow.setYHeadRot(this.getYHeadRot()); ++ entitycow.yRotO = this.yRotO; ++ entitycow.xRotO = this.xRotO; ++ // Purpur end + if (this.hasCustomName()) { + entitycow.setCustomName(this.getCustomName()); + entitycow.setCustomNameVisible(this.isCustomNameVisible()); diff --git a/patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch b/patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch new file mode 100644 index 0000000..49f5461 --- /dev/null +++ b/patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch @@ -0,0 +1,20 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Fri, 10 Dec 2021 23:01:59 +0100 +Subject: [PATCH] End gateway should check if entity can use portal + +Original code by PurpurMC, licensed under MIT +You can find the original code on https://github.com/PurpurMC/Purpur + +diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +index 6e911b9a2fbdb4495605f68bc465b1f9e2d80ea1..4b5e8f1d1973f50b45bab7908c416a3b7619fdb9 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +@@ -176,6 +176,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { + + public static void teleportEntity(Level world, BlockPos pos, BlockState state, Entity entity, TheEndGatewayBlockEntity blockEntity) { + if (world instanceof ServerLevel && !blockEntity.isCoolingDown()) { ++ if (!entity.canChangeDimensions()) return; // Purpur + ServerLevel worldserver = (ServerLevel) world; + + blockEntity.teleportCooldown = 100; diff --git a/patches/server/0045-Arrows-should-not-reset-despawn-counter.patch b/patches/server/0045-Arrows-should-not-reset-despawn-counter.patch new file mode 100644 index 0000000..4486ae9 --- /dev/null +++ b/patches/server/0045-Arrows-should-not-reset-despawn-counter.patch @@ -0,0 +1,21 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Fri, 10 Dec 2021 23:04:17 +0100 +Subject: [PATCH] Arrows should not reset despawn counter + +Original code by PurpurMC, licensed under MIT +You can find the original code on https://github.com/PurpurMC/Purpur + +diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +index 3d3dcb47720055f550d17d1f106a2c0e59de2919..8a0a0ce2fce81b78bf3e4f9deb74b412ef15058b 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +@@ -308,7 +308,7 @@ public abstract class AbstractArrow extends Projectile { + Vec3 vec3d = this.getDeltaMovement(); + + this.setDeltaMovement(vec3d.multiply((double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F))); +- this.life = 0; ++ //this.life = 0; // Purpur - do not reset despawn counter + } + + @Override diff --git a/patches/server/0046-Spread-out-and-optimise-player-list-ticksSpread-out-.patch b/patches/server/0046-Spread-out-and-optimise-player-list-ticksSpread-out-.patch new file mode 100644 index 0000000..b260138 --- /dev/null +++ b/patches/server/0046-Spread-out-and-optimise-player-list-ticksSpread-out-.patch @@ -0,0 +1,67 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Fri, 10 Dec 2021 23:08:06 +0100 +Subject: [PATCH] Spread out and optimise player list ticksSpread out and + optimise player list ticks + +Original code by PurpurMC, licensed under MIT +You can find the original code on https://github.com/PurpurMC/Purpur + +diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java +index dc53441ce82240f8cf7bb35afe01b40743777cd5..d487535566025c376750cfc328e6c8f5a1f78cc5 100644 +--- a/src/main/java/net/minecraft/server/players/PlayerList.java ++++ b/src/main/java/net/minecraft/server/players/PlayerList.java +@@ -1017,22 +1017,21 @@ public abstract class PlayerList { + } + + public void tick() { +- if (++this.sendAllPlayerInfoIn > 600) { +- // CraftBukkit start +- for (int i = 0; i < this.players.size(); ++i) { +- final ServerPlayer target = (ServerPlayer) this.players.get(i); +- +- target.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.UPDATE_LATENCY, this.players.stream().filter(new Predicate() { +- @Override +- public boolean apply(ServerPlayer input) { +- return target.getBukkitEntity().canSee(input.getBukkitEntity()); +- } +- }).collect(Collectors.toList()))); ++ // Purpur start ++ if (this.sendAllPlayerInfoIn < this.players.size()) { ++ final org.bukkit.craftbukkit.entity.CraftPlayer target = this.players.get(this.sendAllPlayerInfoIn).getBukkitEntity(); ++ final List list = new java.util.ArrayList<>(); ++ for (ServerPlayer player : this.players) { ++ if (target.canSee(player.getUUID())) { ++ list.add(player); ++ } + } +- // CraftBukkit end ++ target.getHandle().connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.UPDATE_LATENCY, list)); ++ } ++ if (++this.sendAllPlayerInfoIn > 600) { + this.sendAllPlayerInfoIn = 0; + } +- ++ // Purpur end + } + + public void broadcastAll(Packet packet) { +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index c6cd4a5790384811f3171ce740afb9459f3d6fc0..fa91fa1d3842f1c9cb2e3d33cef02995bca32601 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -1544,7 +1544,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + + @Override + public boolean canSee(org.bukkit.entity.Entity entity) { +- return !this.hiddenEntities.containsKey(entity.getUniqueId()); ++ // Purpur start ++ return this.canSee(entity.getUniqueId()); ++ } ++ ++ public boolean canSee(UUID uuid) { ++ return !this.hiddenEntities.containsKey(uuid); ++ // Purpur end + } + + @Override