48 lines
1.9 KiB
Java
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);
|
|
}
|
|
} |