diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java index 6bef2fecf..1bc6d280d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.entity.projectile; +import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent; import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent; import io.papermc.paper.event.player.PlayerStopUsingItemEvent; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; @@ -21,6 +22,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.event.world.EntitiesLoadEvent; @@ -57,18 +59,20 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { return Optional.ofNullable(this.projectiles.get(entityId)); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onProjectileLaunch(ProjectileLaunchEvent event) { - Projectile projectile = event.getEntity(); - handleProjectileLoad(projectile); + handleProjectileLoad(event.getEntity()); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void onEntitiesLoad(EntitiesLoadEvent event) { - for (Entity entity : event.getEntities()) { - if (entity instanceof Projectile projectile) { - handleProjectileLoad(projectile); - } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onEntityPortal(EntityPortalEvent event) { + this.projectiles.remove(event.getEntity().getEntityId()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onEntityAdd(EntityAddToWorldEvent event) { + if (event.getEntity() instanceof Projectile projectile) { + handleProjectileLoad(projectile); } } @@ -99,10 +103,9 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { @EventHandler public void onPlayerInteract(PlayerItemConsumeEvent event) { - ItemStack item = event.getItem(); - String type = getType(item); + String type = getType(event.getItem()); if (type == null) return; - if (type.equals("bow") || type.equals("spear")) { + if (type.equals("bow") || type.equals("trident")) { event.setCancelled(true); } } @@ -114,17 +117,14 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { if (type == null) return; int ticksHeldFor = event.getTicksHeldFor(); Player player = event.getPlayer(); - if (type.equals("bow")) { - if (ticksHeldFor < 3) return; - // player.sendMessage("可以投出自定义弓: " + item.getType() + " 持续 " + ticksHeldFor + " 刻"); - } else if (type.equals("trident")) { + if (type.equals("trident")) { if (ticksHeldFor < 10) return; - // player.sendMessage("可以投出自定义三叉戟: " + item.getType() + " 持续 " + ticksHeldFor + " 刻"); Object nmsItemStack = FastNMS.INSTANCE.field$CraftItemStack$handle(item); Object nmsServerLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(player.getWorld()); Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(player); - boolean success = TridentRelease.releaseUsing(nmsItemStack, nmsServerLevel, nmsEntity); - // player.sendMessage("释放成功: " + success); + TridentRelease.releaseUsing(nmsItemStack, nmsServerLevel, nmsEntity); + } else if (type.equals("bow")) { + if (ticksHeldFor < 3) return; } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java index 9062dc5b6..f08eca613 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.gui.*; +import net.momirealms.craftengine.core.util.ReflectionUtils; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -16,9 +17,11 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.MenuType; public class BukkitGuiManager implements GuiManager, Listener { + private static final boolean useNewOpenInventory = ReflectionUtils.getDeclaredMethod(InventoryView.class, void.class, new String[]{"open"}) != null; private final BukkitCraftEngine plugin; public BukkitGuiManager(BukkitCraftEngine plugin) { @@ -39,7 +42,7 @@ public class BukkitGuiManager implements GuiManager, Listener { @Override public void openInventory(net.momirealms.craftengine.core.entity.player.Player player, GuiType guiType) { Player bukkitPlayer = (Player) player.platformPlayer(); - if (VersionHelper.isOrAbove1_21_4()) { + if (useNewOpenInventory) { switch (guiType) { case ANVIL -> MenuType.ANVIL.create(bukkitPlayer).open(); case LOOM -> MenuType.LOOM.create(bukkitPlayer).open(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index e110d229a..66f26b85a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -1728,7 +1728,7 @@ public class PacketConsumers { .withParameter(DirectContextParameters.FURNITURE, furniture) .withParameter(DirectContextParameters.POSITION, furniture.position()) ); - furniture.config().execute(context, EventTrigger.RIGHT_CLICK);; + furniture.config().execute(context, EventTrigger.RIGHT_CLICK); if (player.isSneaking()) { // try placing another furniture above it