CreateMod/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java
caelwarner 56a1210fff
Created ComputerBehaviour behaviour
- ComputerBehaviour replaces ComputerControllable and SyncedComputerControllable
2022-10-19 22:39:38 -07:00

99 lines
3.1 KiB
Java

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.ComputerBehaviour;
import com.simibubi.create.compat.computercraft.peripherals.SpeedGaugePeripheral;
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 {
ComputerBehaviour computerBehaviour;
public SpeedGaugeTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
super.addBehaviours(behaviours);
behaviours.add(computerBehaviour = new ComputerBehaviour(this, () -> new SpeedGaugePeripheral(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<Component> 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 <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
if (ComputerBehaviour.isPeripheralCap(cap))
return computerBehaviour.getPeripheralCapability();
return super.getCapability(cap, side);
}
@Override
public void invalidateCaps() {
super.invalidateCaps();
computerBehaviour.removePeripheral();
}
}