Changeset - r14560:a63b9e37c39e
[Not reviewed]
master
0 3 0
rubidium - 14 years ago 2010-02-15 23:55:04
rubidium@openttd.org
(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
3 files changed with 22 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/pathfinder/yapf/yapf_costrail.hpp
Show inline comments
 
@@ -410,7 +410,9 @@ no_entry_cost: // jump here at the begin
 
				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. */
src/pathfinder/yapf/yapf_destrail.hpp
Show inline comments
 
@@ -135,8 +135,17 @@ public:
 
	void SetDestination(const Train *v)
 
	{
 
		switch (v->current_order.GetType()) {
 
			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:
 
			case OT_GOTO_WAYPOINT:
 
				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;
src/waypoint_base.h
Show inline comments
 
@@ -40,6 +40,15 @@ struct Waypoint : SpecializedStation<Way
 
	{
 
		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)
0 comments (0 inline, 0 general)