mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-12 10:30:28 +00:00
(svn r19141) -Fix [FS#3619] (r18421): look-ahead for multitile waypoints 'made up' data that shouldn't go into the cache, causing desyncs in MP
This commit is contained in:
parent
80225cf246
commit
3626eb340e
@ -410,7 +410,9 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
end_segment_reason |= ESRB_DEPOT;
|
||||
|
||||
} else if (cur.tile_type == MP_STATION && IsRailWaypoint(cur.tile)) {
|
||||
if (v->current_order.IsType(OT_GOTO_WAYPOINT) && GetStationIndex(cur.tile) == v->current_order.GetDestination()) {
|
||||
if (v->current_order.IsType(OT_GOTO_WAYPOINT) &&
|
||||
GetStationIndex(cur.tile) == v->current_order.GetDestination() &&
|
||||
!Waypoint::Get(v->current_order.GetDestination())->IsSingleTile()) {
|
||||
/* This waypoint is our destination; maybe this isn't an unreserved
|
||||
* one, so check that and if so see that as the last signal being
|
||||
* red. This way waypoints near stations should work better. */
|
||||
|
@ -135,8 +135,17 @@ public:
|
||||
void SetDestination(const Train *v)
|
||||
{
|
||||
switch (v->current_order.GetType()) {
|
||||
case OT_GOTO_STATION:
|
||||
case OT_GOTO_WAYPOINT:
|
||||
if (!Waypoint::Get(v->current_order.GetDestination())->IsSingleTile()) {
|
||||
/* In case of 'complex' waypoints we need to do a look
|
||||
* ahead. This look ahead messes a bit about, which
|
||||
* means that it 'corrupts' the cache. To prevent this
|
||||
* we disable caching when we're looking for a complex
|
||||
* waypoint. */
|
||||
Yapf().DisableCache(true);
|
||||
}
|
||||
/* FALL THROUGH */
|
||||
case OT_GOTO_STATION:
|
||||
m_destTile = CalcClosestStationTile(v->current_order.GetDestination(), v->tile, v->current_order.IsType(OT_GOTO_STATION) ? STATION_RAIL : STATION_WAYPOINT);
|
||||
m_dest_station_id = v->current_order.GetDestination();
|
||||
m_destTrackdirs = INVALID_TRACKDIR_BIT;
|
||||
|
@ -40,6 +40,15 @@ struct Waypoint : SpecializedStation<Waypoint, true> {
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this a single tile waypoint?
|
||||
* @return true if it is.
|
||||
*/
|
||||
FORCEINLINE bool IsSingleTile() const
|
||||
{
|
||||
return (this->facilities & FACIL_TRAIN) != 0 && this->train_station.w == 1 && this->train_station.h == 1;
|
||||
}
|
||||
};
|
||||
|
||||
#define FOR_ALL_WAYPOINTS(var) FOR_ALL_BASE_STATIONS_OF_TYPE(Waypoint, var)
|
||||
|
Loading…
Reference in New Issue
Block a user