diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/FastProjectile.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/FastProjectile.java new file mode 100644 index 000000000..bdeb1a6d8 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/FastProjectile.java @@ -0,0 +1,4 @@ +package com.atsuishio.superbwarfare.entity.projectile; + +public interface FastProjectile { +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java index b0e463acc..20797c7b5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java @@ -66,7 +66,7 @@ import java.util.function.Function; import java.util.function.Predicate; @SuppressWarnings({"unused", "UnusedReturnValue", "SuspiciousNameCombination"}) -public class ProjectileEntity extends Projectile implements IEntityAdditionalSpawnData, GeoEntity { +public class ProjectileEntity extends Projectile implements IEntityAdditionalSpawnData, GeoEntity, FastProjectile { public static final EntityDataAccessor COLOR_R = SynchedEntityData.defineId(ProjectileEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor COLOR_G = SynchedEntityData.defineId(ProjectileEntity.class, EntityDataSerializers.FLOAT); diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/ClientboundSetEntityMotionPacketMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/ClientboundSetEntityMotionPacketMixin.java index 903ba9a5e..8a39b9784 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/ClientboundSetEntityMotionPacketMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/ClientboundSetEntityMotionPacketMixin.java @@ -1,7 +1,11 @@ package com.atsuishio.superbwarfare.mixins; +import com.atsuishio.superbwarfare.entity.projectile.FastProjectile; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -40,12 +44,18 @@ public class ClientboundSetEntityMotionPacketMixin { @Shadow private int za; - @Inject(method = "Lnet/minecraft/network/protocol/game/ClientboundSetEntityMotionPacket;" + - "(ILnet/minecraft/world/phys/Vec3;)V", at = @At(value = "RETURN")) + // TODO 实现仅对 FastProjectile 对象的动量修改 + @Inject(method = "(ILnet/minecraft/world/phys/Vec3;)V", at = @At(value = "RETURN")) public void init(int entityId, Vec3 motion, CallbackInfo ci) { - this.xa = (int) (motion.x * 8000.0D); - this.ya = (int) (motion.y * 8000.0D); - this.za = (int) (motion.z * 8000.0D); + ClientLevel level = Minecraft.getInstance().level; + if (level != null) { + Entity entity = level.getEntity(entityId); + if (entity instanceof FastProjectile) { + this.xa = (int) (motion.x * 8000.0D); + this.ya = (int) (motion.y * 8000.0D); + this.za = (int) (motion.z * 8000.0D); + } + } } @Redirect(method = "(Lnet/minecraft/network/FriendlyByteBuf;)V",