9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-31 12:56:28 +00:00

重构弹射物处理

This commit is contained in:
XiaoMoMi
2025-05-10 22:04:19 +08:00
parent 519c861139
commit 3483275cdf
41 changed files with 389 additions and 157 deletions

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<org.bukkit.entity.Entity> entity;
public BukkitEntity(org.bukkit.entity.Entity entity) {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<ItemStack> projectileItem) {
super(meta, new BukkitProjectile(projectile), projectileItem);
}
}

View File

@@ -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);
}
}

View File

@@ -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<Integer, BukkitCustomProjectile> 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<CustomProjectile> 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<ItemStack> 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;
}
}

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -43,7 +43,7 @@ public class TestCommand extends BukkitCommandFeature<CommandSender> {
}))
.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");

View File

@@ -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<NetWorkUser, NMSPacketEvent, Object> 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<NetWorkUser, NMSPacketEvent, Object> 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<NetWorkUser, NMSPacketEvent, Object> 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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<Object> packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf);
List<Object> 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<Object> 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<ItemStack>> 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<Object> buildEntityDataValues(Trident trident) {
List<Object> itemDisplayValues = new ArrayList<>();
ItemStack itemStack = trident.getItemStack();
Optional<CustomItem<ItemStack>> customItem = BukkitItemManager.instance().wrap(itemStack).getCustomItem();
if (customItem.isEmpty()) return itemDisplayValues;
CustomTrident customTrident = customItem.get().settings().customTrident();
Item<ItemStack> 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<Object> convertCustomProjectileSetEntityDataPacket(List<Object> packedItems) {
List<Object> 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<Object> createCustomProjectileEntityDataValues() {
List<Object> itemDisplayValues = new ArrayList<>();
Optional<CustomItem<ItemStack>> 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<Object> buildCustomTridentSetEntityDataPacket(NetWorkUser user, List<Object> packedItems, int entityId) {
List<Object> newPackedItems = new ArrayList<>();
for (Object packedItem : packedItems) {
int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem);
if (entityDataId < 8) {
newPackedItems.add(packedItem);
}
}
return newPackedItems;
}
}

View File

@@ -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");
}