Changeset - r20420:0d08d63e1ea5
[Not reviewed]
master
0 3 0
fonsinchen - 11 years ago 2013-06-23 08:29:28
fonsinchen@openttd.org
(svn r25435) -Fix: reroute cargo in vehicles if station is deleted
3 files changed with 37 insertions and 21 deletions:
0 comments (0 inline, 0 general)
src/station.cpp
Show inline comments
 
@@ -92,18 +92,19 @@ Station::~Station()
 

	
 
	for (CargoID c = 0; c < NUM_CARGO; ++c) {
 
		LinkGraph *lg = LinkGraph::GetIfValid(this->goods[c].link_graph);
 
		if (lg != NULL) {
 
			lg->RemoveNode(this->goods[c].node);
 
			if (lg->Size() == 0) {
 
				LinkGraphSchedule::Instance()->Unqueue(lg);
 
				delete lg;
 
		if (lg == NULL) continue;
 

	
 
		for (NodeID node = 0; node < lg->Size(); ++node) {
 
			if ((*lg)[node][this->goods[c].node].LastUpdate() != INVALID_DATE) {
 
				Station *st = Station::Get((*lg)[node].Station());
 
				st->goods[c].flows.DeleteFlows(this->index);
 
				RerouteCargo(st, c, this->index, st->index);
 
			}
 
		}
 
		Station *st;
 
		FOR_ALL_STATIONS(st) {
 
			GoodsEntry *ge = &st->goods[c];
 
			ge->flows.DeleteFlows(this->index);
 
			ge->cargo.Reroute(UINT_MAX, &ge->cargo, this->index, st->index, ge);
 
		lg->RemoveNode(this->goods[c].node);
 
		if (lg->Size() == 0) {
 
			LinkGraphSchedule::Instance()->Unqueue(lg);
 
			delete lg;
 
		}
 
	}
 

	
src/station_cmd.cpp
Show inline comments
 
@@ -3378,6 +3378,30 @@ static void UpdateStationRating(Station 
 
}
 

	
 
/**
 
 * Reroute cargo of type c at station st or in any vehicles unloading there.
 
 * Make sure the cargo's new next hop is neither "avoid" nor "avoid2".
 
 * @param st Station to be rerouted at.
 
 * @param c Type of cargo.
 
 * @param avoid Original next hop of cargo, avoid this.
 
 * @param avoid2 Another station to be avoided when rerouting.
 
 */
 
void RerouteCargo(Station *st, CargoID c, StationID avoid, StationID avoid2)
 
{
 
	GoodsEntry &ge = st->goods[c];
 

	
 
	/* Reroute cargo in station. */
 
	ge.cargo.Reroute(UINT_MAX, &ge.cargo, avoid, avoid2, &ge);
 

	
 
	/* Reroute cargo staged to be transfered. */
 
	for (std::list<Vehicle *>::iterator it(st->loading_vehicles.begin()); it != st->loading_vehicles.end(); ++it) {
 
		for (Vehicle *v = *it; v != NULL; v = v->Next()) {
 
			if (v->cargo_type != c) continue;
 
			v->cargo.Reroute(UINT_MAX, &v->cargo, avoid, avoid2, &ge);
 
		}
 
	}
 
}
 

	
 
/**
 
 * Check all next hops of cargo packets in this station for existance of a
 
 * a valid link they may use to travel on. Reroute any cargo not having a valid
 
 * link and remove timed out links found like this from the linkgraph. We're
 
@@ -3402,17 +3426,7 @@ void DeleteStaleLinks(Station *from)
 
					(DistanceManhattan(from->xy, to->xy) >> 2)) {
 
				node.RemoveEdge(to->goods[c].node);
 
				ge.flows.DeleteFlows(to->index);
 

	
 
				/* Reroute cargo in station. */
 
				ge.cargo.Reroute(UINT_MAX, &ge.cargo, to->index, from->index, &ge);
 

	
 
				/* Reroute cargo staged to be transfered. */
 
				for (std::list<Vehicle *>::iterator it(from->loading_vehicles.begin()); it != from->loading_vehicles.end(); ++it) {
 
					for (Vehicle *v = *it; v != NULL; v = v->Next()) {
 
						if (v->cargo_type != c) continue;
 
						v->cargo.Reroute(UINT_MAX, &v->cargo, to->index, from->index, &ge);
 
					}
 
				}
 
				RerouteCargo(from, c, to->index, from->index);
 
			}
 
		}
 
		assert(_date >= lg->LastCompression());
src/station_func.h
Show inline comments
 
@@ -50,6 +50,7 @@ bool SplitGroundSpriteForOverlay(const T
 

	
 
void IncreaseStats(Station *st, const Vehicle *v, StationID next_station_id);
 
void IncreaseStats(Station *st, CargoID cargo, StationID next_station_id, uint capacity, uint usage);
 
void RerouteCargo(Station *st, CargoID c, StationID avoid, StationID avoid2);
 

	
 
/**
 
 * Calculates the maintenance cost of a number of station tiles.
0 comments (0 inline, 0 general)