Fix: Do not send vehicles towards incomplete PF nodes
YAPF could end up in a situation where it sets the best intermediate node
to a node whose construction is never finalized (i.e. it is never added to
the open list). The content of the node would be overwritten in the next
round, potentially sending the vehicle to an unwanted location.
(cherry picked from commit 0125ba82e8)
			
			
This commit is contained in:
		 Vít Šefl
					Vít Šefl
				
			
				
					committed by
					
						 Jonathan G Rennison
						Jonathan G Rennison
					
				
			
			
				
	
			
			
			 Jonathan G Rennison
						Jonathan G Rennison
					
				
			
						parent
						
							ab74800b8e
						
					
				
				
					commit
					a73ddf4a35
				
			| @@ -260,9 +260,9 @@ public: | |||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (m_max_search_nodes > 0 && (m_pBestIntermediateNode == nullptr || (m_pBestIntermediateNode->GetCostEstimate() - m_pBestIntermediateNode->GetCost()) > (n.GetCostEstimate() - n.GetCost()))) { | 		/* The new node can be set as the best intermediate node only once we're | ||||||
| 			m_pBestIntermediateNode = &n; | 		 * certain it will be finalized by being inserted into the open list. */ | ||||||
| 		} | 		bool set_intermediate = m_max_search_nodes > 0 && (m_pBestIntermediateNode == nullptr || (m_pBestIntermediateNode->GetCostEstimate() - m_pBestIntermediateNode->GetCost()) > (n.GetCostEstimate() - n.GetCost())); | ||||||
|  |  | ||||||
| 		/* check new node against open list */ | 		/* check new node against open list */ | ||||||
| 		Node *openNode = m_nodes.FindOpenNode(n.GetKey()); | 		Node *openNode = m_nodes.FindOpenNode(n.GetKey()); | ||||||
| @@ -275,6 +275,7 @@ public: | |||||||
| 				*openNode = n; | 				*openNode = n; | ||||||
| 				/* add the updated old node back to open list */ | 				/* add the updated old node back to open list */ | ||||||
| 				m_nodes.InsertOpenNode(*openNode); | 				m_nodes.InsertOpenNode(*openNode); | ||||||
|  | 				if (set_intermediate) m_pBestIntermediateNode = openNode; | ||||||
| 			} | 			} | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| @@ -300,6 +301,7 @@ public: | |||||||
| 		/* the new node is really new | 		/* the new node is really new | ||||||
| 		 * add it to the open list */ | 		 * add it to the open list */ | ||||||
| 		m_nodes.InsertOpenNode(n); | 		m_nodes.InsertOpenNode(n); | ||||||
|  | 		if (set_intermediate) m_pBestIntermediateNode = &n; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	const VehicleType * GetVehicle() const | 	const VehicleType * GetVehicle() const | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user