79 lines
3.2 KiB
Java
79 lines
3.2 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.BlockTags;
|
|
import net.minecraft.world.entity.EntitySpawnReason;
|
|
import net.minecraft.world.entity.EntityType;
|
|
import net.minecraft.world.entity.vehicle.AbstractMinecart;
|
|
import net.minecraft.world.item.ItemStack;
|
|
import net.minecraft.world.level.block.BaseRailBlock;
|
|
import net.minecraft.world.level.block.DispenserBlock;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.block.state.properties.RailShape;
|
|
import net.minecraft.world.phys.Vec3;
|
|
|
|
public class MinecartDispenseItemBehavior extends DefaultDispenseItemBehavior {
|
|
private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior();
|
|
private final EntityType<? extends AbstractMinecart> entityType;
|
|
|
|
public MinecartDispenseItemBehavior(EntityType<? extends AbstractMinecart> p_367202_) {
|
|
this.entityType = p_367202_;
|
|
}
|
|
|
|
@Override
|
|
public ItemStack execute(BlockSource p_366036_, ItemStack p_368867_) {
|
|
Direction direction = p_366036_.state().getValue(DispenserBlock.FACING);
|
|
ServerLevel serverlevel = p_366036_.level();
|
|
Vec3 vec3 = p_366036_.center();
|
|
double d0 = vec3.x() + direction.getStepX() * 1.125;
|
|
double d1 = Math.floor(vec3.y()) + direction.getStepY();
|
|
double d2 = vec3.z() + direction.getStepZ() * 1.125;
|
|
BlockPos blockpos = p_366036_.pos().relative(direction);
|
|
BlockState blockstate = serverlevel.getBlockState(blockpos);
|
|
double d3;
|
|
if (blockstate.is(BlockTags.RAILS)) {
|
|
if (getRailShape(blockstate).isSlope()) {
|
|
d3 = 0.6;
|
|
} else {
|
|
d3 = 0.1;
|
|
}
|
|
} else {
|
|
if (!blockstate.isAir()) {
|
|
return this.defaultDispenseItemBehavior.dispense(p_366036_, p_368867_);
|
|
}
|
|
|
|
BlockState blockstate1 = serverlevel.getBlockState(blockpos.below());
|
|
if (!blockstate1.is(BlockTags.RAILS)) {
|
|
return this.defaultDispenseItemBehavior.dispense(p_366036_, p_368867_);
|
|
}
|
|
|
|
if (direction != Direction.DOWN && getRailShape(blockstate1).isSlope()) {
|
|
d3 = -0.4;
|
|
} else {
|
|
d3 = -0.9;
|
|
}
|
|
}
|
|
|
|
Vec3 vec31 = new Vec3(d0, d1 + d3, d2);
|
|
AbstractMinecart abstractminecart = AbstractMinecart.createMinecart(
|
|
serverlevel, vec31.x, vec31.y, vec31.z, this.entityType, EntitySpawnReason.DISPENSER, p_368867_, null
|
|
);
|
|
if (abstractminecart != null) {
|
|
serverlevel.addFreshEntity(abstractminecart);
|
|
p_368867_.shrink(1);
|
|
}
|
|
|
|
return p_368867_;
|
|
}
|
|
|
|
private static RailShape getRailShape(BlockState p_364080_) {
|
|
return p_364080_.getBlock() instanceof BaseRailBlock baserailblock ? p_364080_.getValue(baserailblock.getShapeProperty()) : RailShape.NORTH_SOUTH;
|
|
}
|
|
|
|
@Override
|
|
protected void playSound(BlockSource p_362755_) {
|
|
p_362755_.level().levelEvent(1000, p_362755_.pos(), 0);
|
|
}
|
|
} |