Code/net/minecraft/core/dispenser/ProjectileDispenseBehavior....

48 lines
1.9 KiB
Java

package net.minecraft.core.dispenser;
import net.minecraft.core.Direction;
import net.minecraft.core.Position;
import net.minecraft.server.level.ServerLevel;
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.level.block.DispenserBlock;
public class ProjectileDispenseBehavior extends DefaultDispenseItemBehavior {
private final ProjectileItem projectileItem;
private final ProjectileItem.DispenseConfig dispenseConfig;
public ProjectileDispenseBehavior(Item p_328671_) {
if (p_328671_ instanceof ProjectileItem projectileitem) {
this.projectileItem = projectileitem;
this.dispenseConfig = projectileitem.createDispenseConfig();
} else {
throw new IllegalArgumentException(p_328671_ + " not instance of " + ProjectileItem.class.getSimpleName());
}
}
@Override
public ItemStack execute(BlockSource p_334330_, ItemStack p_328814_) {
ServerLevel serverlevel = p_334330_.level();
Direction direction = p_334330_.state().getValue(DispenserBlock.FACING);
Position position = this.dispenseConfig.positionFunction().getDispensePosition(p_334330_, direction);
Projectile.spawnProjectileUsingShoot(
this.projectileItem.asProjectile(serverlevel, position, p_328814_, direction),
serverlevel,
p_328814_,
direction.getStepX(),
direction.getStepY(),
direction.getStepZ(),
this.dispenseConfig.power(),
this.dispenseConfig.uncertainty()
);
p_328814_.shrink(1);
return p_328814_;
}
@Override
protected void playSound(BlockSource p_330598_) {
p_330598_.level().levelEvent(this.dispenseConfig.overrideDispenseEvent().orElse(1002), p_330598_.pos(), 0);
}
}