From f5931d678d029bcfec11029cff4f18a740d734b5 Mon Sep 17 00:00:00 2001 From: Cryptite Date: Wed, 13 Nov 2024 08:31:35 -0600 Subject: [PATCH] Much patch work --- ...e-Crit-to-PlayerPreAttackEntityEvent.patch | 35 ++++ ...reason-to-PlayerConnectionCloseEvent.patch | 66 ++++++++ patches/api/0008-ChunkStatusChangeEvent.patch | 73 +++++++++ .../api/0009-Equipment-Packet-Caching.patch | 154 ++++++++++++++++++ .../server/0005-Add-World-Instance-flag.patch | 4 +- .../0007-Allow-opening-covered-chests.patch | 36 ++++ ...e-Crit-to-PlayerPreAttackEntityEvent.patch | 19 +++ .../0009-Allow-access-to-LightEngine.patch | 19 +++ ...t-send-fire-packets-if-player-has-FR.patch | 23 +++ ...-Allow-inventory-clicks-in-Spectator.patch | 19 +++ ...reason-to-PlayerConnectionCloseEvent.patch | 18 ++ .../0013-Change-KeepAlive-interval.patch | 19 +++ .../server/0014-ChunkStatusChangeEvent.patch | 24 +++ 13 files changed, 507 insertions(+), 2 deletions(-) create mode 100644 patches/api/0006-Add-Force-Crit-to-PlayerPreAttackEntityEvent.patch create mode 100644 patches/api/0007-Add-reason-to-PlayerConnectionCloseEvent.patch create mode 100644 patches/api/0008-ChunkStatusChangeEvent.patch create mode 100644 patches/api/0009-Equipment-Packet-Caching.patch create mode 100644 patches/server/0007-Allow-opening-covered-chests.patch create mode 100644 patches/server/0008-Add-Force-Crit-to-PlayerPreAttackEntityEvent.patch create mode 100644 patches/server/0009-Allow-access-to-LightEngine.patch create mode 100644 patches/server/0010-Don-t-send-fire-packets-if-player-has-FR.patch create mode 100644 patches/server/0011-Allow-inventory-clicks-in-Spectator.patch create mode 100644 patches/server/0012-Add-reason-to-PlayerConnectionCloseEvent.patch create mode 100644 patches/server/0013-Change-KeepAlive-interval.patch create mode 100644 patches/server/0014-ChunkStatusChangeEvent.patch diff --git a/patches/api/0006-Add-Force-Crit-to-PlayerPreAttackEntityEvent.patch b/patches/api/0006-Add-Force-Crit-to-PlayerPreAttackEntityEvent.patch new file mode 100644 index 000000000..d307be32f --- /dev/null +++ b/patches/api/0006-Add-Force-Crit-to-PlayerPreAttackEntityEvent.patch @@ -0,0 +1,35 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 07:49:32 -0600 +Subject: [PATCH] Add Force Crit to PlayerPreAttackEntityEvent + + +diff --git a/src/main/java/io/papermc/paper/event/player/PrePlayerAttackEntityEvent.java b/src/main/java/io/papermc/paper/event/player/PrePlayerAttackEntityEvent.java +index a6c5818bcdd8de5f2d0e9bf72d1e3816652e0199..196d790d766548a2e4afc31820658ba493a1fe83 100644 +--- a/src/main/java/io/papermc/paper/event/player/PrePlayerAttackEntityEvent.java ++++ b/src/main/java/io/papermc/paper/event/player/PrePlayerAttackEntityEvent.java +@@ -28,6 +28,7 @@ public class PrePlayerAttackEntityEvent extends PlayerEvent implements Cancellab + private final boolean willAttack; + + private boolean cancelled; ++ private boolean forceCrit; // Slice + + @ApiStatus.Internal + public PrePlayerAttackEntityEvent(final Player player, final Entity attacked, final boolean willAttack) { +@@ -59,6 +60,16 @@ public class PrePlayerAttackEntityEvent extends PlayerEvent implements Cancellab + return this.willAttack; + } + ++ // Slice start ++ public boolean isForceCrit() { ++ return forceCrit; ++ } ++ ++ public void setForceCrit(boolean forceCrit) { ++ this.forceCrit = forceCrit; ++ } ++ // Slice end ++ + @Override + public boolean isCancelled() { + return this.cancelled; diff --git a/patches/api/0007-Add-reason-to-PlayerConnectionCloseEvent.patch b/patches/api/0007-Add-reason-to-PlayerConnectionCloseEvent.patch new file mode 100644 index 000000000..08068888f --- /dev/null +++ b/patches/api/0007-Add-reason-to-PlayerConnectionCloseEvent.patch @@ -0,0 +1,66 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 08:04:09 -0600 +Subject: [PATCH] Add reason to PlayerConnectionCloseEvent + + +diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerConnectionCloseEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerConnectionCloseEvent.java +index 5f5afcdb3c9e669ed0e730c720ad91d16b95602c..9447c571a514155cebc47a3bd9f6d0d79bdc8c97 100644 +--- a/src/main/java/com/destroystokyo/paper/event/player/PlayerConnectionCloseEvent.java ++++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerConnectionCloseEvent.java +@@ -7,6 +7,7 @@ import org.bukkit.event.HandlerList; + import org.bukkit.event.player.AsyncPlayerPreLoginEvent; + import org.bukkit.event.player.PlayerQuitEvent; + import org.jetbrains.annotations.ApiStatus; ++import org.jetbrains.annotations.NotNull; + import org.jspecify.annotations.NullMarked; + + /** +@@ -42,13 +43,19 @@ public class PlayerConnectionCloseEvent extends Event { + private final UUID playerUniqueId; + private final String playerName; + private final InetAddress ipAddress; ++ @NotNull private final ConnectionCloseReason reason; + + @ApiStatus.Internal + public PlayerConnectionCloseEvent(final UUID playerUniqueId, final String playerName, final InetAddress ipAddress, final boolean async) { ++ this(playerUniqueId, playerName, ipAddress, ConnectionCloseReason.NORMAL, async); ++ } ++ ++ public PlayerConnectionCloseEvent(@NotNull final UUID playerUniqueId, @NotNull final String playerName, @NotNull final InetAddress ipAddress, @NotNull ConnectionCloseReason reason, final boolean async) { + super(async); + this.playerUniqueId = playerUniqueId; + this.playerName = playerName; + this.ipAddress = ipAddress; ++ this.reason = reason; + } + + /** +@@ -80,4 +87,27 @@ public class PlayerConnectionCloseEvent extends Event { + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } ++ ++ ++ /** ++ * Returns the reason for the closed connection. ++ */ ++ @NotNull ++ public ConnectionCloseReason getReason() { ++ return this.reason; ++ } ++ ++ public enum ConnectionCloseReason { ++ /** ++ * Player disconnected normally ++ */ ++ NORMAL, ++ ++ /** ++ * Player has invalid data for some reason. ++ *

++ * One example of this is a player logging into an unloaded world. ++ */ ++ INVALID_PLAYER_DATA, ++ } + } diff --git a/patches/api/0008-ChunkStatusChangeEvent.patch b/patches/api/0008-ChunkStatusChangeEvent.patch new file mode 100644 index 000000000..4825201cd --- /dev/null +++ b/patches/api/0008-ChunkStatusChangeEvent.patch @@ -0,0 +1,73 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 08:07:59 -0600 +Subject: [PATCH] ChunkStatusChangeEvent + + +diff --git a/src/main/java/com/destroystokyo/paper/event/chunk/ChunkStatusChangeEvent.java b/src/main/java/com/destroystokyo/paper/event/chunk/ChunkStatusChangeEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..9154bc8a072d8e5f3fd9790606508af048a612eb +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/chunk/ChunkStatusChangeEvent.java +@@ -0,0 +1,61 @@ ++package com.destroystokyo.paper.event.chunk; ++ ++import org.bukkit.Chunk; ++import org.bukkit.event.Event; ++import org.bukkit.event.HandlerList; ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * Called when the Full Status of a Chunk changes ++ */ ++public class ChunkStatusChangeEvent extends Event { ++ ++ private static final HandlerList handlers = new HandlerList(); ++ private final Chunk chunk; ++ private final ChunkStatus currentState; ++ private final ChunkStatus newState; ++ ++ public ChunkStatusChangeEvent(@NotNull Chunk chunk, @NotNull ChunkStatus currentState, @NotNull ChunkStatus newState) { ++ super(); ++ this.chunk = chunk; ++ this.currentState = currentState; ++ this.newState = newState; ++ } ++ ++ @NotNull ++ public Chunk getChunk() { ++ return chunk; ++ } ++ ++ @NotNull ++ public ChunkStatus getCurrentState() { ++ return currentState; ++ } ++ ++ @NotNull ++ public ChunkStatus getNewState() { ++ return newState; ++ } ++ ++ public boolean isUpgrade() { ++ return newState.ordinal() > currentState.ordinal(); ++ } ++ ++ @Override ++ @NotNull ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++ ++ public enum ChunkStatus { ++ INACCESSIBLE, ++ FULL, ++ BLOCK_TICKING, ++ ENTITY_TICKING; ++ } ++} diff --git a/patches/api/0009-Equipment-Packet-Caching.patch b/patches/api/0009-Equipment-Packet-Caching.patch new file mode 100644 index 000000000..655a5633c --- /dev/null +++ b/patches/api/0009-Equipment-Packet-Caching.patch @@ -0,0 +1,154 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 08:29:41 -0600 +Subject: [PATCH] Equipment Packet Caching + + +diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java +index 68c08e7a212bc3e3885f9b5a4d9aef85fcb3b029..5395ec5d6ec33495516e792bdbbc97a7cef3038d 100644 +--- a/src/main/java/org/bukkit/entity/LivingEntity.java ++++ b/src/main/java/org/bukkit/entity/LivingEntity.java +@@ -1458,6 +1458,14 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource + void setBodyYaw(float bodyYaw); + // Paper end - body yaw API + ++ ++ // Slice start ++ /** ++ * @param p The player to send this entity's equipment packet to ++ */ ++ void sendEquipment(@NotNull Player p); ++ // Slice end ++ + // Paper start - Expose canUseSlot + /** + * Checks whether this entity can use the equipment slot. +diff --git a/src/main/java/org/bukkit/event/entity/EntityEquipmentItemLookup.java b/src/main/java/org/bukkit/event/entity/EntityEquipmentItemLookup.java +new file mode 100644 +index 0000000000000000000000000000000000000000..48d2eb3bbb8dbcb6714ee47c4159c0604657a78c +--- /dev/null ++++ b/src/main/java/org/bukkit/event/entity/EntityEquipmentItemLookup.java +@@ -0,0 +1,54 @@ ++package org.bukkit.event.entity; ++ ++import org.bukkit.entity.Entity; ++import org.bukkit.event.HandlerList; ++import org.bukkit.inventory.EquipmentSlot; ++import org.bukkit.inventory.ItemStack; ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * Called when requesting a cached equipment item lookup ++ */ ++public class EntityEquipmentItemLookup extends EntityEvent { ++ private static final HandlerList handlers = new HandlerList(); ++ private final String tag; ++ private final EquipmentSlot equipmentSlot; ++ private ItemStack itemStack; ++ ++ public EntityEquipmentItemLookup(@NotNull final Entity entity, @NotNull String tag, @NotNull EquipmentSlot slot, @NotNull final ItemStack itemStack) { ++ super(entity); ++ this.tag = tag; ++ this.equipmentSlot = slot; ++ this.itemStack = itemStack; ++ } ++ ++ @NotNull ++ public ItemStack getItemStack() { ++ return itemStack; ++ } ++ ++ public void setItemStack(@NotNull ItemStack itemStack) { ++ this.itemStack = itemStack; ++ } ++ ++ @NotNull ++ public EquipmentSlot getEquipmentSlot() { ++ return equipmentSlot; ++ } ++ ++ @NotNull ++ public String getTag() { ++ return tag; ++ } ++ ++ @NotNull ++ @Override ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} +diff --git a/src/main/java/org/bukkit/event/player/PlayerReceiveEquipmentEvent.java b/src/main/java/org/bukkit/event/player/PlayerReceiveEquipmentEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..a8f83d19341c2f3024ba8113478ed482657b8589 +--- /dev/null ++++ b/src/main/java/org/bukkit/event/player/PlayerReceiveEquipmentEvent.java +@@ -0,0 +1,63 @@ ++package org.bukkit.event.player; ++ ++import org.bukkit.entity.Entity; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++/** ++ * Called when a player is about to receive an equipment packet about another player ++ */ ++public class PlayerReceiveEquipmentEvent extends PlayerEvent implements Cancellable { ++ private static final HandlerList handlers = new HandlerList(); ++ private final Entity tracked; ++ private boolean cancel; ++ private String tag; ++ ++ public PlayerReceiveEquipmentEvent(@NotNull final Player player, @NotNull final Entity tracked) { ++ super(player); ++ this.tracked = tracked; ++ } ++ ++ /** ++ * Gets the tracked entity ++ * ++ * @return Entity the player is now tracking ++ */ ++ @NotNull ++ public Entity getTracked() { ++ return tracked; ++ } ++ ++ @Nullable ++ public String getTag() { ++ return tag; ++ } ++ ++ public void setTag(@Nullable String tag) { ++ this.tag = tag; ++ } ++ ++ @Override ++ public boolean isCancelled() { ++ return cancel; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancel = cancel; ++ } ++ ++ @NotNull ++ @Override ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} diff --git a/patches/server/0005-Add-World-Instance-flag.patch b/patches/server/0005-Add-World-Instance-flag.patch index ea7c3e349..75cf131e8 100644 --- a/patches/server/0005-Add-World-Instance-flag.patch +++ b/patches/server/0005-Add-World-Instance-flag.patch @@ -17,10 +17,10 @@ index 3b6b6483bf855493948417f44f06427b625bc910..7bdbe1f2fa31781b7bd7b12c555b1b66 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 +index 3134fab97260897601d7c8e2810f11b8be86dbec..55e46aa1b3f6bb3a868e6a4b0e74a522b1e32c01 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 { +@@ -1341,6 +1341,18 @@ public class CraftWorld extends CraftRegionAccessor implements World { this.world.noSave = !value; } diff --git a/patches/server/0007-Allow-opening-covered-chests.patch b/patches/server/0007-Allow-opening-covered-chests.patch new file mode 100644 index 000000000..a1682ade9 --- /dev/null +++ b/patches/server/0007-Allow-opening-covered-chests.patch @@ -0,0 +1,36 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 07:44:28 -0600 +Subject: [PATCH] Allow opening covered chests + + +diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java +index edef8fc62f8dba1b57214d8d7d805ff0d83f4114..c948eb36db7f902ce65523e19651057e39a1a8ad 100644 +--- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java +@@ -341,9 +341,7 @@ public class ChestBlock extends AbstractChestBlock implements + } + + public static boolean isBlockedChestByBlock(BlockGetter world, BlockPos pos) { +- BlockPos blockposition1 = pos.above(); +- +- return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); ++ return false; // Slice + } + + private static boolean isCatSittingOnChest(LevelAccessor world, BlockPos pos) { +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java +index f45ee675a10729845bf376fa95e648b23b9aac12..bb59827851262051bc832f32bf54877b6a896990 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java +@@ -62,9 +62,7 @@ public class CraftEnderChest extends CraftBlockEntityState +Date: Wed, 13 Nov 2024 07:49:32 -0600 +Subject: [PATCH] Add Force Crit to PlayerPreAttackEntityEvent + + +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 61d412c4f1ebd55661cc3f0260468e3ac0efe0bb..551da84c834132d106457c123e1b195e4be904b8 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Player.java ++++ b/src/main/java/net/minecraft/world/entity/player/Player.java +@@ -1269,7 +1269,7 @@ public abstract class Player extends LivingEntity { + } + + f += itemstack.getItem().getAttackDamageBonus(target, f, damagesource); +- boolean flag2 = flag && this.fallDistance > 0.0F && !this.onGround() && !this.onClimbable() && !this.isInWater() && !this.hasEffect(MobEffects.BLINDNESS) && !this.isPassenger() && target instanceof LivingEntity && !this.isSprinting(); ++ boolean flag2 = playerAttackEntityEvent.isForceCrit() || (flag && this.fallDistance > 0.0F && !this.onGround() && !this.onClimbable() && !this.isInWater() && !this.hasEffect(MobEffects.BLINDNESS) && !this.isPassenger() && target instanceof LivingEntity && !this.isSprinting()); // Slice + + flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits + if (flag2) { diff --git a/patches/server/0009-Allow-access-to-LightEngine.patch b/patches/server/0009-Allow-access-to-LightEngine.patch new file mode 100644 index 000000000..c606aa2d1 --- /dev/null +++ b/patches/server/0009-Allow-access-to-LightEngine.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 07:54:14 -0600 +Subject: [PATCH] Allow access to LightEngine + + +diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java +index 5b3a886c624b36557cbfaccdc3fb05a46a4ba36a..50a5514c9109f71926594d3f4786bd0995fc2d84 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java +@@ -298,7 +298,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + return ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)this.level).moonrise$getPlayerChunkLoader().isChunkSent(player, chunkX, chunkZ, true); // Paper - rewrite chunk system + } + +- protected ThreadedLevelLightEngine getLightEngine() { ++ public ThreadedLevelLightEngine getLightEngine() { // Slice (public) + return this.lightEngine; + } + diff --git a/patches/server/0010-Don-t-send-fire-packets-if-player-has-FR.patch b/patches/server/0010-Don-t-send-fire-packets-if-player-has-FR.patch new file mode 100644 index 000000000..2054ba565 --- /dev/null +++ b/patches/server/0010-Don-t-send-fire-packets-if-player-has-FR.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 07:55:27 -0600 +Subject: [PATCH] Don't send fire packets if player has FR + + +diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java +index 8be1b051543cda2b2e9e3d337834757e53f442de..64a5c8f8918284d61619adcad3040f5ef70e8ef0 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -985,7 +985,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + + this.checkBelowWorld(); + if (!this.level().isClientSide) { +- this.setSharedFlagOnFire(this.remainingFireTicks > 0); ++ if (this instanceof net.minecraft.world.entity.LivingEntity livingEntity) { ++ this.setSharedFlagOnFire(this.remainingFireTicks > 0 && !livingEntity.hasEffect(net.minecraft.world.effect.MobEffects.FIRE_RESISTANCE)); ++ } else { ++ this.setSharedFlagOnFire(this.remainingFireTicks > 0); ++ } + } + + this.firstTick = false; diff --git a/patches/server/0011-Allow-inventory-clicks-in-Spectator.patch b/patches/server/0011-Allow-inventory-clicks-in-Spectator.patch new file mode 100644 index 000000000..130aac9b7 --- /dev/null +++ b/patches/server/0011-Allow-inventory-clicks-in-Spectator.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 07:58:14 -0600 +Subject: [PATCH] Allow inventory clicks in Spectator + + +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index b5d5dbc50a7b8c40739a15f164ffd08fdc534f9c..7644dfe30a51295ac3fa59384153c839fa781c01 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -2991,7 +2991,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + if (this.player.isImmobile()) return; // CraftBukkit + this.player.resetLastActionTime(); + if (this.player.containerMenu.containerId == packet.getContainerId() && this.player.containerMenu.stillValid(this.player)) { // CraftBukkit +- boolean cancelled = this.player.isSpectator(); // CraftBukkit - see below if ++ boolean cancelled = false; //Slice - allow spectator inv management this.player.isSpectator(); // CraftBukkit - see below if + if (false/*this.player.isSpectator()*/) { // CraftBukkit + this.player.containerMenu.sendAllDataToRemote(); + } else if (!this.player.containerMenu.stillValid(this.player)) { diff --git a/patches/server/0012-Add-reason-to-PlayerConnectionCloseEvent.patch b/patches/server/0012-Add-reason-to-PlayerConnectionCloseEvent.patch new file mode 100644 index 000000000..b6d69406f --- /dev/null +++ b/patches/server/0012-Add-reason-to-PlayerConnectionCloseEvent.patch @@ -0,0 +1,18 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 08:04:09 -0600 +Subject: [PATCH] Add reason to PlayerConnectionCloseEvent + + +diff --git a/src/main/java/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java +index 880e5c52746e9e3a9a1f42ec6461be54e3ee136c..e8eeb1aaeec6d87af949e249d0ffd0856bfd71b1 100644 +--- a/src/main/java/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java +@@ -180,6 +180,7 @@ public class ServerConfigurationPacketListenerImpl extends ServerCommonPacketLis + // Paper end - Debugging + this.connection.send(new ClientboundDisconnectPacket(ServerConfigurationPacketListenerImpl.DISCONNECT_REASON_INVALID_DATA)); + this.connection.disconnect(ServerConfigurationPacketListenerImpl.DISCONNECT_REASON_INVALID_DATA); ++ new com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent(this.gameProfile.getId(), this.gameProfile.getName(), ((java.net.InetSocketAddress)this.connection.address).getAddress(), com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent.ConnectionCloseReason.INVALID_PLAYER_DATA, false).callEvent(); // Slice + } + + } diff --git a/patches/server/0013-Change-KeepAlive-interval.patch b/patches/server/0013-Change-KeepAlive-interval.patch new file mode 100644 index 000000000..1ce877266 --- /dev/null +++ b/patches/server/0013-Change-KeepAlive-interval.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 08:04:58 -0600 +Subject: [PATCH] Change KeepAlive interval + + +diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +index b0bc66dc7248aae691dcab68b925b52a1695e63f..7096cbc201cd18e71b5da6b825fca83201ada1a3 100644 +--- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +@@ -261,7 +261,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + long currentTime = Util.getMillis(); + long elapsedTime = currentTime - this.keepAliveTime; + +- if (!this.isSingleplayerOwner() && elapsedTime >= 15000L) { // Paper - use vanilla's 15000L between keep alive packets ++ if (!this.isSingleplayerOwner() && elapsedTime >= 5000L) { // Paper - use vanilla's 15000L between keep alive packets // Slice -> 5s + if (this.keepAlivePending && !this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // Paper - check keepalive limit, don't fire if already disconnected + this.disconnect(ServerCommonPacketListenerImpl.TIMEOUT_DISCONNECTION_MESSAGE, PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause + } else if (this.checkIfClosed(currentTime)) { // Paper diff --git a/patches/server/0014-ChunkStatusChangeEvent.patch b/patches/server/0014-ChunkStatusChangeEvent.patch new file mode 100644 index 000000000..0023650e9 --- /dev/null +++ b/patches/server/0014-ChunkStatusChangeEvent.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Wed, 13 Nov 2024 08:07:59 -0600 +Subject: [PATCH] ChunkStatusChangeEvent + + +diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java +index eafa4e6d55cd0f9314ac0f2b96a7f48fbb5e1a4c..1c39f73a10a05b792adf4d98b7db24edb2938030 100644 +--- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java ++++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java +@@ -1261,6 +1261,13 @@ public final class NewChunkHolder { + // note: currentChunk must be LevelChunk, as current != pending which means that at least one is not ACCESSIBLE + final LevelChunk chunk = (LevelChunk)this.currentChunk; + ++ // Slice start ++ new com.destroystokyo.paper.event.chunk.ChunkStatusChangeEvent(new org.bukkit.craftbukkit.CraftChunk(chunk), ++ com.destroystokyo.paper.event.chunk.ChunkStatusChangeEvent.ChunkStatus.valueOf(currState.name()), ++ com.destroystokyo.paper.event.chunk.ChunkStatusChangeEvent.ChunkStatus.valueOf(nextState.name())) ++ .callEvent(); ++ // Slice end ++ + // Note: we assume that only load/unload contain plugin logic + // plugin logic is anything stupid enough to possibly change the chunk status while it is already + // being changed (i.e during load it is possible it will try to set to full ticking)