94e3ed44ad
- ComputerScreen shows that tile entity currently has computers attached and therefore cannot be controlled manually
131 lines
4 KiB
Java
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;
|
|
}
|
|
|
|
}
|