mirror of
https://github.com/Samsuik/Sakura.git
synced 2025-12-21 15:59:26 +00:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@9e51f94 Fix ping event always receiving protocol version 0 (#10671) PaperMC/Paper@89ad61f Fix hopper pull event being skipped after the first call (#10667) PaperMC/Paper@eee55d0 Correctly compare holders in BeaconMenu (#10673) PaperMC/Paper@5729b29 Update Adventure to 4.17.0 Release PaperMC/Paper@ab2a85a [ci skip] Clarify var entry in contributing file PaperMC/Paper@f2512b1 Print data component type on encoding error PaperMC/Paper@1b67e02 Fix entity tracker desync when new players are added to the tracker PaperMC/Paper@cc29d2b Invalidate PathTypeCache when pathfinding updates are disabled PaperMC/Paper@b56e92f Fix chunk data version check not running in chunk system PaperMC/Paper@2df1dac Fix DataConverter ConverterParticleToNBT.parseProperties PaperMC/Paper@8748ae1 Use MCDataConverter instead of raw convert call for cmd converter PaperMC/Paper@7f1a154 Add validation to player profile and properties (#10680) PaperMC/Paper@4fd58a1 Add conversion for summon command PaperMC/Paper@39532a1 Fix stacks losing empty attr modifiers PaperMC/Paper@cdb6ba8 Fix keepalive time interval (#10690) PaperMC/Paper@a61d58d adjust ItemMeta to distinguish null and empty modifiers PaperMC/Paper@6c02dbc handle recent ItemMeta changes in serialization logic PaperMC/Paper@447f9a1 [ci skip] Fix paperclip PR label PaperMC/Paper@b98d20a Brigadier Command Support (#8235) PaperMC/Paper@ac554ad Updated Upstream (Bukkit/CraftBukkit) (#10691) PaperMC/Paper@711f82e Fix signed book page serialization (#10696) PaperMC/Paper@7e48f66 Properly pass requirement on namespaced redirects (#10701) PaperMC/Paper@f041f48 Prevent infinite recursion on cyclic brig redirect (#10705) PaperMC/Paper@11c3963 Improve Recipe validation (#10707) PaperMC/Paper@0688f21 Better way to keep paper datapack enabled PaperMC/Paper@218d33c fix creating complex recipes that have air results PaperMC/Paper@fa8a407 Remove Adventure snapshot repo from dev bundle (#10716) PaperMC/Paper@bebcc9c Make exception during command conversion non-fatal PaperMC/Paper@2faa3b2 Correctly copy alias requirements in command upgrader PaperMC/Paper@3fc9358 Show stacktrace when modifyItemStack fails PaperMC/Paper@f175193 Expose server build information (#10729) PaperMC/Paper@d8d59e0 Fix NPE sending resource pack without prompt PaperMC/Paper@5a9afbe Fixes issues in the suppress dismount cancellation patch (#10735) PaperMC/Paper@0ad09de Make PaperSimplePluginClassLoader show class which is not found PaperMC/Paper@b3b3406 fix CompassMeta not being correct (#10737) PaperMC/Paper@591521e Check for more correct profile validation (#10730) PaperMC/Paper@7d2e5c3 Add an 'empty' RecipeChoice for certain ingredient slots (#10710) PaperMC/Paper@9bf4855 Add a better warning message than "Server performance will be affected" for CommandRegisteredEvent use (#10754) PaperMC/Paper@66cb880 Remove ThreadedWorldUpgrader patch PaperMC/Paper@980cff9 Fix compile PaperMC/Paper@d3ffa62 fix default item attributes PaperMC/Paper@b149584 Always show command exception stack traces in logs (#10766) PaperMC/Paper@a9201d4 [ci skip] Move logic in our patches to ItemType/BlockType (#10772) PaperMC/Paper@3de408e Fix equipment slot and group API (#10767) PaperMC/Paper@d408381 Print CommandRegisteredEvent deprecation warnings again (#10756) PaperMC/Paper@6de7a1f Improve default item attributes API (#10765) PaperMC/Paper@2a90732 Remove incorrect logic for Fireball#setVelocity (#10764) PaperMC/Paper@5e7b65a Allow using PluginLoader classpath API from Bukkit plugins (#10758) PaperMC/Paper@3004717 Do not re-wrap vanilla goals (#10751) PaperMC/Paper@377733d Use getter/setter on Mob for equipment drop chances (#10780) PaperMC/Paper@dff591d Allow to define new map cursor types (#10782) PaperMC/Paper@4fd3ac0 [ci skip] Update Player#getListeningPluginChannels Jdoc (#10778) PaperMC/Paper@535dca5 Fix a few issues with ItemMeta (#10740) PaperMC/Paper@26e90b9 Fix CraftMetaBlockState for data components (#10731) PaperMC/Paper@f0bd0cc Expose anvil cost in the API (#10682) PaperMC/Paper@41bee55 Fix NPE for color-related metas PaperMC/Paper@4e10fad reset meta block state on BlockStateMeta#setBlockState PaperMC/Paper@a7ae966 readd itemstack data sanitization (#10454) PaperMC/Paper@ca50b87 Clear firework item properly (#10793) PaperMC/Paper@9774a52 fix and cleanup loot table patches (#10100) PaperMC/Paper@ac4ee06 Fix integer overflow for lag compensating eating check (#10797) PaperMC/Paper@6649a17 Fix BlockStateMeta equals (#10795) PaperMC/Paper@1b8cdc6 Extend Player Interact cancellation to cover Jigsaw blocks (#10719) PaperMC/Paper@841ab41 Fix more item desync when an event is cancelled (#10654) PaperMC/Paper@b0e3ca4 Prevent NPE if hooked entity was cleared (#10712) PaperMC/Paper@347bbe3 Fix Cancelling BlockPlaceEvent calling onRemove (#10773) PaperMC/Paper@23fe116 Fix missing debug trace PaperMC/Paper@b0c9b9c Only remove worldgen block entity on changed block (#10794) PaperMC/Paper@9c917fe [ci skip] Clean up paperclip build-pr workflow (#10802) PaperMC/Paper@9d6f2cc [ci skip] Rebuild patches (#10803)
147 lines
9.1 KiB
Diff
147 lines
9.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Samsuik <kfian294ma4@gmail.com>
|
|
Date: Sat, 11 Sep 2021 19:19:41 +0100
|
|
Subject: [PATCH] Load Chunks on Movement
|
|
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/util/CollisionUtil.java b/src/main/java/io/papermc/paper/util/CollisionUtil.java
|
|
index ee8e9c0e3690e78f3cc621ddfca89ea4256d4803..299237a0c828e48425cc35a14d366020c78daefb 100644
|
|
--- a/src/main/java/io/papermc/paper/util/CollisionUtil.java
|
|
+++ b/src/main/java/io/papermc/paper/util/CollisionUtil.java
|
|
@@ -1569,6 +1569,7 @@ public final class CollisionUtil {
|
|
public static final int COLLISION_FLAG_COLLIDE_WITH_UNLOADED_CHUNKS = 1 << 1;
|
|
public static final int COLLISION_FLAG_CHECK_BORDER = 1 << 2;
|
|
public static final int COLLISION_FLAG_CHECK_ONLY = 1 << 3;
|
|
+ public static final int COLLISION_FLAG_ADD_TICKET = 1 << 4; // Sakura
|
|
|
|
public static boolean getCollisionsForBlocksOrWorldBorder(final Level world, final Entity entity, final AABB aabb,
|
|
final List<VoxelShape> intoVoxel, final List<AABB> intoAABB,
|
|
@@ -1619,11 +1620,21 @@ public final class CollisionUtil {
|
|
final int maxChunkZ = maxBlockZ >> 4;
|
|
|
|
final boolean loadChunks = (collisionFlags & COLLISION_FLAG_LOAD_CHUNKS) != 0;
|
|
+ final boolean addTicket = (collisionFlags & COLLISION_FLAG_ADD_TICKET) != 0; // Sakura
|
|
final ServerChunkCache chunkSource = (ServerChunkCache)world.getChunkSource();
|
|
|
|
for (int currChunkZ = minChunkZ; currChunkZ <= maxChunkZ; ++currChunkZ) {
|
|
for (int currChunkX = minChunkX; currChunkX <= maxChunkX; ++currChunkX) {
|
|
final ChunkAccess chunk = loadChunks ? chunkSource.getChunk(currChunkX, currChunkZ, ChunkStatus.FULL, true) : chunkSource.getChunkAtIfLoadedImmediately(currChunkX, currChunkZ);
|
|
+ // Sakura start - keep chunks loaded on movement
|
|
+ if (addTicket && chunk instanceof net.minecraft.world.level.chunk.LevelChunk levelChunk && levelChunk.movementLoadTicketRequiresUpdate()) {
|
|
+ chunkSource.chunkMap.getDistanceManager().getChunkHolderManager().addTicketAtLevel(net.minecraft.server.level.TicketType.ENTITY_MOVEMENT, currChunkX, currChunkZ, 33, CoordinateUtils.getChunkKey(currChunkX, currChunkZ));
|
|
+ // This is known to work, uncomment if any issues
|
|
+ // var pos = new net.minecraft.world.level.ChunkPos(currChunkX, currChunkZ);
|
|
+ // chunkSource.addTicketAtLevel(net.minecraft.server.level.TicketType.ENTITY_MOVEMENT, pos, 33, pos.toLong());
|
|
+ levelChunk.updatedMovementLoadTicket();
|
|
+ }
|
|
+ // Sakura end
|
|
|
|
if (chunk == null) {
|
|
if ((collisionFlags & COLLISION_FLAG_COLLIDE_WITH_UNLOADED_CHUNKS) != 0) {
|
|
diff --git a/src/main/java/net/minecraft/server/level/TicketType.java b/src/main/java/net/minecraft/server/level/TicketType.java
|
|
index 658e63ebde81dc14c8ab5850fb246dc0aab25dea..f1ff1a67fee37ee7b241ceaa164fa4ee64d3767b 100644
|
|
--- a/src/main/java/net/minecraft/server/level/TicketType.java
|
|
+++ b/src/main/java/net/minecraft/server/level/TicketType.java
|
|
@@ -37,6 +37,7 @@ public class TicketType<T> {
|
|
public static final TicketType<Long> NON_FULL_SYNC_LOAD = create("non_full_sync_load", Long::compareTo);
|
|
public static final TicketType<ChunkPos> DELAY_UNLOAD = create("delay_unload", Comparator.comparingLong(ChunkPos::toLong), 1);
|
|
// Paper end - rewrite chunk system
|
|
+ public static final TicketType<Long> ENTITY_MOVEMENT = create("entity_movement", Long::compareTo, 10 * 20); // Sakura
|
|
|
|
public static <T> TicketType<T> create(String name, Comparator<T> argumentComparator) {
|
|
return new TicketType<>(name, argumentComparator, 0L);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index a2104fae2b288f4cbd9e810d73bf986be0b7b969..88d01e59869f8e6c528fb3ae1485cd86a23cb383 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -572,6 +572,19 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
public boolean isPrimedTNT;
|
|
public boolean isFallingBlock;
|
|
// Sakura end - visibility api and command
|
|
+ // Sakura start - load chunks on cannon entity movement
|
|
+ protected boolean loadChunks = false;
|
|
+
|
|
+ private int getExtraCollisionFlags() {
|
|
+ int flags = 0;
|
|
+
|
|
+ if (this.loadChunks) {
|
|
+ flags |= io.papermc.paper.util.CollisionUtil.COLLISION_FLAG_LOAD_CHUNKS | io.papermc.paper.util.CollisionUtil.COLLISION_FLAG_ADD_TICKET;
|
|
+ }
|
|
+
|
|
+ return flags;
|
|
+ }
|
|
+ // Sakura end - load chunks on cannon entity movement
|
|
|
|
public Entity(EntityType<?> type, Level world) {
|
|
this.id = Entity.ENTITY_COUNTER.incrementAndGet();
|
|
@@ -1555,7 +1568,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
|
|
io.papermc.paper.util.CollisionUtil.getCollisions(
|
|
world, this, collisionBox, potentialCollisionsVoxel, potentialCollisionsBB,
|
|
- io.papermc.paper.util.CollisionUtil.COLLISION_FLAG_CHECK_BORDER,
|
|
+ io.papermc.paper.util.CollisionUtil.COLLISION_FLAG_CHECK_BORDER | this.getExtraCollisionFlags(), // Sakura
|
|
null, null
|
|
);
|
|
|
|
@@ -4957,12 +4970,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
|
|
@Override
|
|
public boolean shouldBeSaved() {
|
|
- return this.removalReason != null && !this.removalReason.shouldSave() ? false : (this.isPassenger() ? false : !this.isVehicle() || !this.hasAnyPlayerPassengers()); // Paper - rewrite chunk system - it should check if the entity has ANY player passengers
|
|
+ return this.removalReason != null && !this.removalReason.shouldSave() ? false : (this.loadChunks || this.isPassenger() ? false : !this.isVehicle() || !this.hasAnyPlayerPassengers()); // Sakura - used to determine whether a chunk should unload // Paper - rewrite chunk system - it should check if the entity has ANY player passengers
|
|
}
|
|
|
|
@Override
|
|
public boolean isAlwaysTicking() {
|
|
- return false;
|
|
+ return this.loadChunks; // Sakura - always tick in chunks
|
|
}
|
|
|
|
public boolean mayInteract(Level world, BlockPos pos) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
|
|
index 7da6420aed597ee1bf544059c79a063512adcd40..b6a4753252b748c06a62b7faa6b05c1fb904d62e 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
|
|
@@ -75,6 +75,7 @@ public class FallingBlockEntity extends Entity {
|
|
this.dropItem = true;
|
|
this.fallDamageMax = 40;
|
|
this.isFallingBlock = true; // Sakura
|
|
+ this.loadChunks = world.sakuraConfig().cannons.loadChunks; // Sakura - falling blocks load chunks
|
|
}
|
|
|
|
public FallingBlockEntity(Level world, double x, double y, double z, BlockState block) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
|
|
index bbf6b4f705b3e9b289a7fdf82a78ef02f777297d..09f09a8fbf0eee62295001ce5b7ed5329445d2b0 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
|
|
@@ -38,6 +38,7 @@ public class PrimedTnt extends Entity implements TraceableEntity {
|
|
super(type, world);
|
|
this.blocksBuilding = true;
|
|
this.isPrimedTNT = true; // Sakura
|
|
+ this.loadChunks = world.sakuraConfig().cannons.loadChunks; // Sakura - tnt load chunks
|
|
}
|
|
|
|
public PrimedTnt(Level world, double x, double y, double z, @Nullable LivingEntity igniter) {
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
|
index 14ee7b5b9b804bebd4e2a846b238547a28a36035..684ca1da2ca1d51f56461c60a900a5fc67e21ff3 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
|
@@ -220,6 +220,17 @@ public class LevelChunk extends ChunkAccess {
|
|
}
|
|
}
|
|
// Paper end
|
|
+ // Sakura start
|
|
+ private long lastMovementLoadTicket = 0;
|
|
+
|
|
+ public boolean movementLoadTicketRequiresUpdate() {
|
|
+ return net.minecraft.server.MinecraftServer.currentTickLong - this.lastMovementLoadTicket >= 100;
|
|
+ }
|
|
+
|
|
+ public void updatedMovementLoadTicket() {
|
|
+ this.lastMovementLoadTicket = net.minecraft.server.MinecraftServer.currentTickLong;
|
|
+ }
|
|
+ // Sakura end
|
|
|
|
public LevelChunk(ServerLevel world, ProtoChunk protoChunk, @Nullable LevelChunk.PostLoadProcessor entityLoader) {
|
|
this(world, protoChunk.getPos(), protoChunk.getUpgradeData(), protoChunk.unpackBlockTicks(), protoChunk.unpackFluidTicks(), protoChunk.getInhabitedTime(), protoChunk.getSections(), entityLoader, protoChunk.getBlendingData());
|