diff --git a/patches/api/0006-Add-World-Instance-flag.patch b/patches/api/0006-Add-World-Instance-flag.patch index 4fb60b853..5c5ae4a2b 100644 --- a/patches/api/0006-Add-World-Instance-flag.patch +++ b/patches/api/0006-Add-World-Instance-flag.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add World Instance flag diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index 2b45aa9b438d7856ec448c56832b2b2100961565..8a1731e8cb2cdd94542df0e95530162850f534c0 100644 +index c1827f97e9255e72c082548c8b2782e39f1ebb8c..c89a373233f48da4ea8baed39ccc72a0deb5bb7c 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java -@@ -2554,6 +2554,11 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient +@@ -2555,6 +2555,11 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient */ public void setAutoSave(boolean value); diff --git a/patches/api/0012-Add-PlayerPreChunkLoadEvent.patch b/patches/api/0012-Add-PlayerPreChunkLoadEvent.patch index 0c6c6a73e..3b7a46178 100644 --- a/patches/api/0012-Add-PlayerPreChunkLoadEvent.patch +++ b/patches/api/0012-Add-PlayerPreChunkLoadEvent.patch @@ -81,10 +81,10 @@ index 0000000000000000000000000000000000000000..b5cc9538a70c7ce0b494d4878d51b521 +} \ No newline at end of file diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index 8a1731e8cb2cdd94542df0e95530162850f534c0..81e50f88785bb503266e617d6fb0e540db86ae04 100644 +index c89a373233f48da4ea8baed39ccc72a0deb5bb7c..e3b8f58492863b0ccbef2e3061d1fc6052ea86c3 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java -@@ -481,6 +481,8 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient +@@ -482,6 +482,8 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient //@Deprecated // Paper public boolean refreshChunk(int x, int z); diff --git a/patches/server/0001-Build-Changes.patch b/patches/server/0001-Build-Changes.patch index 4c19cfc01..62b8a079d 100644 --- a/patches/server/0001-Build-Changes.patch +++ b/patches/server/0001-Build-Changes.patch @@ -55,10 +55,10 @@ index 9f15d9dbdfa74a0640b1a2b4ff695609d4758a4c..fa14ab3d8117e9d357380d21d3c6a2cd public SystemReport fillSystemReport(SystemReport details) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 894c0d5bfa001def4374b657e3eb8f15a0caa1e9..0dd7f5a5d266348b889d65ca8c0391b5fae0e59b 100644 +index 9f2536d9a73bdb15b5b3004d4da79ca32cee205b..e6d7581442d0f9b76cc16a8c6794f7ee3f79b68f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -259,7 +259,7 @@ import javax.annotation.Nullable; // Paper +@@ -262,7 +262,7 @@ import javax.annotation.Nullable; // Paper import javax.annotation.Nonnull; // Paper public final class CraftServer implements Server { diff --git a/patches/server/0005-Add-provided-Material-to-getDrops.patch b/patches/server/0005-Add-provided-Material-to-getDrops.patch index a29b1776f..113ad19fe 100644 --- a/patches/server/0005-Add-provided-Material-to-getDrops.patch +++ b/patches/server/0005-Add-provided-Material-to-getDrops.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add provided Material to getDrops diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -index 823857f89bbed57bf33d41501604502bdfeff67a..043983d62a0a71dbf68dff36ad36db87c5604c0d 100644 +index 0a5b3a2f7db1042fe9f154ffaea99e1b9b4ce9ce..ad56206974135e3be74143d3ef86c37969855119 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -@@ -615,7 +615,18 @@ public class CraftBlock implements Block { +@@ -618,7 +618,18 @@ public class CraftBlock implements Block { @Override public Collection getDrops(ItemStack item, Entity entity) { @@ -28,7 +28,7 @@ index 823857f89bbed57bf33d41501604502bdfeff67a..043983d62a0a71dbf68dff36ad36db87 net.minecraft.world.item.ItemStack nms = CraftItemStack.asNMSCopy(item); // Modelled off EntityHuman#hasBlock -@@ -626,6 +637,7 @@ public class CraftBlock implements Block { +@@ -629,6 +640,7 @@ public class CraftBlock implements Block { return Collections.emptyList(); } } diff --git a/patches/server/0007-Add-World-Instance-flag.patch b/patches/server/0007-Add-World-Instance-flag.patch index 422c59228..9d1eee8f5 100644 --- a/patches/server/0007-Add-World-Instance-flag.patch +++ b/patches/server/0007-Add-World-Instance-flag.patch @@ -17,10 +17,10 @@ index 45804711255f04110e9509df8d60900314aa10b7..2cb6a61fb1963ceba8daaf703a1e1881 public static Throwable getAddToWorldStackTrace(Entity entity) { final Throwable thr = new Throwable(entity + " Added to world at " + new java.util.Date()); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 8d3a32a0538a6065fd0725721ab8a1a011c4d64a..f1c867a59b9ed1589028db3efd9652d274dce405 100644 +index 8f0234296397ca2d4a607dcea6093c6c606dc7d2..8334fbe6ffee640016ce17c1d331b6f88b569d65 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -1262,6 +1262,18 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1264,6 +1264,18 @@ public class CraftWorld extends CraftRegionAccessor implements World { world.noSave = !value; } diff --git a/patches/server/0015-Add-PlayerPreChunkLoadEvent.patch b/patches/server/0015-Add-PlayerPreChunkLoadEvent.patch index 4510ddb40..bf96cb098 100644 --- a/patches/server/0015-Add-PlayerPreChunkLoadEvent.patch +++ b/patches/server/0015-Add-PlayerPreChunkLoadEvent.patch @@ -34,10 +34,10 @@ index e77972c4c264100ffdd824bfa2dac58dbbc6d678..5b32567bcf532994a31f184743cf42f4 new ChunkPos(chunkX, chunkZ), new MutableObject<>(), false, true); // unloaded, loaded this.player.connection.connection.execute(onChunkSend); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index f1c867a59b9ed1589028db3efd9652d274dce405..174ef57ed527e95ac1089383b63e0effae8968ee 100644 +index 8334fbe6ffee640016ce17c1d331b6f88b569d65..c591b248da7f6349ce6da339f96ad9b51be042ef 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -530,6 +530,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -532,6 +532,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { return true; } diff --git a/patches/server/0032-Packet-obfuscation-and-reduction.patch b/patches/server/0032-Packet-obfuscation-and-reduction.patch new file mode 100644 index 000000000..de308512a --- /dev/null +++ b/patches/server/0032-Packet-obfuscation-and-reduction.patch @@ -0,0 +1,184 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Tue, 6 Jun 2023 07:51:32 -0500 +Subject: [PATCH] Packet obfuscation and reduction + + +diff --git a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java +index ff7ba7a161cfed7521354bc6e3f21ba0f17f3760..b5f4af655fdc6a9150802254811ed743cc61074c 100644 +--- a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java ++++ b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java +@@ -139,15 +139,29 @@ public class SynchedEntityData { + } + + public void set(EntityDataAccessor key, T value, boolean force) { ++ // Slice start ++ this.set(key, value, force, null); ++ } ++ ++ public void set(EntityDataAccessor key, T value, @Nullable T foreignValue) { ++ this.set(key, value, false, foreignValue); ++ } ++ ++ public void set(EntityDataAccessor key, T value, boolean force, @Nullable T foreignValue) { // Slice end + SynchedEntityData.DataItem datawatcher_item = this.getItem(key); + ++ // Slice start ++ if (foreignValue != null && ObjectUtils.notEqual(foreignValue, datawatcher_item.getForeignValue())) { ++ datawatcher_item.setForeignValue(foreignValue); ++ } ++ // Slice end ++ + if (force || ObjectUtils.notEqual(value, datawatcher_item.getValue())) { + datawatcher_item.setValue(value); + this.entity.onSyncedDataUpdated(key); + datawatcher_item.setDirty(true); + this.isDirty = true; + } +- + } + + // CraftBukkit start - add method from above +@@ -189,6 +203,26 @@ public class SynchedEntityData { + return list; + } + ++ // Slice start ++ @Nullable ++ public List> packForeignDirty() { ++ List> list = null; ++ ++ for (DataItem dataItem : this.itemsById.values()) { ++ if (dataItem.isDirty(true)) { ++ dataItem.setForeignDirty(false); ++ if (list == null) { ++ list = new ArrayList(); ++ } ++ ++ list.add(dataItem.foreignValue != null ? dataItem.foreignValue() : dataItem.value()); ++ } ++ } ++ ++ return list; ++ } ++ // Slice end ++ + @Nullable + public List> getNonDefaultValues() { + List> list = null; +@@ -296,11 +330,14 @@ public class SynchedEntityData { + T value; + private final T initialValue; + private boolean dirty; ++ private @Nullable T foreignValue = null; // Slice ++ private boolean foreignDirty; // Slice + + public DataItem(EntityDataAccessor data, T value) { + this.accessor = data; + this.initialValue = value; + this.value = value; ++ this.foreignDirty = true; //Slice + } + + public EntityDataAccessor getAccessor() { +@@ -330,6 +367,35 @@ public class SynchedEntityData { + public SynchedEntityData.DataValue value() { + return SynchedEntityData.DataValue.create(this.accessor, this.value); + } ++ ++ // Slice start ++ public SynchedEntityData.DataValue foreignValue() { ++ return SynchedEntityData.DataValue.create(this.accessor, this.foreignValue); ++ } ++ ++ public void setForeignValue(T foreignValue) { ++ this.foreignValue = foreignValue; ++ this.foreignDirty = true; ++ } ++ ++ public @Nullable T getForeignValue() { ++ return foreignValue; ++ } ++ ++ public boolean isDirty(boolean foreign) { ++ if (foreign) { ++ //There must be a foreign value in order for this to be dirty, otherwise we consider this a normal ++ //value and check the normal dirty flag. ++ return foreignValue == null || this.foreignDirty; ++ } ++ ++ return this.dirty; ++ } ++ ++ public void setForeignDirty(boolean dirty) { ++ this.foreignDirty = dirty; ++ } ++ // Slice end + } + + public static record DataValue(int id, EntityDataSerializer serializer, T value) { // CraftBukkit - decompile error +diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java +index d86836541f5eaa654d3dc452fe7cc15eafff4dfa..5de01ea9b5bd6d4d67024cd045a68a730365a6fa 100644 +--- a/src/main/java/net/minecraft/server/level/ServerEntity.java ++++ b/src/main/java/net/minecraft/server/level/ServerEntity.java +@@ -378,7 +378,20 @@ public class ServerEntity { + + if (list != null) { + this.trackedDataValues = datawatcher.getNonDefaultValues(); +- this.broadcastAndSend(new ClientboundSetEntityDataPacket(this.entity.getId(), list)); ++// this.broadcastAndSend(new ClientboundSetEntityDataPacket(this.entity.getId(), list)); ++ // Slice start ++ ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(this.entity.getId(), list); ++ if (this.entity instanceof ServerPlayer serverPlayer) { ++ serverPlayer.connection.send(dataPacket); ++ } ++ ++ //Get the packedData that the original packet has, and then determine if any of those are changed in ++ //the foreign version. If null, nothing to notify foreign trackers about. ++ List> dirtyItems = datawatcher.packForeignDirty(); ++ if (dirtyItems != null) { ++ this.broadcast.accept(new ClientboundSetEntityDataPacket(this.entity.getId(), dirtyItems)); ++ } ++ // Slice end + } + + if (this.entity instanceof LivingEntity) { +diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java +index 66bcacfafe25f2543d40eb959ef251da400a2c73..94a3d39f9802be7b71adf378985f132fd7f5c0fd 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -3151,7 +3151,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + this.entityData.markDirty(Entity.DATA_AIR_SUPPLY_ID); + return; + } +- this.entityData.set(Entity.DATA_AIR_SUPPLY_ID, event.getAmount()); ++ this.entityData.set(Entity.DATA_AIR_SUPPLY_ID, event.getAmount(), getMaxAirSupply()); // Slice + // CraftBukkit end + } + +diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java +index 28125492ceed99b244c5e177edb6739a9c2d68d9..8821d57e1f111fb4528d7645ba635c7d8687c8a9 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Player.java ++++ b/src/main/java/net/minecraft/world/entity/player/Player.java +@@ -641,7 +641,7 @@ public abstract class Player extends LivingEntity { + public void increaseScore(int score) { + int j = this.getScore(); + +- this.entityData.set(Player.DATA_SCORE_ID, j + score); ++ this.entityData.set(Player.DATA_SCORE_ID, j + score, 0); // Slice + } + + public void startAutoSpinAttack(int riptideTicks) { +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index 1b58330a0eff27eb920a37dad0b436049fe0bce6..4ae992fd174135eda153015236c6a3b884af3dd8 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -2515,7 +2515,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + this.sendHealthUpdate(); + } + } +- this.getHandle().getEntityData().set(net.minecraft.world.entity.LivingEntity.DATA_HEALTH_ID, (float) this.getScaledHealth()); ++ this.getHandle().getEntityData().set(net.minecraft.world.entity.LivingEntity.DATA_HEALTH_ID, (float) this.getScaledHealth(), isDead() ? 0f : 20f); // Slice + + this.getHandle().maxHealthCache = getMaxHealth(); + } diff --git a/patches/server/0033-Long-distance-tracking.patch b/patches/server/0033-Long-distance-tracking.patch new file mode 100644 index 000000000..fcf946760 --- /dev/null +++ b/patches/server/0033-Long-distance-tracking.patch @@ -0,0 +1,94 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Tue, 6 Jun 2023 08:14:08 -0500 +Subject: [PATCH] Long distance tracking + + +diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java +index 67a8b0145e4ed096b4fc520202098b9b1d259bd6..47b500930645d8704f78d65e5dd6f148b08f8cb7 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java +@@ -1612,7 +1612,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + double vec3d_dx = player.getX() - this.entity.getX(); + double vec3d_dz = player.getZ() - this.entity.getZ(); + // Paper end - remove allocation of Vec3D here +- double d0 = (double) Math.min(this.getEffectiveRange(), io.papermc.paper.chunk.PlayerChunkLoader.getSendViewDistance(player) * 16); // Paper - per player view distance ++ // Slice start ++ double d0 = io.papermc.paper.chunk.PlayerChunkLoader.getSendViewDistance(player) * 16; ++ if (this.entity instanceof ServerPlayer serverPlayer && player.canSeeFromLongDistance(serverPlayer)) { ++ d0 = Math.min(level.spigotConfig.flyingPlayerTrackingRange, d0); ++ } ++ else { ++ d0 = Math.min(this.getEffectiveRange(), d0); // Paper - per player view distance ++ } ++ // Slice end + double d1 = vec3d_dx * vec3d_dx + vec3d_dz * vec3d_dz; // Paper + double d2 = d0 * d0; + boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player); +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index e7ef3882461344cfd1c53ac03de9ef1991378623..b043273a532ae994cca56f4516c3ba12f30b9495 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -278,6 +278,7 @@ public class ServerPlayer extends Player { + public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // 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 boolean smoothWorldTeleport; // Slice ++ public boolean hasLongDistanceTracking; // Slice + public double targetChunkSendRate = io.papermc.paper.configuration.GlobalConfiguration.get().chunkLoading.targetPlayerChunkSendRate; // Slice + + public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { +@@ -2566,4 +2567,18 @@ public class ServerPlayer extends Player { + return (CraftPlayer) super.getBukkitEntity(); + } + // CraftBukkit end ++ ++ // Slice start ++ public boolean canSeeFromLongDistance(ServerPlayer other) { ++ if (hasLongDistanceTracking) return true; ++ ++ CraftPlayer bukkitEntity = other.getBukkitEntity(); ++ return bukkitEntity.isGliding() || bukkitEntity.isFlying(); ++ } ++ ++ public boolean canBeSeenLongDistance() { ++ CraftPlayer bukkitEntity = getBukkitEntity(); ++ return bukkitEntity.isGliding() || bukkitEntity.isFlying(); ++ } ++ // Slice end + } +diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java +index bbfafb1400721251dfd2cac4dd8a31be2d682d4b..ec2467432a0a3a285039e7ced36c9a5220a86849 100644 +--- a/src/main/java/org/spigotmc/SpigotWorldConfig.java ++++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java +@@ -269,6 +269,7 @@ public class SpigotWorldConfig + } + + public int playerTrackingRange = 48; ++ public int flyingPlayerTrackingRange = 64; // Slice + public int animalTrackingRange = 48; + public int monsterTrackingRange = 48; + public int miscTrackingRange = 32; +@@ -277,6 +278,7 @@ public class SpigotWorldConfig + private void trackingRange() + { + this.playerTrackingRange = this.getInt( "entity-tracking-range.players", this.playerTrackingRange ); ++ this.flyingPlayerTrackingRange = this.getInt( "entity-tracking-range.flying-players", this.flyingPlayerTrackingRange ); // Slice + this.animalTrackingRange = this.getInt( "entity-tracking-range.animals", this.animalTrackingRange ); + this.monsterTrackingRange = this.getInt( "entity-tracking-range.monsters", this.monsterTrackingRange ); + this.miscTrackingRange = this.getInt( "entity-tracking-range.misc", this.miscTrackingRange ); +diff --git a/src/main/java/org/spigotmc/TrackingRange.java b/src/main/java/org/spigotmc/TrackingRange.java +index 6ac5de214d0da921d0d0c822e7063f6738788cac..4a76e87188739b5fc1b3e0de0ded0d96def03176 100644 +--- a/src/main/java/org/spigotmc/TrackingRange.java ++++ b/src/main/java/org/spigotmc/TrackingRange.java +@@ -27,9 +27,9 @@ public class TrackingRange + } + if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) return defaultRange; // Paper - enderdragon is exempt + SpigotWorldConfig config = entity.level.spigotConfig; +- if ( entity instanceof ServerPlayer ) ++ if ( entity instanceof ServerPlayer serverPlayer) + { +- return config.playerTrackingRange; ++ return serverPlayer.canBeSeenLongDistance() ? config.flyingPlayerTrackingRange : config.playerTrackingRange; + // Paper start - Simplify and set water mobs to animal tracking range + } + switch (entity.activationType) {