CreateMod/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java
caelwarner 94e3ed44ad
Added ComputerScreen
- ComputerScreen shows that tile entity currently has computers attached and therefore cannot be controlled manually
2022-10-26 16:57:12 -07:00

131 lines
4 KiB
Java

package com.simibubi.create.content.logistics.trains.management.edgePoint.station;
import java.lang.ref.WeakReference;
import java.util.List;
import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.CreateClient;
import com.simibubi.create.compat.computercraft.ComputerScreen;
import com.simibubi.create.content.logistics.trains.entity.Carriage;
import com.simibubi.create.content.logistics.trains.entity.Train;
import com.simibubi.create.content.logistics.trains.entity.TrainIconType;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.utility.Components;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public abstract class AbstractStationScreen extends AbstractSimiScreen {
protected AllGuiTextures background;
protected StationTileEntity te;
protected GlobalStation station;
protected WeakReference<Train> displayedTrain;
private IconButton confirmButton;
public AbstractStationScreen(StationTileEntity te, GlobalStation station) {
super(te.getBlockState()
.getBlock()
.getName());
this.te = te;
this.station = station;
displayedTrain = new WeakReference<>(null);
}
@Override
protected void init() {
if (te.computerBehaviour.hasAttachedComputer())
minecraft.setScreen(new ComputerScreen(title, () -> Components.literal(station.name),
this::renderAdditional, this, te.computerBehaviour::hasAttachedComputer));
setWindowSize(background.width, background.height);
super.init();
clearWidgets();
int x = guiLeft;
int y = guiTop;
confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
confirmButton.withCallback(this::onClose);
addRenderableWidget(confirmButton);
}
public int getTrainIconWidth(Train train) {
TrainIconType icon = train.icon;
List<Carriage> carriages = train.carriages;
int w = icon.getIconWidth(TrainIconType.ENGINE);
if (carriages.size() == 1)
return w;
for (int i = 1; i < carriages.size(); i++) {
if (i == carriages.size() - 1 && train.doubleEnded) {
w += icon.getIconWidth(TrainIconType.FLIPPED_ENGINE) + 1;
break;
}
Carriage carriage = carriages.get(i);
w += icon.getIconWidth(carriage.bogeySpacing) + 1;
}
return w;
}
@Override
public void tick() {
super.tick();
if (te.computerBehaviour.hasAttachedComputer())
minecraft.setScreen(new ComputerScreen(title, () -> Components.literal(station.name),
this::renderAdditional, this, te.computerBehaviour::hasAttachedComputer));
}
@Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
int x = guiLeft;
int y = guiTop;
background.render(ms, x, y, this);
renderAdditional(ms, mouseX, mouseY, partialTicks, x, y, background);
}
private void renderAdditional(PoseStack ms, int mouseX, int mouseY, float partialTicks, int guiLeft, int guiTop, AllGuiTextures background) {
ms.pushPose();
TransformStack msr = TransformStack.cast(ms);
msr.pushPose()
.translate(guiLeft + background.width + 4, guiTop + background.height + 4, 100)
.scale(40)
.rotateX(-22)
.rotateY(63);
GuiGameElement.of(te.getBlockState()
.setValue(BlockStateProperties.WATERLOGGED, false))
.render(ms);
if (te.resolveFlagAngle()) {
msr.translate(1 / 16f, -19 / 16f, -12 / 16f);
StationRenderer.transformFlag(msr, te, partialTicks, 180, false);
GuiGameElement.of(getFlag(partialTicks))
.render(ms);
}
ms.popPose();
}
protected abstract PartialModel getFlag(float partialTicks);
protected Train getImminent() {
return te.imminentTrain == null ? null : CreateClient.RAILWAYS.trains.get(te.imminentTrain);
}
protected boolean trainPresent() {
return te.trainPresent;
}
}