9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2025-12-24 01:19:19 +00:00

Update Paper (#261)

This commit is contained in:
Bluemangoo
2024-07-19 20:38:04 +08:00
committed by GitHub
parent a872cd0de5
commit 3992c7945f
38 changed files with 436 additions and 464 deletions

View File

@@ -34,7 +34,7 @@ index 35772110e9318df46a2729dbc0b5879b290011b7..f26989a44cdda9baabf337d573436c6c
Set<CriterionTrigger.Listener<T>> set = (Set) playerAdvancements.criterionData.get(this); // Paper - fix AdvancementDataPlayer leak
if (set != null && !set.isEmpty()) {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 785aa6eeb299eb70bbea64631c1c8262ed3cb4ad..778a8c8a88128107b7ccd9bb4a783c0b519da9b1 100644
index fc8bbbf40c1d74dbb03bcf699a000337a653b4b2..471ded84bdd3e59a75cfa34aac16bb726f80ba28 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -745,6 +745,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -46,7 +46,7 @@ index 785aa6eeb299eb70bbea64631c1c8262ed3cb4ad..778a8c8a88128107b7ccd9bb4a783c0b
this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD);
if (io.papermc.paper.plugin.PluginInitializerManager.instance().pluginRemapper != null) io.papermc.paper.plugin.PluginInitializerManager.instance().pluginRemapper.pluginsEnabled(); // Paper - Remap plugins
io.papermc.paper.command.brigadier.PaperCommands.INSTANCE.setValid(); // Paper - reset invalid state for event fire below
@@ -1040,6 +1042,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1031,6 +1033,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
MinecraftServer.LOGGER.info("Stopping server");
Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing
@@ -71,10 +71,10 @@ index 9fabf9322acd663c4452b562494e74aa42eb19da..b5f18a0115b629930de84a9d086505ad
AdvancementProgress advancementprogress = this.getOrStartProgress(advancement);
boolean flag1 = advancementprogress.isDone();
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index 61cc6f42be6115f3b634b57d6fb1ee9f7a2a8ef1..b729402e93f1b7847d7bd90af12e155030030bdd 100644
index dba161d9024db15c5267738535250fb154f45a5a..80bffea97a6bb12b92c1644a1f1d547783454060 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -1301,6 +1301,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -1268,6 +1268,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
} else if (this.seenBy.remove(player.connection)) {
this.serverEntity.removePairing(player);
@@ -89,7 +89,7 @@ index 61cc6f42be6115f3b634b57d6fb1ee9f7a2a8ef1..b729402e93f1b7847d7bd90af12e1550
}
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
index 176d02ede3e0b727c3619a51af5c2d953ee18de9..782b831f62cd2304fd70b22d468d9f990655ac72 100644
index 71f1b5eb1d2b3d9fb0436c842b479c30976be3f6..0a89705b7a363ecab1a86107351364ca98f5e4cf 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -228,6 +228,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
@@ -100,7 +100,7 @@ index 176d02ede3e0b727c3619a51af5c2d953ee18de9..782b831f62cd2304fd70b22d468d9f99
public LevelChunk getChunkIfLoaded(int x, int z) {
return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately
@@ -622,6 +623,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
@@ -632,6 +633,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
this.chunkTaskScheduler = new ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler((ServerLevel)(Object)this, ca.spottedleaf.moonrise.common.util.MoonriseCommon.WORKER_POOL);
// Paper end - rewrite chunk system
this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit
@@ -108,7 +108,7 @@ index 176d02ede3e0b727c3619a51af5c2d953ee18de9..782b831f62cd2304fd70b22d468d9f99
}
// Paper start
@@ -2000,6 +2002,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
@@ -2067,6 +2069,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
return this.players;
}
@@ -121,7 +121,7 @@ index 176d02ede3e0b727c3619a51af5c2d953ee18de9..782b831f62cd2304fd70b22d468d9f99
@Override
public void onBlockStateChange(BlockPos pos, BlockState oldBlock, BlockState newBlock) {
Optional<Holder<PoiType>> optional = PoiTypes.forState(oldBlock);
@@ -2471,6 +2479,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
@@ -2538,6 +2546,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
// ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server; moved down below valid=true
if (entity instanceof ServerPlayer entityplayer) {
ServerLevel.this.players.add(entityplayer);
@@ -133,7 +133,7 @@ index 176d02ede3e0b727c3619a51af5c2d953ee18de9..782b831f62cd2304fd70b22d468d9f99
ServerLevel.this.updateSleepingPlayerList();
}
@@ -2548,6 +2561,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
@@ -2615,6 +2628,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
ServerLevel.this.getChunkSource().removeEntity(entity);
if (entity instanceof ServerPlayer entityplayer) {
ServerLevel.this.players.remove(entityplayer);
@@ -146,10 +146,10 @@ index 176d02ede3e0b727c3619a51af5c2d953ee18de9..782b831f62cd2304fd70b22d468d9f99
}
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
index 9d1e68c09fa7093cf0f6fa636f90cb15a44cbb38..9f32ed6b7f7c3dc0175cadf811956991b136be23 100644
index 5980b70e2d7273239245237189b2debcbccfbac3..40dfc96bbcd1f85a5917c458ae3a8e3c1574c667 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -210,7 +210,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
@@ -212,7 +212,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
private static final AttributeModifier CREATIVE_ENTITY_INTERACTION_RANGE_MODIFIER = new AttributeModifier(ResourceLocation.withDefaultNamespace("creative_mode_entity_range"), 2.0D, AttributeModifier.Operation.ADD_VALUE);
public ServerGamePacketListenerImpl connection;
public final MinecraftServer server;
@@ -158,7 +158,7 @@ index 9d1e68c09fa7093cf0f6fa636f90cb15a44cbb38..9f32ed6b7f7c3dc0175cadf811956991
private final PlayerAdvancements advancements;
private final ServerStatsCounter stats;
private float lastRecordedHealthAndAbsorption = Float.MIN_VALUE;
@@ -771,16 +771,20 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
@@ -770,16 +770,20 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
--this.invulnerableTime;
}
@@ -188,7 +188,7 @@ index 9d1e68c09fa7093cf0f6fa636f90cb15a44cbb38..9f32ed6b7f7c3dc0175cadf811956991
Entity entity = this.getCamera();
@@ -796,7 +800,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
@@ -795,7 +799,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
}
}
@@ -197,7 +197,7 @@ index 9d1e68c09fa7093cf0f6fa636f90cb15a44cbb38..9f32ed6b7f7c3dc0175cadf811956991
if (this.levitationStartPos != null) {
CriteriaTriggers.LEVITATION.trigger(this, this.levitationStartPos, this.tickCount - this.levitationStartTime);
}
@@ -1016,7 +1020,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
@@ -1015,7 +1019,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
List<DefaultDrop> loot = new java.util.ArrayList<>(this.getInventory().getContainerSize()); // Paper - Restore vanilla drops behavior
boolean keepInventory = this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator();
@@ -206,7 +206,7 @@ index 9d1e68c09fa7093cf0f6fa636f90cb15a44cbb38..9f32ed6b7f7c3dc0175cadf811956991
for (ItemStack item : this.getInventory().getContents()) {
if (!item.isEmpty() && !EnchantmentHelper.has(item, EnchantmentEffectComponents.PREVENT_EQUIPMENT_DROP)) {
loot.add(new DefaultDrop(item, stack -> this.drop(stack, true, false, false))); // Paper - Restore vanilla drops behavior; drop function taken from Inventory#dropAll (don't fire drop event)
@@ -1418,6 +1422,13 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
@@ -1417,6 +1421,13 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
this.lastSentHealth = -1.0F;
this.lastSentFood = -1;
@@ -221,7 +221,7 @@ index 9d1e68c09fa7093cf0f6fa636f90cb15a44cbb38..9f32ed6b7f7c3dc0175cadf811956991
PlayerChangedWorldEvent changeEvent = new PlayerChangedWorldEvent(this.getBukkitEntity(), worldserver1.getWorld());
this.level().getCraftServer().getPluginManager().callEvent(changeEvent);
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
index ad1aae2c06cae2f0c9756175a61dd32d8e7701ea..3d196ce60afd638867a337ecfa3dbe5a29e8c7e0 100644
index 8ccd40b562691e757c7b5efa1497d93a95040a9a..901e9ff7a89b48b7acca7e5b96f640045c1d265e 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -123,6 +123,8 @@ import org.bukkit.event.player.PlayerRespawnEvent.RespawnReason;
@@ -255,7 +255,7 @@ index ad1aae2c06cae2f0c9756175a61dd32d8e7701ea..3d196ce60afd638867a337ecfa3dbe5a
final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage();
if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure
@@ -936,6 +953,13 @@ public abstract class PlayerList {
@@ -937,6 +954,13 @@ public abstract class PlayerList {
}
// Paper end - Add PlayerPostRespawnEvent
@@ -269,7 +269,7 @@ index ad1aae2c06cae2f0c9756175a61dd32d8e7701ea..3d196ce60afd638867a337ecfa3dbe5a
// CraftBukkit end
return entityplayer1;
@@ -1068,11 +1092,16 @@ public abstract class PlayerList {
@@ -1069,11 +1093,16 @@ public abstract class PlayerList {
}
public String[] getPlayerNamesArray() {
@@ -287,7 +287,7 @@ index ad1aae2c06cae2f0c9756175a61dd32d8e7701ea..3d196ce60afd638867a337ecfa3dbe5a
return astring;
}
@@ -1539,4 +1568,16 @@ public abstract class PlayerList {
@@ -1553,4 +1582,16 @@ public abstract class PlayerList {
public boolean isAllowCommandsForAllPlayers() {
return this.allowCommandsForAllPlayers;
}
@@ -305,7 +305,7 @@ index ad1aae2c06cae2f0c9756175a61dd32d8e7701ea..3d196ce60afd638867a337ecfa3dbe5a
+ // Leaves end - fakeplayer support
}
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index d582615c0ca9f483f1da31e91e66b22129881d63..ed607672adc50f2929ee333fa2de29aa6e0f3bd5 100644
index bea901be9d4d86cc016cc48a16f2775cf92d98d9..36577e641ef0cdc5bf273389ae92f0b83d13d78f 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -1455,7 +1455,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@@ -383,7 +383,7 @@ index 1b1b475ca27e799e251d6f8a8c9fe1a4fd8bae83..bb9d8cb957f5be517d3ae2959e0406af
if (randomsource.nextInt(j) >= world.paperConfig().entities.behavior.playerInsomniaStartTicks) { // Paper - Ability to control player's insomnia and phantoms
BlockPos blockposition1 = blockposition.above(20 + randomsource.nextInt(15)).east(-10 + randomsource.nextInt(21)).south(-10 + randomsource.nextInt(21));
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index cb4922442cb696e587d07022e152c4fd9a21ca6f..1c7c0e4c5e78b9b4c0046345d71bade4acb730e9 100644
index fbefffa0c43419e77ec8430db37698befc85837c..9739ec88134c810c0d13b23a9c8ac75d78d319f1 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -309,6 +309,7 @@ public final class CraftServer implements Server {
@@ -394,7 +394,7 @@ index cb4922442cb696e587d07022e152c4fd9a21ca6f..1c7c0e4c5e78b9b4c0046345d71bade4
// Paper start - Folia region threading API
private final io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler();
@@ -1450,7 +1451,7 @@ public final class CraftServer implements Server {
@@ -1459,7 +1460,7 @@ public final class CraftServer implements Server {
return false;
}
@@ -403,7 +403,7 @@ index cb4922442cb696e587d07022e152c4fd9a21ca6f..1c7c0e4c5e78b9b4c0046345d71bade4
return false;
}
@@ -3216,4 +3217,11 @@ public final class CraftServer implements Server {
@@ -3225,4 +3226,11 @@ public final class CraftServer implements Server {
return this.potionBrewer;
}
// Paper end
@@ -416,7 +416,7 @@ index cb4922442cb696e587d07022e152c4fd9a21ca6f..1c7c0e4c5e78b9b4c0046345d71bade4
+ // Leaves end - Bot API
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 8045d6c9398d1c88595da6e41aa1ed27fb6fbad0..74f4938c88b547c326c335aac09ab47fed3ea588 100644
index 362ca138a5cd5ad19f1300015c2571794adc3649..7daa86bff793c040a10125e033b36fbd59a09a05 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -210,7 +210,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@@ -481,10 +481,10 @@ index 2cde808bfa797256409879505ba205a71f381981..a007beca6c00bce4514889935b1762a3
if (entity instanceof EnderDragonPart complexPart) {
if (complexPart.parentMob instanceof EnderDragon) {
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 9c7cd9387f90d061aec76f7f0451a1da8b42ea3d..7c6de0ad3b919043b95429a4e506d63d32543598 100644
index 0ab53d46f0b8f3f3791dd01766738522c86932e8..f60301047fc22fb72413fe95eb89e4d26e947806 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -1018,7 +1018,10 @@ public class CraftEventFactory {
@@ -1021,7 +1021,10 @@ public class CraftEventFactory {
event.setKeepInventory(keepInventory);
event.setKeepLevel(victim.keepLevel); // SPIGOT-2222: pre-set keepLevel
populateFields(victim, event); // Paper - make cancellable
@@ -497,15 +497,15 @@ index 9c7cd9387f90d061aec76f7f0451a1da8b42ea3d..7c6de0ad3b919043b95429a4e506d63d
if (event.isCancelled()) {
return event;
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
index bb9383f1a457433f9db3e78d7913616280925200..55b41ca7630db143d70137324a9de8717397f0e8 100644
index 22f1ed383313829b8af4badda9ef8dc85cae8fd1..764a8b623b91acca040699839c52c2ecec6842ee 100644
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
@@ -46,7 +46,7 @@ import org.bukkit.scheduler.BukkitWorker;
@@ -46,6 +46,8 @@ import org.bukkit.scheduler.BukkitWorker;
*/
public class CraftScheduler implements BukkitScheduler {
- static Plugin MINECRAFT = new MinecraftInternalPlugin();
+ public static Plugin MINECRAFT = new MinecraftInternalPlugin(); // Leaves - package -> public
+ public static final Plugin SERVER = new org.bukkit.plugin.java.JavaPlugin(){}; // Leaves - run async task
+
/**
* The start ID for the counter.
*/
@@ -1401,7 +1401,7 @@ index 0000000000000000000000000000000000000000..0db337866c71283464d026a4f230016b
+}
diff --git a/src/main/java/org/leavesmc/leaves/bot/ServerBot.java b/src/main/java/org/leavesmc/leaves/bot/ServerBot.java
new file mode 100644
index 0000000000000000000000000000000000000000..0cb04bf5c5da387b295897997ae0692eb8baab6e
index 0000000000000000000000000000000000000000..47b207b6e24c4856304565ce1c9409ca7b6400f2
--- /dev/null
+++ b/src/main/java/org/leavesmc/leaves/bot/ServerBot.java
@@ -0,0 +1,745 @@
@@ -1644,7 +1644,7 @@ index 0000000000000000000000000000000000000000..0cb04bf5c5da387b295897997ae0692e
+
+ playerConnection.send(this.getAddEntityPacket(entityTracker.serverEntity));
+ if (login) {
+ Bukkit.getScheduler().runTaskLater(CraftScheduler.MINECRAFT, () -> {
+ Bukkit.getScheduler().runTaskLater(CraftScheduler.SERVER, () -> {
+ playerConnection.send(new ClientboundRotateHeadPacket(this, (byte) ((getYRot() * 256f) / 360f)));
+ }, 10);
+ } else {
@@ -2117,12 +2117,12 @@ index 0000000000000000000000000000000000000000..0cb04bf5c5da387b295897997ae0692e
+ }
+ return bot != null ? bot.getBukkitEntity() : null;
+ }
+ Bukkit.getScheduler().runTaskAsynchronously(CraftScheduler.MINECRAFT, () -> {
+ Bukkit.getScheduler().runTaskAsynchronously(CraftScheduler.SERVER, () -> {
+ if (skinName != null) {
+ this.skin = MojangAPI.getSkin(skinName);
+ }
+
+ Bukkit.getScheduler().runTask(CraftScheduler.MINECRAFT, () -> {
+ Bukkit.getScheduler().runTask(CraftScheduler.SERVER, () -> {
+ ServerBot bot = createBot(this);
+ if (bot != null && consumer != null) {
+ consumer.accept(bot);
@@ -3138,7 +3138,7 @@ index 0000000000000000000000000000000000000000..475bf440d40ac35720b01da18440cf0d
+}
diff --git a/src/main/java/org/leavesmc/leaves/bot/agent/actions/UseItemOnAction.java b/src/main/java/org/leavesmc/leaves/bot/agent/actions/UseItemOnAction.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe8c4ba7aff74dc297bdf4e271a2d7f1229c357d
index 0000000000000000000000000000000000000000..81e6b4368014599ace20d371eb941faf9f5482a8
--- /dev/null
+++ b/src/main/java/org/leavesmc/leaves/bot/agent/actions/UseItemOnAction.java
@@ -0,0 +1,56 @@
@@ -3187,7 +3187,7 @@ index 0000000000000000000000000000000000000000..fe8c4ba7aff74dc297bdf4e271a2d7f1
+ BlockEntity entity = bot.serverLevel().getBlockEntity(blockHitResult.getBlockPos());
+ if (entity instanceof TrappedChestBlockEntity chestBlockEntity) {
+ chestBlockEntity.startOpen(bot);
+ Bukkit.getScheduler().runTaskLater(CraftScheduler.MINECRAFT, () -> chestBlockEntity.stopOpen(bot), 1);
+ Bukkit.getScheduler().runTaskLater(CraftScheduler.SERVER, () -> chestBlockEntity.stopOpen(bot), 1);
+ return true;
+ }
+ } else {
@@ -3200,7 +3200,7 @@ index 0000000000000000000000000000000000000000..fe8c4ba7aff74dc297bdf4e271a2d7f1
+}
diff --git a/src/main/java/org/leavesmc/leaves/bot/agent/actions/UseItemOnOffhandAction.java b/src/main/java/org/leavesmc/leaves/bot/agent/actions/UseItemOnOffhandAction.java
new file mode 100644
index 0000000000000000000000000000000000000000..a69ede01e5e5df31a144f98e9871183793f5f377
index 0000000000000000000000000000000000000000..8ef68e0e8a75760c974fdb0849f147aac0c168fa
--- /dev/null
+++ b/src/main/java/org/leavesmc/leaves/bot/agent/actions/UseItemOnOffhandAction.java
@@ -0,0 +1,56 @@
@@ -3249,7 +3249,7 @@ index 0000000000000000000000000000000000000000..a69ede01e5e5df31a144f98e98711837
+ BlockEntity entity = bot.serverLevel().getBlockEntity(blockHitResult.getBlockPos());
+ if (entity instanceof TrappedChestBlockEntity chestBlockEntity) {
+ chestBlockEntity.startOpen(bot);
+ Bukkit.getScheduler().runTaskLater(CraftScheduler.MINECRAFT, () -> chestBlockEntity.stopOpen(bot), 1);
+ Bukkit.getScheduler().runTaskLater(CraftScheduler.SERVER, () -> chestBlockEntity.stopOpen(bot), 1);
+ return true;
+ }
+ } else {