mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-09 15:41:15 +00:00
(svn r26286) -Fix: Thoroughly erase dead flows.
This commit is contained in:
parent
e4a4f2c1dd
commit
91407b924e
@ -34,6 +34,17 @@ LinkGraphJob::LinkGraphJob(const LinkGraph &orig) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erase all flows originating at a specific node.
|
||||||
|
* @param from Node to erase flows for.
|
||||||
|
*/
|
||||||
|
void LinkGraphJob::EraseFlows(NodeID from)
|
||||||
|
{
|
||||||
|
for (NodeID node_id = 0; node_id < this->Size(); ++node_id) {
|
||||||
|
(*this)[node_id].Flows().erase(from);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Join the link graph job and destroy it.
|
* Join the link graph job and destroy it.
|
||||||
*/
|
*/
|
||||||
@ -52,14 +63,20 @@ LinkGraphJob::~LinkGraphJob()
|
|||||||
for (NodeID node_id = 0; node_id < size; ++node_id) {
|
for (NodeID node_id = 0; node_id < size; ++node_id) {
|
||||||
Node from = (*this)[node_id];
|
Node from = (*this)[node_id];
|
||||||
|
|
||||||
/* The station can have been deleted. */
|
/* The station can have been deleted. Remove all flows originating from it then. */
|
||||||
Station *st = Station::GetIfValid(from.Station());
|
Station *st = Station::GetIfValid(from.Station());
|
||||||
if (st == NULL) continue;
|
if (st == NULL) {
|
||||||
|
this->EraseFlows(node_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Link graph merging and station deletion may change around IDs. Make
|
/* Link graph merging and station deletion may change around IDs. Make
|
||||||
* sure that everything is still consistent or ignore it otherwise. */
|
* sure that everything is still consistent or ignore it otherwise. */
|
||||||
GoodsEntry &ge = st->goods[this->Cargo()];
|
GoodsEntry &ge = st->goods[this->Cargo()];
|
||||||
if (ge.link_graph != this->link_graph.index || ge.node != node_id) continue;
|
if (ge.link_graph != this->link_graph.index || ge.node != node_id) {
|
||||||
|
this->EraseFlows(node_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
LinkGraph *lg = LinkGraph::Get(ge.link_graph);
|
LinkGraph *lg = LinkGraph::Get(ge.link_graph);
|
||||||
FlowStatMap &flows = from.Flows();
|
FlowStatMap &flows = from.Flows();
|
||||||
|
@ -64,6 +64,8 @@ protected:
|
|||||||
NodeAnnotationVector nodes; ///< Extra node data necessary for link graph calculation.
|
NodeAnnotationVector nodes; ///< Extra node data necessary for link graph calculation.
|
||||||
EdgeAnnotationMatrix edges; ///< Extra edge data necessary for link graph calculation.
|
EdgeAnnotationMatrix edges; ///< Extra edge data necessary for link graph calculation.
|
||||||
|
|
||||||
|
void EraseFlows(NodeID from);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,8 +99,9 @@ Station::~Station()
|
|||||||
if (lg == NULL) continue;
|
if (lg == NULL) continue;
|
||||||
|
|
||||||
for (NodeID node = 0; node < lg->Size(); ++node) {
|
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());
|
Station *st = Station::Get((*lg)[node].Station());
|
||||||
|
st->goods[c].flows.erase(this->index);
|
||||||
|
if ((*lg)[node][this->goods[c].node].LastUpdate() != INVALID_DATE) {
|
||||||
st->goods[c].flows.DeleteFlows(this->index);
|
st->goods[c].flows.DeleteFlows(this->index);
|
||||||
RerouteCargo(st, c, this->index, st->index);
|
RerouteCargo(st, c, this->index, st->index);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user