From 31e69148683d38f7465e2c5278769441c8a089df Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Fri, 23 May 2025 01:52:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=8F=91=E5=B0=84=E8=9C=82?= =?UTF-8?q?=E7=BE=A4=E6=97=A0=E4=BA=BA=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/init/ModItems.java | 2 + .../superbwarfare/item/SwarmDrone.java | 126 +++++++----------- 2 files changed, 50 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index 030cc4d68..47154fdae 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -324,6 +324,8 @@ public class ModItems { DispenserBlock.registerProjectileBehavior(item.get()); } } + + DispenserBlock.registerBehavior(SWARM_DRONE.get(), new SwarmDrone.SwarmDroneDispenseBehavior()); } public static void register(IEventBus bus) { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/SwarmDrone.java b/src/main/java/com/atsuishio/superbwarfare/item/SwarmDrone.java index facad266a..b30fa37c5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/SwarmDrone.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/SwarmDrone.java @@ -1,16 +1,25 @@ package com.atsuishio.superbwarfare.item; import com.atsuishio.superbwarfare.entity.projectile.SwarmDroneEntity; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; import net.minecraft.core.Position; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.ProjectileDispenseBehavior; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ProjectileItem; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -22,83 +31,41 @@ public class SwarmDrone extends Item implements ProjectileItem { super(new Properties()); } -// @Override -// public AbstractProjectileDispenseBehavior getLaunchBehavior() { -// return new AbstractProjectileDispenseBehavior() { -// -// @Override -// public ItemStack execute(BlockSource blockSource, ItemStack pStack) { -// Level level = blockSource.getLevel(); -// Position position = DispenserBlock.getDispensePosition(blockSource); -// Direction direction = blockSource.getBlockState().getValue(DispenserBlock.FACING); -// Projectile projectile = this.getProjectile(level, position, pStack); -// -// float yVec = direction.getStepY(); -// if (direction != Direction.DOWN) { -// yVec += 1F; -// } -// -// projectile.shoot(direction.getStepX(), yVec, direction.getStepZ(), this.getPower(), this.getUncertainty()); -// -// BlockHitResult result = level.clip(new ClipContext(new Vec3(position.x(), position.y(), position.z()), -// new Vec3(position.x(), position.y(), position.z()).add(new Vec3(direction.step().mul(128))), -// ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, projectile)); -// Vec3 hitPos = result.getLocation(); -// ((SwarmDroneEntity) projectile).setGuideType(1); -// ((SwarmDroneEntity) projectile).setTargetVec(hitPos); -// -// level.addFreshEntity(projectile); -// pStack.shrink(1); -// return pStack; -// } -// -// @Override -// @ParametersAreNonnullByDefault -// protected @NotNull Projectile getProjectile(Level pLevel, Position pos, ItemStack pStack) { -// return new SwarmDroneEntity(pos.x(), pos.y(), pos.z(), pLevel); -// } -// -// @Override -// protected void playSound(BlockSource blockSource) { -// blockSource.getLevel().playSound(null, blockSource.getPos(), ModSounds.DECOY_FIRE.get(), SoundSource.BLOCKS, 2.0F, 1.0F); -// } -// }; -// } + public static class SwarmDroneDispenseBehavior extends ProjectileDispenseBehavior { -// public class SwarmDroneDispenseBehavior extends ProjectileDispenseBehavior { -// -// public SwarmDroneDispenseBehavior(Item projectile) { -// super(projectile); -// } -// -// @Override -// @ParametersAreNonnullByDefault -// public @NotNull ItemStack execute(BlockSource blockSource, ItemStack stack) { -// Level level = blockSource.level(); -// Position position = DispenserBlock.getDispensePosition(blockSource); -// Direction direction = blockSource.state().getValue(DispenserBlock.FACING); -// Projectile projectile = this.getProjectile(level, position, stack); -// -// float yVec = direction.getStepY(); -// if (direction != Direction.DOWN) { -// yVec += 1F; -// } -// -// projectile.shoot(direction.getStepX(), yVec, direction.getStepZ(), this.getPower(), this.getUncertainty()); -// -// BlockHitResult result = level.clip(new ClipContext(new Vec3(position.x(), position.y(), position.z()), -// new Vec3(position.x(), position.y(), position.z()).add(new Vec3(direction.step().mul(128))), -// ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, projectile)); -// Vec3 hitPos = result.getLocation(); -// ((SwarmDroneEntity) projectile).setGuideType(1); -// ((SwarmDroneEntity) projectile).setTargetVec(hitPos); -// -// level.addFreshEntity(projectile); -// pStack.shrink(1); -// return pStack; -// return super.execute(blockSource, stack); -// } -// } + public SwarmDroneDispenseBehavior() { + super(ModItems.SWARM_DRONE.get()); + } + + @Override + @ParametersAreNonnullByDefault + public @NotNull ItemStack execute(BlockSource blockSource, ItemStack stack) { + Level level = blockSource.level(); + Position position = DispenserBlock.getDispensePosition(blockSource); + Direction direction = blockSource.state().getValue(DispenserBlock.FACING); + SwarmDroneEntity projectile = createProjectile(level, position); + + float yVec = direction.getStepY(); + if (direction != Direction.DOWN) { + yVec += 1F; + } + + projectile.shoot(direction.getStepX(), yVec, direction.getStepZ(), 1.5f, 1); + + BlockHitResult result = level.clip(new ClipContext(new Vec3(position.x(), position.y(), position.z()), + new Vec3(position.x(), position.y(), position.z()).add(new Vec3(direction.step().mul(128))), + ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, projectile)); + Vec3 hitPos = result.getLocation(); + projectile.setGuideType(1); + projectile.setTargetVec(hitPos); + + level.addFreshEntity(projectile); + stack.shrink(1); + + blockSource.level().playSound(null, blockSource.pos(), ModSounds.DECOY_FIRE.get(), SoundSource.BLOCKS, 2.0F, 1.0F); + return stack; + } + } // TODO 怎么发射? @@ -112,14 +79,17 @@ public class SwarmDrone extends Item implements ProjectileItem { public @NotNull DispenseConfig createDispenseConfig() { return ProjectileItem.DispenseConfig.builder() .uncertainty(1) - .power(0.5f) + .power(1.5f) .build(); } + private static SwarmDroneEntity createProjectile(Level level, Position pos) { + return new SwarmDroneEntity(pos.x(), pos.y(), pos.z(), level); + } @Override @ParametersAreNonnullByDefault public @NotNull Projectile asProjectile(Level level, Position pos, ItemStack stack, Direction direction) { - return new SwarmDroneEntity(pos.x(), pos.y(), pos.z(), level); + return createProjectile(level, pos); } } \ No newline at end of file