package com.simibubi.create.content.contraptions.relays.gauge; import java.util.List; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour; import com.simibubi.create.compat.computercraft.ComputerCraftProxy; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; public class SpeedGaugeTileEntity extends GaugeTileEntity { public AbstractComputerBehaviour computerBehaviour; public SpeedGaugeTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); behaviours.add(computerBehaviour = ComputerCraftProxy.behaviour(this)); } @Override public void onSpeedChanged(float prevSpeed) { super.onSpeedChanged(prevSpeed); float speed = Math.abs(getSpeed()); dialTarget = getDialTarget(speed); color = Color.mixColors(SpeedLevel.of(speed) .getColor(), 0xffffff, .25f); setChanged(); } public static float getDialTarget(float speed) { speed = Math.abs(speed); float medium = AllConfigs.SERVER.kinetics.mediumSpeed.get() .floatValue(); float fast = AllConfigs.SERVER.kinetics.fastSpeed.get() .floatValue(); float max = AllConfigs.SERVER.kinetics.maxRotationSpeed.get() .floatValue(); float target = 0; if (speed == 0) target = 0; else if (speed < medium) target = Mth.lerp(speed / medium, 0, .45f); else if (speed < fast) target = Mth.lerp((speed - medium) / (fast - medium), .45f, .75f); else target = Mth.lerp((speed - fast) / (max - fast), .75f, 1.125f); return target; } @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { super.addToGoggleTooltip(tooltip, isPlayerSneaking); Lang.translate("gui.speedometer.title") .style(ChatFormatting.GRAY) .forGoggles(tooltip); SpeedLevel.getFormattedSpeedText(speed, isOverStressed()) .forGoggles(tooltip); return true; } @NotNull @Override public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { if (computerBehaviour.isPeripheralCap(cap)) return computerBehaviour.getPeripheralCapability(); return super.getCapability(cap, side); } @Override public void invalidateCaps() { super.invalidateCaps(); computerBehaviour.removePeripheral(); } }