mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-01-30 06:45:03 +01:00
Add ComputerCraft integration to Train Observers
- Emit CC events train_passing & train_passed with the name of the train originating these events - Add CC isTrainPassing() function to check passing train presence - Add CC getPassingTrainName() function to get the passing train name, or nil failing that
This commit is contained in:
parent
a889d16c34
commit
231f99cac5
4 changed files with 106 additions and 1 deletions
|
@ -0,0 +1,18 @@
|
||||||
|
package com.simibubi.create.compat.computercraft.events;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
|
||||||
|
import com.simibubi.create.content.trains.entity.Train;
|
||||||
|
|
||||||
|
public class TrainPassEvent implements ComputerEvent {
|
||||||
|
|
||||||
|
public @NotNull Train train;
|
||||||
|
public boolean passing;
|
||||||
|
|
||||||
|
public TrainPassEvent(@NotNull Train train, boolean passing) {
|
||||||
|
this.train = train;
|
||||||
|
this.passing = passing;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -14,12 +14,14 @@ import com.simibubi.create.compat.computercraft.implementation.peripherals.Speed
|
||||||
import com.simibubi.create.compat.computercraft.implementation.peripherals.StationPeripheral;
|
import com.simibubi.create.compat.computercraft.implementation.peripherals.StationPeripheral;
|
||||||
import com.simibubi.create.compat.computercraft.implementation.peripherals.StressGaugePeripheral;
|
import com.simibubi.create.compat.computercraft.implementation.peripherals.StressGaugePeripheral;
|
||||||
import com.simibubi.create.compat.computercraft.implementation.peripherals.SyncedPeripheral;
|
import com.simibubi.create.compat.computercraft.implementation.peripherals.SyncedPeripheral;
|
||||||
|
import com.simibubi.create.compat.computercraft.implementation.peripherals.TrackObserverPeripheral;
|
||||||
import com.simibubi.create.content.kinetics.gauge.SpeedGaugeBlockEntity;
|
import com.simibubi.create.content.kinetics.gauge.SpeedGaugeBlockEntity;
|
||||||
import com.simibubi.create.content.kinetics.gauge.StressGaugeBlockEntity;
|
import com.simibubi.create.content.kinetics.gauge.StressGaugeBlockEntity;
|
||||||
import com.simibubi.create.content.kinetics.speedController.SpeedControllerBlockEntity;
|
import com.simibubi.create.content.kinetics.speedController.SpeedControllerBlockEntity;
|
||||||
import com.simibubi.create.content.kinetics.transmission.sequencer.SequencedGearshiftBlockEntity;
|
import com.simibubi.create.content.kinetics.transmission.sequencer.SequencedGearshiftBlockEntity;
|
||||||
import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity;
|
import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity;
|
||||||
import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity;
|
import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity;
|
||||||
|
import com.simibubi.create.content.trains.observer.TrackObserverBlockEntity;
|
||||||
import com.simibubi.create.content.trains.signal.SignalBlockEntity;
|
import com.simibubi.create.content.trains.signal.SignalBlockEntity;
|
||||||
import com.simibubi.create.content.trains.station.StationBlockEntity;
|
import com.simibubi.create.content.trains.station.StationBlockEntity;
|
||||||
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
|
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
|
||||||
|
@ -61,6 +63,8 @@ public class ComputerBehaviour extends AbstractComputerBehaviour {
|
||||||
return () -> new StressGaugePeripheral(sgbe);
|
return () -> new StressGaugePeripheral(sgbe);
|
||||||
if (be instanceof StationBlockEntity sbe)
|
if (be instanceof StationBlockEntity sbe)
|
||||||
return () -> new StationPeripheral(sbe);
|
return () -> new StationPeripheral(sbe);
|
||||||
|
if (be instanceof TrackObserverBlockEntity tobe)
|
||||||
|
return () -> new TrackObserverPeripheral(tobe);
|
||||||
|
|
||||||
throw new IllegalArgumentException("No peripheral available for " + be.getType()
|
throw new IllegalArgumentException("No peripheral available for " + be.getType()
|
||||||
.getRegistryName());
|
.getRegistryName());
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.simibubi.create.compat.computercraft.implementation.peripherals;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
|
||||||
|
import com.simibubi.create.Create;
|
||||||
|
import com.simibubi.create.compat.computercraft.events.ComputerEvent;
|
||||||
|
import com.simibubi.create.compat.computercraft.events.TrainPassEvent;
|
||||||
|
import com.simibubi.create.content.trains.entity.Train;
|
||||||
|
import com.simibubi.create.content.trains.observer.TrackObserverBlockEntity;
|
||||||
|
|
||||||
|
import dan200.computercraft.api.lua.LuaFunction;
|
||||||
|
|
||||||
|
public class TrackObserverPeripheral extends SyncedPeripheral<TrackObserverBlockEntity> {
|
||||||
|
|
||||||
|
public TrackObserverPeripheral(TrackObserverBlockEntity blockEntity) {
|
||||||
|
super(blockEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@LuaFunction
|
||||||
|
public boolean isTrainPassing() {
|
||||||
|
return Create.RAILWAYS.trains.containsKey(blockEntity.passingTrainUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@LuaFunction
|
||||||
|
public @Nullable String getPassingTrainName() {
|
||||||
|
Train train = Create.RAILWAYS.trains.get(blockEntity.passingTrainUUID);
|
||||||
|
return train == null ? null : train.name.getString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prepareComputerEvent(@NotNull ComputerEvent event) {
|
||||||
|
if (event instanceof TrainPassEvent tpe) {
|
||||||
|
queueEvent(tpe.passing ? "train_passing" : "train_passed", tpe.train.name.getString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return "Create_TrainObserver";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,11 +1,18 @@
|
||||||
package com.simibubi.create.content.trains.observer;
|
package com.simibubi.create.content.trains.observer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.util.transform.TransformStack;
|
import com.jozufozu.flywheel.util.transform.TransformStack;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
import com.simibubi.create.Create;
|
||||||
|
import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour;
|
||||||
|
import com.simibubi.create.compat.computercraft.ComputerCraftProxy;
|
||||||
|
import com.simibubi.create.compat.computercraft.events.TrainPassEvent;
|
||||||
import com.simibubi.create.content.contraptions.ITransformableBlockEntity;
|
import com.simibubi.create.content.contraptions.ITransformableBlockEntity;
|
||||||
import com.simibubi.create.content.contraptions.StructureTransform;
|
import com.simibubi.create.content.contraptions.StructureTransform;
|
||||||
import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock;
|
import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock;
|
||||||
|
@ -18,11 +25,14 @@ import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringB
|
||||||
import com.simibubi.create.foundation.utility.Lang;
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.AABB;
|
import net.minecraft.world.phys.AABB;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
|
|
||||||
public class TrackObserverBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity {
|
public class TrackObserverBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity {
|
||||||
|
|
||||||
|
@ -30,6 +40,9 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans
|
||||||
|
|
||||||
private FilteringBehaviour filtering;
|
private FilteringBehaviour filtering;
|
||||||
|
|
||||||
|
public AbstractComputerBehaviour computerBehaviour;
|
||||||
|
public @Nullable UUID passingTrainUUID;
|
||||||
|
|
||||||
public TrackObserverBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
public TrackObserverBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||||
super(type, pos, state);
|
super(type, pos, state);
|
||||||
}
|
}
|
||||||
|
@ -38,6 +51,7 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans
|
||||||
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
||||||
behaviours.add(edgePoint = new TrackTargetingBehaviour<>(this, EdgePointType.OBSERVER));
|
behaviours.add(edgePoint = new TrackTargetingBehaviour<>(this, EdgePointType.OBSERVER));
|
||||||
behaviours.add(filtering = createFilter().withCallback(this::onFilterChanged));
|
behaviours.add(filtering = createFilter().withCallback(this::onFilterChanged));
|
||||||
|
behaviours.add(computerBehaviour = ComputerCraftProxy.behaviour(this));
|
||||||
filtering.setLabel(Lang.translateDirect("logistics.train_observer.cargo_filter"));
|
filtering.setLabel(Lang.translateDirect("logistics.train_observer.cargo_filter"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,6 +77,17 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans
|
||||||
if (isBlockPowered() == shouldBePowered)
|
if (isBlockPowered() == shouldBePowered)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (observer != null && computerBehaviour.hasAttachedComputer()) {
|
||||||
|
if (shouldBePowered)
|
||||||
|
passingTrainUUID = observer.getCurrentTrain();
|
||||||
|
if (passingTrainUUID != null) {
|
||||||
|
computerBehaviour.prepareComputerEvent(
|
||||||
|
new TrainPassEvent(Create.RAILWAYS.trains.get(passingTrainUUID), shouldBePowered));
|
||||||
|
if (!shouldBePowered)
|
||||||
|
passingTrainUUID = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BlockState blockState = getBlockState();
|
BlockState blockState = getBlockState();
|
||||||
if (blockState.hasProperty(TrackObserverBlock.POWERED))
|
if (blockState.hasProperty(TrackObserverBlock.POWERED))
|
||||||
level.setBlock(worldPosition, blockState.setValue(TrackObserverBlock.POWERED, shouldBePowered), 3);
|
level.setBlock(worldPosition, blockState.setValue(TrackObserverBlock.POWERED, shouldBePowered), 3);
|
||||||
|
@ -110,4 +135,17 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> @NotNull LazyOptional<T> getCapability(@NotNull Capability<T> cap, Direction side) {
|
||||||
|
if (computerBehaviour.isPeripheralCap(cap))
|
||||||
|
return computerBehaviour.getPeripheralCapability();
|
||||||
|
return super.getCapability(cap, side);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invalidateCaps() {
|
||||||
|
super.invalidateCaps();
|
||||||
|
computerBehaviour.removePeripheral();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue