minecraft-src/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java
2025-07-04 02:49:36 +03:00

59 lines
2.1 KiB
Java

package net.minecraft.core.dispenser;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.FluidTags;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.vehicle.AbstractBoat;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.phys.Vec3;
public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior();
private final EntityType<? extends AbstractBoat> type;
public BoatDispenseItemBehavior(EntityType<? extends AbstractBoat> type) {
this.type = type;
}
@Override
public ItemStack execute(BlockSource blockSource, ItemStack item) {
Direction direction = blockSource.state().getValue(DispenserBlock.FACING);
ServerLevel serverLevel = blockSource.level();
Vec3 vec3 = blockSource.center();
double d = 0.5625 + this.type.getWidth() / 2.0;
double e = vec3.x() + direction.getStepX() * d;
double f = vec3.y() + direction.getStepY() * 1.125F;
double g = vec3.z() + direction.getStepZ() * d;
BlockPos blockPos = blockSource.pos().relative(direction);
double h;
if (serverLevel.getFluidState(blockPos).is(FluidTags.WATER)) {
h = 1.0;
} else {
if (!serverLevel.getBlockState(blockPos).isAir() || !serverLevel.getFluidState(blockPos.below()).is(FluidTags.WATER)) {
return this.defaultDispenseItemBehavior.dispense(blockSource, item);
}
h = 0.0;
}
AbstractBoat abstractBoat = this.type.create(serverLevel, EntitySpawnReason.DISPENSER);
if (abstractBoat != null) {
abstractBoat.setInitialPos(e, f + h, g);
EntityType.createDefaultStackConfig(serverLevel, item, null).accept(abstractBoat);
abstractBoat.setYRot(direction.toYRot());
serverLevel.addFreshEntity(abstractBoat);
item.shrink(1);
}
return item;
}
@Override
protected void playSound(BlockSource blockSource) {
blockSource.level().levelEvent(1000, blockSource.pos(), 0);
}
}