From 3483275cdfd7ca274cc1c66c9b37032d780dd5d8 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 10 May 2025 22:04:19 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BC=B9=E5=B0=84=E7=89=A9?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bettermodel/BetterModelModel.java | 4 +- .../modelengine/ModelEngineModel.java | 4 +- .../block/behavior/CropBlockBehavior.java | 2 +- .../block/behavior/GrassBlockBehavior.java | 2 +- .../block/behavior/SaplingBlockBehavior.java | 2 +- .../bukkit/entity/BukkitEntity.java | 4 +- .../furniture/BukkitFurnitureElement.java | 4 +- .../furniture/BukkitFurnitureManager.java | 2 + .../projectile/BukkitCustomProjectile.java | 14 ++ .../entity/projectile/BukkitProjectile.java | 11 ++ .../projectile/BukkitProjectileManager.java | 81 +++++++++ .../bukkit/item/ItemEventListener.java | 4 + .../bukkit/plugin/BukkitCraftEngine.java | 2 + .../plugin/command/feature/TestCommand.java | 2 +- .../plugin/network/PacketConsumers.java | 25 ++- .../FurnitureCollisionPacketHandler.java | 14 ++ .../handler/FurniturePacketHandler.java | 7 + ...dler.java => ProjectilePacketHandler.java} | 159 +++++++++--------- .../bukkit/util/ParticleUtils.java | 8 +- .../core/entity/AbstractEntity.java | 11 ++ .../entity/{furniture => }/Billboard.java | 2 +- .../core/entity/CustomTrident.java | 8 - .../craftengine/core/entity/Entity.java | 29 ++-- .../{furniture => }/ItemDisplayContext.java | 2 +- .../furniture/AbstractFurnitureElement.java | 2 + .../core/entity/furniture/ExternalModel.java | 4 +- .../entity/furniture/FurnitureElement.java | 2 + .../entity/furniture/FurnitureManager.java | 4 +- .../core/entity/player/Player.java | 4 +- .../projectile/AbstractCustomProjectile.java | 30 ++++ .../entity/projectile/CustomProjectile.java | 12 ++ .../core/entity/projectile/Projectile.java | 6 + .../entity/projectile/ProjectileManager.java | 10 ++ .../entity/projectile/ProjectileMeta.java | 9 + .../craftengine/core/item/ItemSettings.java | 23 +-- .../craftengine/core/plugin/CraftEngine.java | 10 ++ .../craftengine/core/plugin/Plugin.java | 3 + .../parameter/PlayerParameterProvider.java | 10 +- .../plugin/network/EntityPacketHandler.java | 6 + .../craftengine/core/util/Direction.java | 4 +- .../craftengine/core/world/HitResult.java | 4 +- 41 files changed, 389 insertions(+), 157 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectile.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/{CustomTridentPacketHandler.java => ProjectilePacketHandler.java} (60%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/entity/AbstractEntity.java rename core/src/main/java/net/momirealms/craftengine/core/entity/{furniture => }/Billboard.java (80%) delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/entity/CustomTrident.java rename core/src/main/java/net/momirealms/craftengine/core/entity/{furniture => }/ItemDisplayContext.java (86%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/entity/projectile/Projectile.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileManager.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelModel.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelModel.java index aeec3c863..5dfa9c816 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelModel.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/bettermodel/BetterModelModel.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.bukkit.compatibility.bettermodel; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel; public class BetterModelModel extends AbstractExternalModel { @@ -15,7 +15,7 @@ public class BetterModelModel extends AbstractExternalModel { } @Override - public void bindModel(Entity entity) { + public void bindModel(AbstractEntity entity) { org.bukkit.entity.Entity bukkitEntity = (org.bukkit.entity.Entity) entity.literalObject(); BetterModelUtils.bindModel(bukkitEntity, id()); } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineModel.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineModel.java index cba3b00ce..8ce03f0d6 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineModel.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineModel.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.bukkit.compatibility.modelengine; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel; public class ModelEngineModel extends AbstractExternalModel { @@ -15,7 +15,7 @@ public class ModelEngineModel extends AbstractExternalModel { } @Override - public void bindModel(Entity entity) { + public void bindModel(AbstractEntity entity) { org.bukkit.entity.Entity bukkitEntity = (org.bukkit.entity.Entity) entity.literalObject(); ModelEngineUtils.bindModel(bukkitEntity, id()); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index e5681c5fb..e4e6be99d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -159,7 +159,7 @@ public class CropBlockBehavior extends BushBlockBehavior { } FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, immutableBlockState.with(this.ageProperty, i).customBlockState().handle(), UpdateOption.UPDATE_ALL.flags()); if (sendParticles) { - world.spawnParticle(ParticleUtils.getParticle("HAPPY_VILLAGER"), x + 0.5, y + 0.5, z + 0.5, 15, 0.25, 0.25, 0.25); + world.spawnParticle(ParticleUtils.HAPPY_VILLAGER, x + 0.5, y + 0.5, z + 0.5, 15, 0.25, 0.25, 0.25); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/GrassBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/GrassBlockBehavior.java index 3b0c868bc..14b4efb72 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/GrassBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/GrassBlockBehavior.java @@ -52,7 +52,7 @@ public class GrassBlockBehavior extends BukkitBlockBehavior { int x = FastNMS.INSTANCE.field$Vec3i$x(blockPos); int y = FastNMS.INSTANCE.field$Vec3i$y(blockPos); int z = FastNMS.INSTANCE.field$Vec3i$z(blockPos); - world.spawnParticle(ParticleUtils.getParticle("HAPPY_VILLAGER"), x + 0.5, y + 1.5, z + 0.5, 20, 2, 0, 2); + world.spawnParticle(ParticleUtils.HAPPY_VILLAGER, x + 0.5, y + 1.5, z + 0.5, 20, 2, 0, 2); } return true; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java index 06d41970e..6242f1103 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java @@ -120,7 +120,7 @@ public class SaplingBlockBehavior extends BushBlockBehavior { int x = FastNMS.INSTANCE.field$Vec3i$x(blockPos); int y = FastNMS.INSTANCE.field$Vec3i$y(blockPos); int z = FastNMS.INSTANCE.field$Vec3i$z(blockPos); - world.spawnParticle(ParticleUtils.getParticle("HAPPY_VILLAGER"), x + 0.5, y + 0.5, z + 0.5, 15, 0.25, 0.25, 0.25); + world.spawnParticle(ParticleUtils.HAPPY_VILLAGER, x + 0.5, y + 0.5, z + 0.5, 15, 0.25, 0.25, 0.25); } return success; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java index d8bc859de..ce7748ec8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java @@ -2,14 +2,14 @@ package net.momirealms.craftengine.bukkit.entity; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.world.BukkitWorld; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; import java.lang.ref.WeakReference; -public class BukkitEntity extends Entity { +public class BukkitEntity extends AbstractEntity { private final WeakReference entity; public BukkitEntity(org.bukkit.entity.Entity entity) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java index f1b88b0fb..ec41936ac 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureElement.java @@ -5,8 +5,8 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.entity.furniture.AbstractFurnitureElement; -import net.momirealms.craftengine.core.entity.furniture.Billboard; -import net.momirealms.craftengine.core.entity.furniture.ItemDisplayContext; +import net.momirealms.craftengine.core.entity.Billboard; +import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.Key; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index e2d204063..ca76fb096 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -7,6 +7,8 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.network.handler.FurniturePacketHandler; import net.momirealms.craftengine.bukkit.util.EntityUtils; import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.entity.Billboard; +import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.pack.LoadingSequence; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java new file mode 100644 index 000000000..45c4193bd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.bukkit.entity.projectile; + +import net.momirealms.craftengine.core.entity.projectile.AbstractCustomProjectile; +import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; +import net.momirealms.craftengine.core.item.Item; +import org.bukkit.entity.Projectile; +import org.bukkit.inventory.ItemStack; + +public class BukkitCustomProjectile extends AbstractCustomProjectile { + + public BukkitCustomProjectile(ProjectileMeta meta, Projectile projectile, Item projectileItem) { + super(meta, new BukkitProjectile(projectile), projectileItem); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectile.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectile.java new file mode 100644 index 000000000..5ddf01516 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectile.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.bukkit.entity.projectile; + +import net.momirealms.craftengine.bukkit.entity.BukkitEntity; +import net.momirealms.craftengine.core.entity.projectile.Projectile; + +public class BukkitProjectile extends BukkitEntity implements Projectile { + + public BukkitProjectile(org.bukkit.entity.Projectile entity) { + super(entity); + } +} 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 new file mode 100644 index 000000000..371a024c6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java @@ -0,0 +1,81 @@ +package net.momirealms.craftengine.bukkit.entity.projectile; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.core.entity.projectile.CustomProjectile; +import net.momirealms.craftengine.core.entity.projectile.ProjectileManager; +import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; +import net.momirealms.craftengine.core.item.Item; +import org.bukkit.Bukkit; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.ThrowableProjectile; +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.EntityRemoveEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +public class BukkitProjectileManager implements Listener, ProjectileManager { + private static BukkitProjectileManager instance; + private final BukkitCraftEngine plugin; + private final Map projectiles; + + public BukkitProjectileManager(BukkitCraftEngine plugin) { + this.plugin = plugin; + this.projectiles = new ConcurrentHashMap<>(); + instance = this; + } + + @Override + public void delayedInit() { + Bukkit.getPluginManager().registerEvents(this, this.plugin.bootstrap()); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + } + + @Override + public Optional projectileByEntityId(int entityId) { + return Optional.ofNullable(this.projectiles.get(entityId)); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onProjectileLaunch(ProjectileLaunchEvent event) { + Projectile projectile = event.getEntity(); + ItemStack projectileItem; + if (projectile instanceof ThrowableProjectile throwableProjectile) { + projectileItem = throwableProjectile.getItem(); + } else if (projectile instanceof Arrow arrow) { + projectileItem = arrow.getItemStack(); + } else { + return; + } + System.out.println("发射"); + Item wrapped = this.plugin.itemManager().wrap(projectileItem); + if (wrapped == null) return; + wrapped.getCustomItem().ifPresent(it -> { + ProjectileMeta meta = it.settings().projectileMeta(); + if (meta != null) { + System.out.println("来啦"); + this.projectiles.put(projectile.getEntityId(), new BukkitCustomProjectile(meta, projectile, wrapped)); + } + }); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onEntityRemove(EntityRemoveEvent event) { + this.projectiles.remove(event.getEntity().getEntityId()); + } + + public static BukkitProjectileManager instance() { + return instance; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java index bc5e9772f..461ab6689 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java @@ -23,12 +23,16 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Arrow; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.ThrowableProjectile; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index 6d63a4cd7..499c2cd36 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.block.behavior.BukkitBlockBehaviors; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.entity.furniture.hitbox.BukkitHitBoxTypes; +import net.momirealms.craftengine.bukkit.entity.projectile.BukkitProjectileManager; import net.momirealms.craftengine.bukkit.font.BukkitFontManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.behavior.BukkitItemBehaviors; @@ -165,6 +166,7 @@ public class BukkitCraftEngine extends CraftEngine { super.vanillaLootManager = new BukkitVanillaLootManager(this); super.fontManager = new BukkitFontManager(this); super.advancementManager = new BukkitAdvancementManager(this); + super.projectileManager = new BukkitProjectileManager(this); super.onPluginEnable(); super.compatibilityManager().onEnable(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index 2dc46a53d..e31773b82 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -43,7 +43,7 @@ public class TestCommand extends BukkitCommandFeature { })) .required("displayType", ByteParser.byteParser((byte) 0, (byte) 8)) .required("translation", StringParser.stringParser()) - .required("rotationLeft", StringParser.stringParser()) + .required("rotation", StringParser.stringParser()) .handler(context -> { Player player = context.sender(); NamespacedKey namespacedKey = context.get("id"); 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 7aae1ac37..fa78617ab 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 @@ -12,15 +12,13 @@ import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import net.momirealms.craftengine.bukkit.entity.projectile.BukkitProjectileManager; import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.pack.BukkitPackManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; -import net.momirealms.craftengine.bukkit.plugin.network.handler.ArmorStandPacketHandler; -import net.momirealms.craftengine.bukkit.plugin.network.handler.BlockDisplayPacketHandler; -import net.momirealms.craftengine.bukkit.plugin.network.handler.FurniturePacketHandler; -import net.momirealms.craftengine.bukkit.plugin.network.handler.TextDisplayPacketHandler; +import net.momirealms.craftengine.bukkit.plugin.network.handler.*; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.*; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -1593,9 +1591,9 @@ public class PacketConsumers { public static final TriConsumer ADD_ENTITY = (user, event, packet) -> { try { Object entityType = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$type(packet); + int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { // Furniture - int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId); if (furniture != null) { user.entityPacketHandlers().computeIfAbsent(entityId, k -> new FurniturePacketHandler(furniture.fakeEntityIds())); @@ -1606,11 +1604,16 @@ public class PacketConsumers { } } else if (entityType == BukkitFurnitureManager.NMS_COLLISION_ENTITY_TYPE) { // Cancel collider entity packet - int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId); if (furniture != null) { event.setCancelled(true); + user.entityPacketHandlers().put(entityId, FurnitureCollisionPacketHandler.INSTANCE); } + } else { + BukkitProjectileManager.instance().projectileByEntityId(entityId).ifPresent(customProjectile -> { + event.replacePacket(ProjectilePacketHandler.convertAddCustomProjectPacket(packet)); + user.entityPacketHandlers().put(entityId, new ProjectilePacketHandler(customProjectile)); + }); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); @@ -1621,8 +1624,9 @@ public class PacketConsumers { public static final TriConsumer SYNC_ENTITY_POSITION = (user, event, packet) -> { try { int entityId = FastNMS.INSTANCE.method$ClientboundEntityPositionSyncPacket$id(packet); - if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { - event.setCancelled(true); + EntityPacketHandler handler = user.entityPacketHandlers().get(entityId); + if (handler != null) { + handler.handleSyncEntityPosition(user, event, packet); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityPositionSyncPacket", e); @@ -2214,7 +2218,10 @@ public class PacketConsumers { public static final TriConsumer MOVE_AND_ROTATE_ENTITY = (user, event, packet) -> { try { int entityId = BukkitInjector.internalFieldAccessor().field$ClientboundMoveEntityPacket$entityId(packet); - + EntityPacketHandler handler = user.entityPacketHandlers().get(entityId); + if (handler != null) { + handler.handleMoveAndRotate(user, event, packet); + } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundMoveEntityPacket$PosRot", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java new file mode 100644 index 000000000..70121b19b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.bukkit.plugin.network.handler; + +import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; +import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; + +public class FurnitureCollisionPacketHandler implements EntityPacketHandler { + public static final FurnitureCollisionPacketHandler INSTANCE = new FurnitureCollisionPacketHandler(); + + @Override + public void handleSyncEntityPosition(NetWorkUser user, NMSPacketEvent event, Object packet) { + event.setCancelled(true); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java index 70c0d6778..f9f0134a6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java @@ -2,6 +2,8 @@ package net.momirealms.craftengine.bukkit.plugin.network.handler; import it.unimi.dsi.fastutil.ints.IntList; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; +import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import java.util.List; @@ -17,4 +19,9 @@ public class FurniturePacketHandler implements EntityPacketHandler { entityIds.addAll(this.fakeEntities); return true; } + + @Override + public void handleSyncEntityPosition(NetWorkUser user, NMSPacketEvent event, Object packet) { + event.setCancelled(true); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CustomTridentPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java similarity index 60% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CustomTridentPacketHandler.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java index 487fa4152..329ea6019 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CustomTridentPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java @@ -3,70 +3,61 @@ package net.momirealms.craftengine.bukkit.plugin.network.handler; import net.momirealms.craftengine.bukkit.entity.data.ItemDisplayEntityData; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; import net.momirealms.craftengine.bukkit.util.Reflections; -import net.momirealms.craftengine.core.entity.CustomTrident; +import net.momirealms.craftengine.core.entity.projectile.CustomProjectile; +import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; import net.momirealms.craftengine.core.item.CustomItem; -import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; -import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.VersionHelper; -import org.bukkit.World; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Trident; import org.bukkit.inventory.ItemStack; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; -public final class CustomTridentPacketHandler { +public class ProjectilePacketHandler implements EntityPacketHandler { + private final CustomProjectile projectile; - private CustomTridentPacketHandler() {} + public ProjectilePacketHandler(CustomProjectile projectile) { + this.projectile = projectile; + } - public static void handleCustomTrident(NetWorkUser user, NMSPacketEvent event, Object packet) { + @Override + public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { + FriendlyByteBuf buf = event.getBuffer(); + int id = buf.readVarInt(); + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); + List newPackedItems = convertCustomProjectileSetEntityDataPacket(packedItems); + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(newPackedItems, buf); + } + + @Override + public void handleSyncEntityPosition(NetWorkUser user, NMSPacketEvent event, Object packet) { + Object converted = convertCustomProjectilePositionSyncPacket(packet); + event.replacePacket(converted); + } + + @Override + public void handleMoveAndRotate(NetWorkUser user, NMSPacketEvent event, Object packet) { + Object converted = convertCustomProjectileMovePacket(packet); + event.replacePacket(converted); + } + + public static Object convertAddCustomProjectPacket(Object packet) { int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); - Trident trident = getTridentById(user, entityId); - if (trident == null) return; - World world = trident.getWorld(); - Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(trident); - Object trackedEntity = FastNMS.INSTANCE.field$Entity$trackedEntity(nmsEntity); - Object serverEntity = FastNMS.INSTANCE.filed$ChunkMap$TrackedEntity$serverEntity(trackedEntity); - if (notCustomTrident(trident)) return; - Object newPacket = modifyCustomTridentPacket(packet, entityId); - List itemDisplayValues = buildEntityDataValues(trident); - user.sendPacket(newPacket, true); - user.sendPacket(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityId, itemDisplayValues), true); - event.setCancelled(true); - if (serverEntity != null) { - } - } - - private static boolean canSpawnParticle(Object nmsEntity) { - if (!FastNMS.INSTANCE.field$AbstractArrow$wasTouchingWater(nmsEntity)) return false; - return !FastNMS.INSTANCE.method$AbstractArrow$isInGround(nmsEntity); - } - - @Nullable - public static Trident getTridentById(NetWorkUser user, int entityId) { - Player player = (Player) user.platformPlayer(); - Entity entity = FastNMS.INSTANCE.getBukkitEntityById(player.getWorld(), entityId); - if (entity instanceof Trident trident) return trident; - return null; - } - - public static boolean notCustomTrident(Trident trident) { - if (trident == null) return true; - Optional> customItem = BukkitItemManager.instance().wrap(trident.getItemStack()).getCustomItem(); - return customItem.map(itemStackCustomItem -> itemStackCustomItem.settings().customTrident() == null).orElse(true); - } - - public static Object modifyCustomTridentPacket(Object packet, int entityId) { UUID uuid = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$uuid(packet); double x = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$x(packet); double y = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$y(packet); @@ -86,29 +77,8 @@ public final class CustomTridentPacketHandler { ); } - public static List buildEntityDataValues(Trident trident) { - List itemDisplayValues = new ArrayList<>(); - ItemStack itemStack = trident.getItemStack(); - Optional> customItem = BukkitItemManager.instance().wrap(itemStack).getCustomItem(); - if (customItem.isEmpty()) return itemDisplayValues; - CustomTrident customTrident = customItem.get().settings().customTrident(); - Item item = BukkitItemManager.instance().createWrappedItem(customTrident.customTridentItemId(), null); - itemStack.getEnchantments().forEach((enchantment, level) -> item.addEnchantment(new Enchantment(Key.of(enchantment.getKey().toString()), level))); - ItemDisplayEntityData.InterpolationDelay.addEntityDataIfNotDefaultValue(-1, itemDisplayValues); - ItemDisplayEntityData.Translation.addEntityDataIfNotDefaultValue(customTrident.translation(), itemDisplayValues); - ItemDisplayEntityData.RotationLeft.addEntityDataIfNotDefaultValue(customTrident.rotationLefts(), itemDisplayValues); - if (VersionHelper.isOrAbove1_20_2()) { - ItemDisplayEntityData.TransformationInterpolationDuration.addEntityDataIfNotDefaultValue(2, itemDisplayValues); - ItemDisplayEntityData.PositionRotationInterpolationDuration.addEntityDataIfNotDefaultValue(2, itemDisplayValues); - } else { - ItemDisplayEntityData.InterpolationDuration.addEntityDataIfNotDefaultValue(2, itemDisplayValues); - } - ItemDisplayEntityData.DisplayedItem.addEntityDataIfNotDefaultValue(item.getLiteralObject(), itemDisplayValues); - ItemDisplayEntityData.DisplayType.addEntityDataIfNotDefaultValue(customTrident.displayType(), itemDisplayValues); - return itemDisplayValues; - } - - public static Object buildCustomTridentPositionSync(Object packet, int entityId) { + private Object convertCustomProjectilePositionSyncPacket(Object packet) { + int entityId = FastNMS.INSTANCE.method$ClientboundEntityPositionSyncPacket$id(packet); Object positionMoveRotation = FastNMS.INSTANCE.field$ClientboundEntityPositionSyncPacket$values(packet); boolean onGround = FastNMS.INSTANCE.field$ClientboundEntityPositionSyncPacket$onGround(packet); Object position = FastNMS.INSTANCE.field$PositionMoveRotation$position(positionMoveRotation); @@ -119,7 +89,43 @@ public final class CustomTridentPacketHandler { return FastNMS.INSTANCE.constructor$ClientboundEntityPositionSyncPacket(entityId, newPositionMoveRotation, onGround); } - public static Object buildCustomTridentMove(Object packet, int entityId) { + // 将原有的投掷物的entity data转化为展示实体的数据包 + public List convertCustomProjectileSetEntityDataPacket(List packedItems) { + List newPackedItems = new ArrayList<>(); + for (Object packedItem : packedItems) { + int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + if (entityDataId < 8) { + newPackedItems.add(packedItem); + } + } + newPackedItems.addAll(createCustomProjectileEntityDataValues()); + return newPackedItems; + } + + private List createCustomProjectileEntityDataValues() { + List itemDisplayValues = new ArrayList<>(); + Optional> customItem = BukkitItemManager.instance().getCustomItem(this.projectile.metadata().item()); + if (customItem.isEmpty()) return itemDisplayValues; + ProjectileMeta meta = projectile.metadata(); + Item displayedItem = customItem.get().buildItem(ItemBuildContext.EMPTY); + // 我们应当使用新的展示物品的组件覆盖原物品的组件,以完成附魔,附魔光效等组件的继承 + displayedItem = this.projectile.item().mergeCopy(displayedItem); + ItemDisplayEntityData.InterpolationDelay.addEntityDataIfNotDefaultValue(-1, itemDisplayValues); + ItemDisplayEntityData.Translation.addEntityDataIfNotDefaultValue(meta.translation(), itemDisplayValues); + ItemDisplayEntityData.RotationLeft.addEntityDataIfNotDefaultValue(meta.rotation(), itemDisplayValues); + if (VersionHelper.isOrAbove1_20_2()) { + ItemDisplayEntityData.TransformationInterpolationDuration.addEntityDataIfNotDefaultValue(2, itemDisplayValues); + ItemDisplayEntityData.PositionRotationInterpolationDuration.addEntityDataIfNotDefaultValue(2, itemDisplayValues); + } else { + ItemDisplayEntityData.InterpolationDuration.addEntityDataIfNotDefaultValue(2, itemDisplayValues); + } + ItemDisplayEntityData.DisplayedItem.addEntityDataIfNotDefaultValue(displayedItem.getLiteralObject(), itemDisplayValues); + ItemDisplayEntityData.DisplayType.addEntityDataIfNotDefaultValue(meta.displayType().id(), itemDisplayValues); + return itemDisplayValues; + } + + private static Object convertCustomProjectileMovePacket(Object packet) { + int entityId = BukkitInjector.internalFieldAccessor().field$ClientboundMoveEntityPacket$entityId(packet); short xa = FastNMS.INSTANCE.field$ClientboundMoveEntityPacket$xa(packet); short ya = FastNMS.INSTANCE.field$ClientboundMoveEntityPacket$ya(packet); short za = FastNMS.INSTANCE.field$ClientboundMoveEntityPacket$za(packet); @@ -132,15 +138,4 @@ public final class CustomTridentPacketHandler { onGround ); } - - public static List buildCustomTridentSetEntityDataPacket(NetWorkUser user, List packedItems, int entityId) { - List newPackedItems = new ArrayList<>(); - for (Object packedItem : packedItems) { - int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); - if (entityDataId < 8) { - newPackedItems.add(packedItem); - } - } - return newPackedItems; - } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java index e401be613..dc8c5aeba 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java @@ -3,7 +3,8 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Particle; -public class ParticleUtils { +public final class ParticleUtils { + private ParticleUtils() {} public static Particle getParticle(String particle) { try { @@ -12,9 +13,12 @@ public class ParticleUtils { return switch (particle) { case "REDSTONE" -> Particle.valueOf("DUST"); case "VILLAGER_HAPPY", "HAPPY_VILLAGER" -> Particle.valueOf(VersionHelper.isOrAbove1_20_5() ? "HAPPY_VILLAGER" : "VILLAGER_HAPPY"); - case "BUBBLE" -> Particle.valueOf(VersionHelper.isOrAbove1_20_5() ? "BUBBLE" : "WATER_BUBBLE"); + case "BUBBLE", "WATER_BUBBLE" -> Particle.valueOf(VersionHelper.isOrAbove1_20_5() ? "BUBBLE" : "WATER_BUBBLE"); default -> Particle.valueOf(particle); }; } } + + public static final Particle HAPPY_VILLAGER = getParticle("HAPPY_VILLAGER"); + public static final Particle BUBBLE = getParticle("BUBBLE"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/AbstractEntity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/AbstractEntity.java new file mode 100644 index 000000000..ae64546e9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/AbstractEntity.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.entity; + +import net.momirealms.craftengine.core.world.Vec3d; + +public abstract class AbstractEntity implements Entity { + + @Override + public Vec3d position() { + return new Vec3d(x(), y(), z()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Billboard.java similarity index 80% rename from core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java rename to core/src/main/java/net/momirealms/craftengine/core/entity/Billboard.java index 16545019d..7533b658b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Billboard.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.entity.furniture; +package net.momirealms.craftengine.core.entity; public enum Billboard { FIXED(0), diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/CustomTrident.java b/core/src/main/java/net/momirealms/craftengine/core/entity/CustomTrident.java deleted file mode 100644 index aed870c82..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/CustomTrident.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.momirealms.craftengine.core.entity; - -import net.momirealms.craftengine.core.util.Key; -import org.joml.Quaternionf; -import org.joml.Vector3f; - -public record CustomTrident(Key customTridentItemId, Byte displayType, Vector3f translation, Quaternionf rotationLefts) { -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java index 24efd4208..d1e4428e4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -5,31 +5,28 @@ import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; -public abstract class Entity { +public interface Entity { + Key type(); - public abstract Key type(); + double x(); - public abstract double x(); + double y(); - public abstract double y(); + double z(); - public abstract double z(); + Vec3d position(); - public Vec3d position() { - return new Vec3d(x(), y(), z()); - } + void tick(); - public abstract void tick(); + float getXRot(); - public abstract int entityID(); + int entityID(); - public abstract float getXRot(); + float getYRot(); - public abstract float getYRot(); + World world(); - public abstract World world(); + Direction getDirection(); - public abstract Direction getDirection(); - - public abstract Object literalObject(); + Object literalObject(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java b/core/src/main/java/net/momirealms/craftengine/core/entity/ItemDisplayContext.java similarity index 86% rename from core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java rename to core/src/main/java/net/momirealms/craftengine/core/entity/ItemDisplayContext.java index 2fbd54078..adbead883 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/ItemDisplayContext.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.entity.furniture; +package net.momirealms.craftengine.core.entity; public enum ItemDisplayContext { NONE(0), diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureElement.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureElement.java index 426907463..b2f4151f7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureElement.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureElement.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.entity.furniture; +import net.momirealms.craftengine.core.entity.Billboard; +import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.util.Key; import org.joml.Quaternionf; import org.joml.Vector3f; diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ExternalModel.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ExternalModel.java index 5a12ba446..8f2f1c4b1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ExternalModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ExternalModel.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.entity.furniture; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; public interface ExternalModel { @@ -8,5 +8,5 @@ public interface ExternalModel { String id(); - void bindModel(Entity entity); + void bindModel(AbstractEntity entity); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java index b92b56dc5..3ed6f1449 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.entity.furniture; +import net.momirealms.craftengine.core.entity.Billboard; +import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; import org.joml.Quaternionf; diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java index 2655d6804..7dd60f33b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.entity.furniture; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.util.Key; @@ -31,7 +31,7 @@ public interface FurnitureManager extends Manageable { Furniture loadedFurnitureByRealEntityId(int entityId); @Nullable - default Furniture loadedFurnitureByRealEntity(Entity entity) { + default Furniture loadedFurnitureByRealEntity(AbstractEntity entity) { return loadedFurnitureByRealEntityId(entity.entityID()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 48d6b6185..dccc2734f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.entity.player; import net.kyori.adventure.text.Component; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.util.Key; @@ -10,7 +10,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -public abstract class Player extends Entity implements NetWorkUser { +public abstract class Player extends AbstractEntity implements NetWorkUser { private static final Key TYPE = Key.of("minecraft:player"); public abstract boolean isSecondaryUseActive(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java new file mode 100644 index 000000000..117367a84 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.entity.projectile; + +import net.momirealms.craftengine.core.item.Item; + +public abstract class AbstractCustomProjectile implements CustomProjectile { + protected final ProjectileMeta meta; + protected final Projectile projectile; + protected final Item item; + + protected AbstractCustomProjectile(ProjectileMeta meta, Projectile projectile, Item item) { + this.meta = meta; + this.projectile = projectile; + this.item = item; + } + + @Override + public ProjectileMeta metadata() { + return this.meta; + } + + @Override + public Projectile projectile() { + return projectile; + } + + @Override + public Item item() { + return item; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java new file mode 100644 index 000000000..661f2d4ac --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.entity.projectile; + +import net.momirealms.craftengine.core.item.Item; + +public interface CustomProjectile { + + ProjectileMeta metadata(); + + Projectile projectile(); + + Item item(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/Projectile.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/Projectile.java new file mode 100644 index 000000000..c721ee990 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/Projectile.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.entity.projectile; + +import net.momirealms.craftengine.core.entity.Entity; + +public interface Projectile extends Entity { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileManager.java new file mode 100644 index 000000000..12796743a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileManager.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.entity.projectile; + +import net.momirealms.craftengine.core.plugin.Manageable; + +import java.util.Optional; + +public interface ProjectileManager extends Manageable { + + Optional projectileByEntityId(int entityId); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java new file mode 100644 index 000000000..8ca3ec0b1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.entity.projectile; + +import net.momirealms.craftengine.core.entity.ItemDisplayContext; +import net.momirealms.craftengine.core.util.Key; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public record ProjectileMeta(Key item, ItemDisplayContext displayType, Vector3f translation, Quaternionf rotation) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java index d9968d902..3b9a5bc07 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.item; -import net.momirealms.craftengine.core.entity.CustomTrident; +import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; +import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.item.modifier.EquippableModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; @@ -25,7 +26,7 @@ public class ItemSettings { List anvilRepairItems = List.of(); boolean renameable = true; boolean canPlaceRelatedVanillaBlock = false; - CustomTrident customTrident; + ProjectileMeta projectileMeta; private ItemSettings() {} @@ -54,7 +55,7 @@ public class ItemSettings { newSettings.anvilRepairItems = settings.anvilRepairItems; newSettings.renameable = settings.renameable; newSettings.canPlaceRelatedVanillaBlock = settings.canPlaceRelatedVanillaBlock; - newSettings.customTrident = settings.customTrident; + newSettings.projectileMeta = settings.projectileMeta; return newSettings; } @@ -70,8 +71,8 @@ public class ItemSettings { return settings; } - public CustomTrident customTrident() { - return customTrident; + public ProjectileMeta projectileMeta() { + return projectileMeta; } public boolean canPlaceRelatedVanillaBlock() { @@ -118,8 +119,8 @@ public class ItemSettings { return this; } - public ItemSettings customTrident(CustomTrident customTrident) { - this.customTrident = customTrident; + public ItemSettings projectileMeta(ProjectileMeta projectileMeta) { + this.projectileMeta = projectileMeta; return this; } @@ -207,13 +208,13 @@ public class ItemSettings { boolean bool = (boolean) value; return settings -> settings.canPlaceRelatedVanillaBlock(bool); })); - registerFactory("custom-trident", (value -> { + registerFactory("projectile", (value -> { Map args = MiscUtils.castToMap(value, false); - Key customTridentItemId = Key.of(args.get("custom-trident-item").toString()); - Byte displayType = Byte.valueOf(args.get("display-type").toString()); + Key customTridentItemId = Key.of(Objects.requireNonNull(args.get("item"), "'item should not be null'").toString()); + ItemDisplayContext displayType = ItemDisplayContext.valueOf(args.getOrDefault("display-transform", "NONE").toString().toUpperCase(Locale.ENGLISH)); Vector3f translation = MiscUtils.getAsVector3f(args.get("translation"), "translation"); Quaternionf rotationLefts = MiscUtils.getAsQuaternionf(args.get("rotation-left"), "rotation-left"); - return settings -> settings.customTrident(new CustomTrident(customTridentItemId, displayType, translation, rotationLefts)); + return settings -> settings.projectileMeta(new ProjectileMeta(customTridentItemId, displayType, translation, rotationLefts)); })); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 51e975b79..59d86f55d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.plugin; import net.momirealms.craftengine.core.advancement.AdvancementManager; import net.momirealms.craftengine.core.block.BlockManager; import net.momirealms.craftengine.core.entity.furniture.FurnitureManager; +import net.momirealms.craftengine.core.entity.projectile.ProjectileManager; import net.momirealms.craftengine.core.font.FontManager; import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.item.recipe.RecipeManager; @@ -70,6 +71,7 @@ public abstract class CraftEngine implements Plugin { protected AdvancementManager advancementManager; protected CompatibilityManager compatibilityManager; protected GlobalVariableManager globalVariableManager; + protected ProjectileManager projectileManager; private final Consumer reloadEventDispatcher; private boolean isReloading; @@ -147,6 +149,7 @@ public abstract class CraftEngine implements Plugin { this.guiManager.reload(); this.packManager.reload(); this.advancementManager.reload(); + this.projectileManager.reload(); if (reloadRecipe) { this.recipeManager.reload(); } @@ -218,6 +221,7 @@ public abstract class CraftEngine implements Plugin { this.fontManager.delayedInit(); this.vanillaLootManager.delayedInit(); this.advancementManager.delayedInit(); + this.projectileManager.delayedInit(); // reload the plugin try { this.reloadPlugin(Runnable::run, Runnable::run, true); @@ -250,6 +254,7 @@ public abstract class CraftEngine implements Plugin { if (this.vanillaLootManager != null) this.vanillaLootManager.disable(); if (this.translationManager != null) this.translationManager.disable(); if (this.globalVariableManager != null) this.globalVariableManager.disable(); + if (this.projectileManager != null) this.projectileManager.disable(); if (this.scheduler != null) this.scheduler.shutdownScheduler(); if (this.scheduler != null) this.scheduler.shutdownExecutor(); if (this.commandManager != null) this.commandManager.unregisterFeatures(); @@ -442,6 +447,11 @@ public abstract class CraftEngine implements Plugin { return globalVariableManager; } + @Override + public ProjectileManager projectileManager() { + return projectileManager; + } + @Override public Platform platform() { return platform; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java index 1dde1374e..cbb4feb74 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.plugin; import net.momirealms.craftengine.core.advancement.AdvancementManager; import net.momirealms.craftengine.core.block.BlockManager; import net.momirealms.craftengine.core.entity.furniture.FurnitureManager; +import net.momirealms.craftengine.core.entity.projectile.ProjectileManager; import net.momirealms.craftengine.core.font.FontManager; import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.item.recipe.RecipeManager; @@ -94,5 +95,7 @@ public interface Plugin { GlobalVariableManager globalVariableManager(); + ProjectileManager projectileManager(); + Platform platform(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java index c3a17484f..4e7efd8e3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.plugin.context.parameter; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.ContextKey; @@ -17,10 +17,10 @@ import java.util.function.Function; public class PlayerParameterProvider implements LazyContextParameterProvider { private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); static { - CONTEXT_FUNCTIONS.put(PlayerParameters.X, Entity::x); - CONTEXT_FUNCTIONS.put(PlayerParameters.Y, Entity::y); - CONTEXT_FUNCTIONS.put(PlayerParameters.Z, Entity::z); - CONTEXT_FUNCTIONS.put(PlayerParameters.POS, Entity::position); + CONTEXT_FUNCTIONS.put(PlayerParameters.X, AbstractEntity::x); + CONTEXT_FUNCTIONS.put(PlayerParameters.Y, AbstractEntity::y); + CONTEXT_FUNCTIONS.put(PlayerParameters.Z, AbstractEntity::z); + CONTEXT_FUNCTIONS.put(PlayerParameters.POS, AbstractEntity::position); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_X, p -> MCUtils.fastFloor(p.x())); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Y, p -> MCUtils.fastFloor(p.y())); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Z, p -> MCUtils.fastFloor(p.z())); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java index 8a2c9e78e..224a27f81 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java @@ -10,4 +10,10 @@ public interface EntityPacketHandler { default void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { } + + default void handleSyncEntityPosition(NetWorkUser user, NMSPacketEvent event, Object packet) { + } + + default void handleMoveAndRotate(NetWorkUser user, NMSPacketEvent event, Object packet) { + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java index a55f7047c..87cd8df73 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.util; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; import net.momirealms.craftengine.core.world.Vec3i; import org.jetbrains.annotations.Nullable; @@ -93,7 +93,7 @@ public enum Direction { }; } - public static Direction[] orderedByNearest(Entity entity) { + public static Direction[] orderedByNearest(AbstractEntity entity) { float xRotation = entity.getXRot() * (float) (Math.PI / 180.0); float yRotation = -entity.getYRot() * (float) (Math.PI / 180.0); float sinX = (float) Math.sin(xRotation); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java b/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java index 4c1d08e71..a7a4aae69 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.world; -import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.AbstractEntity; public abstract class HitResult { protected final Vec3d location; @@ -9,7 +9,7 @@ public abstract class HitResult { this.location = pos; } - public double distanceTo(Entity entity) { + public double distanceTo(AbstractEntity entity) { double d = this.location.x() - entity.x(); double e = this.location.y() - entity.y(); double f = this.location.z() - entity.z();