mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-05 03:22:37 +01:00
Take materials into consideration when trains pathfind
This commit is contained in:
parent
fca02ae4bf
commit
b306cf2124
6 changed files with 54 additions and 5 deletions
|
@ -10,6 +10,7 @@ import java.util.Set;
|
|||
import javax.annotation.Nullable;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import com.mojang.math.Vector3f;
|
||||
|
@ -18,6 +19,9 @@ import com.simibubi.create.AllBogeyStyles;
|
|||
import com.simibubi.create.AllItems;
|
||||
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
|
||||
import com.simibubi.create.content.logistics.trains.entity.BogeyStyle;
|
||||
import com.simibubi.create.content.logistics.trains.entity.Carriage;
|
||||
import com.simibubi.create.content.logistics.trains.entity.CarriageBogey;
|
||||
import com.simibubi.create.content.logistics.trains.entity.TravellingPoint;
|
||||
import com.simibubi.create.content.logistics.trains.track.AbstractBogeyTileEntity;
|
||||
import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement;
|
||||
import com.simibubi.create.content.schematics.ItemRequirement;
|
||||
|
@ -69,6 +73,18 @@ public abstract class AbstractBogeyBlock<T extends AbstractBogeyTileEntity> exte
|
|||
this.size = size;
|
||||
}
|
||||
|
||||
public boolean isOnIncompatibleTrack(Carriage carriage, boolean leading) {
|
||||
TravellingPoint point = leading ? carriage.getLeadingPoint() : carriage.getTrailingPoint();
|
||||
CarriageBogey bogey = leading ? carriage.leadingBogey() : carriage.trailingBogey();
|
||||
return point.edge.getTrackMaterial().trackType != getTrackType(bogey.getStyle());
|
||||
}
|
||||
|
||||
public Set<TrackMaterial.TrackType> getValidPathfindingTypes(BogeyStyle style) {
|
||||
return ImmutableSet.of(getTrackType(style));
|
||||
}
|
||||
|
||||
public abstract TrackMaterial.TrackType getTrackType(BogeyStyle style);
|
||||
|
||||
/**
|
||||
* Only for internal Create use. If you have your own style set, do not call this method
|
||||
*/
|
||||
|
|
|
@ -85,6 +85,11 @@ public class Carriage {
|
|||
bogey2.carriage = this;
|
||||
}
|
||||
|
||||
public boolean isOnIncompatibleTrack() {
|
||||
return leadingBogey().type.isOnIncompatibleTrack(this, true)
|
||||
|| trailingBogey().type.isOnIncompatibleTrack(this, false);
|
||||
}
|
||||
|
||||
public void setTrain(Train train) {
|
||||
this.train = train;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ public class CarriageBogey {
|
|||
|
||||
public CompoundTag bogeyData;
|
||||
|
||||
AbstractBogeyBlock type;
|
||||
AbstractBogeyBlock<?> type;
|
||||
boolean upsideDown;
|
||||
Couple<TravellingPoint> points;
|
||||
|
||||
|
@ -49,7 +49,7 @@ public class CarriageBogey {
|
|||
|
||||
int derailAngle;
|
||||
|
||||
public CarriageBogey(AbstractBogeyBlock type, boolean upsideDown, CompoundTag bogeyData, TravellingPoint point, TravellingPoint point2) {
|
||||
public CarriageBogey(AbstractBogeyBlock<?> type, boolean upsideDown, CompoundTag bogeyData, TravellingPoint point, TravellingPoint point2) {
|
||||
this.type = type;
|
||||
if (bogeyData == null || bogeyData.isEmpty())
|
||||
bogeyData = this.createBogeyData(); // Prevent Crash When Updating
|
||||
|
|
|
@ -14,6 +14,9 @@ import java.util.UUID;
|
|||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.railwayteam.railways.Railways;
|
||||
import com.simibubi.create.content.logistics.trains.TrackMaterial;
|
||||
|
||||
import org.apache.commons.lang3.mutable.MutableDouble;
|
||||
import org.apache.commons.lang3.mutable.MutableObject;
|
||||
|
||||
|
@ -251,7 +254,7 @@ public class Navigation {
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
topSpeed *= train.throttle;
|
||||
double turnTopSpeed = Math.min(topSpeed, train.maxTurnSpeed());
|
||||
|
||||
|
@ -540,6 +543,23 @@ public class Navigation {
|
|||
if (graph == null)
|
||||
return;
|
||||
|
||||
// Cache the list of track types that the train can travel on
|
||||
Set<TrackMaterial.TrackType> validTypes = new HashSet<>();
|
||||
for (int i = 0; i < train.carriages.size(); i++) {
|
||||
Carriage carriage = train.carriages.get(i);
|
||||
if (i == 0) {
|
||||
validTypes.addAll(carriage.leadingBogey().type.getValidPathfindingTypes(carriage.leadingBogey().getStyle()));
|
||||
} else {
|
||||
validTypes.retainAll(carriage.leadingBogey().type.getValidPathfindingTypes(carriage.leadingBogey().getStyle()));
|
||||
}
|
||||
if (carriage.isOnTwoBogeys())
|
||||
validTypes.retainAll(carriage.trailingBogey().type.getValidPathfindingTypes(carriage.trailingBogey().getStyle()));
|
||||
}
|
||||
if (validTypes.isEmpty()) // if there are no valid track types, a route can't be found
|
||||
return;
|
||||
|
||||
Create.LOGGER.info("Valid types: "+validTypes);
|
||||
|
||||
Map<TrackEdge, Integer> penalties = new IdentityHashMap<>();
|
||||
boolean costRelevant = maxCost >= 0;
|
||||
if (costRelevant) {
|
||||
|
@ -579,7 +599,7 @@ public class Navigation {
|
|||
.get(initialNode2);
|
||||
if (initialEdge == null)
|
||||
return;
|
||||
|
||||
|
||||
double distanceToNode2 = forward ? initialEdge.getLength() - startingPoint.position : startingPoint.position;
|
||||
|
||||
frontier.add(new FrontierEntry(distanceToNode2, 0, initialNode1, initialNode2, initialEdge));
|
||||
|
@ -659,6 +679,8 @@ public class Navigation {
|
|||
continue;
|
||||
|
||||
for (Entry<TrackNode, TrackEdge> target : validTargets) {
|
||||
if (!validTypes.contains(target.getValue().getTrackMaterial().trackType))
|
||||
continue;
|
||||
TrackNode newNode = target.getKey();
|
||||
TrackEdge newEdge = target.getValue();
|
||||
double newDistance = newEdge.getLength() + distance;
|
||||
|
|
|
@ -385,7 +385,7 @@ public class Train {
|
|||
int carriageType = first ? last ? Carriage.BOTH : Carriage.FIRST : last ? Carriage.LAST : Carriage.MIDDLE;
|
||||
double actualDistance =
|
||||
carriage.travel(level, graph, distance + totalStress, toFollowForward, toFollowBackward, carriageType);
|
||||
blocked |= carriage.blocked;
|
||||
blocked |= carriage.blocked || carriage.isOnIncompatibleTrack();
|
||||
|
||||
boolean onTwoBogeys = carriage.isOnTwoBogeys();
|
||||
maxStress = Math.max(maxStress, onTwoBogeys ? carriage.bogeySpacing - carriage.getAnchorDiff() : 0);
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.simibubi.create.AllBogeyStyles;
|
|||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||
import com.simibubi.create.content.logistics.trains.BogeySizes;
|
||||
import com.simibubi.create.content.logistics.trains.TrackMaterial;
|
||||
import com.simibubi.create.content.logistics.trains.entity.BogeyStyle;
|
||||
import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
|
@ -26,6 +27,11 @@ public class StandardBogeyBlock extends AbstractBogeyBlock<StandardBogeyTileEnti
|
|||
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackMaterial.TrackType getTrackType(BogeyStyle style) {
|
||||
return TrackMaterial.TrackType.STANDARD;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWheelPointSpacing() {
|
||||
return 2;
|
||||
|
|
Loading…
Reference in a new issue