59 lines
2.1 KiB
Java
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);
|
|
}
|
|
}
|