diff --git a/patches/api/0004-Add-World-Instance-flag.patch b/patches/api/0004-Add-World-Instance-flag.patch new file mode 100644 index 000000000..bd3dd6edb --- /dev/null +++ b/patches/api/0004-Add-World-Instance-flag.patch @@ -0,0 +1,22 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Sat, 9 Nov 2024 09:56:09 -0600 +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 ef32a937e6faf1e8a5d6b1207986715bae5a246c..1cc239d08990c12bc9ceecb5429555e69c53b79d 100644 +--- a/src/main/java/org/bukkit/World.java ++++ b/src/main/java/org/bukkit/World.java +@@ -2739,6 +2739,11 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient + */ + public void setAutoSave(boolean value); + ++ // Slice start ++ public boolean isInstance(); ++ public void setInstance(boolean value); ++ // Slice end ++ + /** + * Sets the Difficulty of the world. + * diff --git a/patches/api/0005-Smooth-Teleports.patch b/patches/api/0005-Smooth-Teleports.patch new file mode 100644 index 000000000..5ac655ae2 --- /dev/null +++ b/patches/api/0005-Smooth-Teleports.patch @@ -0,0 +1,30 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Sun, 10 Nov 2024 09:34:07 -0600 +Subject: [PATCH] Smooth Teleports + + +diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java +index 95f0b3186e313c7fbd5c8531d52b82a69e525f94..f542265036bde4031c834e379a031d2821f32173 100644 +--- a/src/main/java/org/bukkit/entity/Player.java ++++ b/src/main/java/org/bukkit/entity/Player.java +@@ -3721,6 +3721,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM + String getClientBrandName(); + // Paper end + ++ // Slice start ++ /** ++ * This abuses some of how Minecraft works and allows teleporting a player to another world without ++ * triggering typical respawn packets. All of natural state of chunk resends, entity adds/removes, etc still ++ * happen but the visual "refresh" of a world change is hidden. Depending on the destination location/world, ++ * this can act as a "smooth teleport" to a world if the new world is very similar looking to the old one. ++ * ++ * @param location New location to teleport this Player to ++ */ ++ @org.jetbrains.annotations.ApiStatus.Experimental ++ void teleportWithoutRespawn(@NotNull Location location); ++ // Slice end ++ + // Paper start - Teleport API + /** + * Sets the player's rotation. diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch index f136cfb94..d7fe5cc11 100644 --- a/patches/server/0001-Build-changes.patch +++ b/patches/server/0001-Build-changes.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Build changes diff --git a/build.gradle.kts b/build.gradle.kts -index 9b3a6b336cb1344d4e74e0e4f7c50ffd1e1b8955..11311c051fc288271a22685446ffc467246acfc1 100644 +index c209eb393670fd8d6c97ca65a801c8032b582a35..32751460e29684401a461fddf82c371b3ff627dd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -13,7 +13,7 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { - val alsoShade: Configuration by configurations.creating +@@ -25,7 +25,7 @@ abstract class MockitoAgentProvider : CommandLineArgumentProvider { + // Paper end - configure mockito agent that is needed in newer java versions dependencies { - implementation(project(":paper-api")) @@ -17,7 +17,7 @@ index 9b3a6b336cb1344d4e74e0e4f7c50ffd1e1b8955..11311c051fc288271a22685446ffc467 // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -85,14 +85,14 @@ tasks.jar { +@@ -98,14 +98,14 @@ tasks.jar { val gitBranch = git("rev-parse", "--abbrev-ref", "HEAD").getText().trim() // Paper attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", @@ -36,7 +36,7 @@ index 9b3a6b336cb1344d4e74e0e4f7c50ffd1e1b8955..11311c051fc288271a22685446ffc467 "Build-Number" to (build ?: ""), "Build-Time" to Instant.now().toString(), "Git-Branch" to gitBranch, // Paper -@@ -153,7 +153,7 @@ fun TaskContainer.registerRunTask( +@@ -171,7 +171,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { diff --git a/patches/server/0005-Add-World-Instance-flag.patch b/patches/server/0005-Add-World-Instance-flag.patch new file mode 100644 index 000000000..ea7c3e349 --- /dev/null +++ b/patches/server/0005-Add-World-Instance-flag.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Sat, 9 Nov 2024 09:56:09 -0600 +Subject: [PATCH] Add World Instance flag + + +diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java +index 3b6b6483bf855493948417f44f06427b625bc910..7bdbe1f2fa31781b7bd7b12c555b1b668edbfd6b 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -230,6 +230,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + public final UUID uuid; + public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent + public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent ++ public boolean instance; // Slice + + public LevelChunk getChunkIfLoaded(int x, int z) { + return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +index d41c81158c00931e6b11093cce141f6a3085ba05..368ff80bdbe2efb48c6a588895c9540cf47b4b41 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +@@ -1349,6 +1349,18 @@ public class CraftWorld extends CraftRegionAccessor implements World { + this.world.noSave = !value; + } + ++ // Slice start ++ @Override ++ public boolean isInstance() { ++ return world.instance; ++ } ++ ++ @Override ++ public void setInstance(boolean value) { ++ world.instance = value; ++ } ++ // Slice end ++ + @Override + public void setDifficulty(Difficulty difficulty) { + this.getHandle().getServer().setDifficulty(this.getHandle(), net.minecraft.world.Difficulty.byId(difficulty.getValue()), true); // Paper - per level difficulty; don't skip other difficulty-changing logic diff --git a/patches/server/0006-Smooth-Teleports.patch b/patches/server/0006-Smooth-Teleports.patch new file mode 100644 index 000000000..7aaf18866 --- /dev/null +++ b/patches/server/0006-Smooth-Teleports.patch @@ -0,0 +1,61 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Sun, 10 Nov 2024 09:34:07 -0600 +Subject: [PATCH] Smooth Teleports + + +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index cffbd3300967e5d80b5973b35a76235bb2aa1b73..f29b23241816765b8a1fa60f997936590b735f38 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -329,6 +329,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple + public com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent + public @Nullable String clientBrandName = null; // Paper - Brand support + public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event ++ public boolean smoothWorldTeleport = false; // Slice + + // Paper start - rewrite chunk system + private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; +diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java +index 30de3d1a7792c38ae946f19cb0e14637919b5001..b775de1732238954e9bbbd072277254d2dc91b18 100644 +--- a/src/main/java/net/minecraft/server/players/PlayerList.java ++++ b/src/main/java/net/minecraft/server/players/PlayerList.java +@@ -844,8 +844,7 @@ public abstract class PlayerList { + ServerLevel worldserver1 = entityplayer1.serverLevel(); + LevelData worlddata = worldserver1.getLevelData(); + +- entityplayer1.connection.send(new ClientboundRespawnPacket(entityplayer1.createCommonSpawnInfo(worldserver1), (byte) i)); +- entityplayer1.connection.send(new ClientboundSetChunkCacheRadiusPacket(worldserver1.spigotConfig.viewDistance)); // Spigot ++ if (!entityplayer1.smoothWorldTeleport) entityplayer1.connection.send(new ClientboundRespawnPacket(entityplayer1.createCommonSpawnInfo(worldserver1), (byte) i)); // Slice + entityplayer1.connection.send(new ClientboundSetSimulationDistancePacket(worldserver1.spigotConfig.simulationDistance)); // Spigot + entityplayer1.connection.teleport(CraftLocation.toBukkit(entityplayer1.position(), worldserver1.getWorld(), entityplayer1.getYRot(), entityplayer1.getXRot())); // CraftBukkit + entityplayer1.connection.send(new ClientboundSetDefaultSpawnPositionPacket(worldserver.getSharedSpawnPos(), worldserver.getSharedSpawnAngle())); +@@ -1213,7 +1212,7 @@ public abstract class PlayerList { + // CraftBukkit end + } + +- player.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.LEVEL_CHUNKS_LOAD_START, 0.0F)); ++ if (!player.smoothWorldTeleport) player.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.LEVEL_CHUNKS_LOAD_START, 0.0F)); // Slice + this.server.tickRateManager().updateJoiningPlayer(player); + } + +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index d0010dfd22463986bf3be9b3ee015ce92735753e..2907a7ecf8b893717b5a436eadf4b49860d7df17 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -1359,6 +1359,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + // Paper end - Teleportation API + } + ++ // Slice start ++ public void teleportWithoutRespawn(Location location) { ++ ServerPlayer serverPlayer = getHandle(); ++ serverPlayer.smoothWorldTeleport = true; ++ teleport(location); ++ serverPlayer.smoothWorldTeleport = false; ++ } ++ // Slice end ++ + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + // Paper start - Teleport API