179 lines
5.3 KiB
Java

package org.bukkit.craftbukkit.entity;
import com.google.common.base.Preconditions;
import java.util.stream.Collectors;
import net.minecraft.world.entity.vehicle.EntityBoat;
import org.bukkit.TreeSpecies;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
public class CraftBoat extends CraftVehicle implements Boat {
public CraftBoat(CraftServer server, EntityBoat entity) {
super(server, entity);
}
@Override
public TreeSpecies getWoodType() {
return getTreeSpecies(getHandle().getBoatType());
}
@Override
public void setWoodType(TreeSpecies species) {
getHandle().setType(getBoatType(species));
}
@Override
public Type getBoatType() {
return boatTypeFromNms(getHandle().getBoatType());
}
@Override
public void setBoatType(Type type) {
Preconditions.checkArgument(type != null, "Boat.Type cannot be null");
getHandle().setType(boatTypeToNms(type));
}
@Override
public double getMaxSpeed() {
return getHandle().maxSpeed;
}
@Override
public void setMaxSpeed(double speed) {
if (speed >= 0D) {
getHandle().maxSpeed = speed;
}
}
@Override
public double getOccupiedDeceleration() {
return getHandle().occupiedDeceleration;
}
@Override
public void setOccupiedDeceleration(double speed) {
if (speed >= 0D) {
getHandle().occupiedDeceleration = speed;
}
}
@Override
public double getUnoccupiedDeceleration() {
return getHandle().unoccupiedDeceleration;
}
@Override
public void setUnoccupiedDeceleration(double speed) {
getHandle().unoccupiedDeceleration = speed;
}
@Override
public boolean getWorkOnLand() {
return getHandle().landBoats;
}
@Override
public void setWorkOnLand(boolean workOnLand) {
getHandle().landBoats = workOnLand;
}
@Override
public Status getStatus() {
return boatStatusFromNms(getHandle().status);
}
@Override
public EntityBoat getHandle() {
return (EntityBoat) entity;
}
@Override
public String toString() {
return "CraftBoat{boatType=" + getBoatType() + ",status=" + getStatus() + ",passengers=" + getPassengers().stream().map(Entity::toString).collect(Collectors.joining("-", "{", "}")) + "}";
}
@Override
public EntityType getType() {
return EntityType.BOAT;
}
public static Boat.Type boatTypeFromNms(EntityBoat.EnumBoatType boatType) {
return switch (boatType) {
default -> throw new EnumConstantNotPresentException(Type.class, boatType.name());
case OAK -> Type.OAK;
case BIRCH -> Type.BIRCH;
case ACACIA -> Type.ACACIA;
case JUNGLE -> Type.JUNGLE;
case SPRUCE -> Type.SPRUCE;
case DARK_OAK -> Type.DARK_OAK;
case MANGROVE -> Type.MANGROVE;
};
}
public static EntityBoat.EnumBoatType boatTypeToNms(Boat.Type type) {
return switch (type) {
default -> throw new EnumConstantNotPresentException(EntityBoat.EnumBoatType.class, type.name());
case MANGROVE -> EntityBoat.EnumBoatType.MANGROVE;
case SPRUCE -> EntityBoat.EnumBoatType.SPRUCE;
case DARK_OAK -> EntityBoat.EnumBoatType.DARK_OAK;
case JUNGLE -> EntityBoat.EnumBoatType.JUNGLE;
case ACACIA -> EntityBoat.EnumBoatType.ACACIA;
case BIRCH -> EntityBoat.EnumBoatType.BIRCH;
case OAK -> EntityBoat.EnumBoatType.OAK;
};
}
public static Status boatStatusFromNms(EntityBoat.EnumStatus enumStatus) {
return switch (enumStatus) {
default -> throw new EnumConstantNotPresentException(Status.class, enumStatus.name());
case IN_AIR -> Status.IN_AIR;
case ON_LAND -> Status.ON_LAND;
case UNDER_WATER -> Status.UNDER_WATER;
case UNDER_FLOWING_WATER -> Status.UNDER_FLOWING_WATER;
case IN_WATER -> Status.IN_WATER;
};
}
@Deprecated
public static TreeSpecies getTreeSpecies(EntityBoat.EnumBoatType boatType) {
switch (boatType) {
case SPRUCE:
return TreeSpecies.REDWOOD;
case BIRCH:
return TreeSpecies.BIRCH;
case JUNGLE:
return TreeSpecies.JUNGLE;
case ACACIA:
return TreeSpecies.ACACIA;
case DARK_OAK:
return TreeSpecies.DARK_OAK;
case OAK:
default:
return TreeSpecies.GENERIC;
}
}
@Deprecated
public static EntityBoat.EnumBoatType getBoatType(TreeSpecies species) {
switch (species) {
case REDWOOD:
return EntityBoat.EnumBoatType.SPRUCE;
case BIRCH:
return EntityBoat.EnumBoatType.BIRCH;
case JUNGLE:
return EntityBoat.EnumBoatType.JUNGLE;
case ACACIA:
return EntityBoat.EnumBoatType.ACACIA;
case DARK_OAK:
return EntityBoat.EnumBoatType.DARK_OAK;
case GENERIC:
default:
return EntityBoat.EnumBoatType.OAK;
}
}
}