From a79424e07c106ea6e767bf8e7427ff2524008cfe Mon Sep 17 00:00:00 2001
From: Tim Felgentreff <timfelgentreff@gmail.com>
Date: Tue, 15 Mar 2022 22:25:42 +0100
Subject: [PATCH] cancel building when building from outside and stopping

---
 src/action/action_build.cpp       | 8 ++++++++
 src/action/command.cpp            | 3 +++
 src/include/action/action_build.h | 1 +
 3 files changed, 12 insertions(+)

diff --git a/src/action/action_build.cpp b/src/action/action_build.cpp
index 7dcf11241..01eeb5441 100644
--- a/src/action/action_build.cpp
+++ b/src/action/action_build.cpp
@@ -489,6 +489,14 @@ bool COrder_Build::BuildFromOutside(CUnit &unit) const
 	}
 }
 
+/* virtual */ void COrder_Build::Cancel(CUnit &unit)
+{
+	if (this->State == State_BuildFromOutside && this->BuildingUnit != NULL && this->BuildingUnit->CurrentAction() == UnitActionBuilt) {
+		COrder_Built &targetOrder = *static_cast<COrder_Built *>(this->BuildingUnit->CurrentOrder());
+		targetOrder.Cancel(*this->BuildingUnit);
+	}
+}
+
 /**
 **  Get goal position
 */
diff --git a/src/action/command.cpp b/src/action/command.cpp
index 515ad9ebd..b27212e24 100644
--- a/src/action/command.cpp
+++ b/src/action/command.cpp
@@ -37,6 +37,7 @@
 
 #include "actions.h"
 #include "action/action_built.h"
+#include "action/action_build.h"
 #include "action/action_research.h"
 #include "action/action_train.h"
 #include "action/action_upgradeto.h"
@@ -69,6 +70,8 @@ static void ReleaseOrders(CUnit &unit)
 	for (size_t i = 0; i != unit.Orders.size(); ++i) {
 		if (unit.Orders[i]->Action == UnitActionBuilt) {
 			(dynamic_cast<COrder_Built *>(unit.Orders[i]))->Cancel(unit);
+		} if (unit.Orders[i]->Action == UnitActionBuild) {
+			(dynamic_cast<COrder_Build *>(unit.Orders[i]))->Cancel(unit);
 		} else if (unit.Orders[i]->Action == UnitActionResearch) {
 			(dynamic_cast<COrder_Research *>(unit.Orders[i]))->Cancel(unit);
 		} else if (unit.Orders[i]->Action == UnitActionTrain) {
diff --git a/src/include/action/action_build.h b/src/include/action/action_build.h
index ff909e3b4..f87593d7e 100644
--- a/src/include/action/action_build.h
+++ b/src/include/action/action_build.h
@@ -52,6 +52,7 @@ public:
 	virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);
 
 	virtual void Execute(CUnit &unit);
+	virtual void Cancel(CUnit &unit);
 	virtual PixelPos Show(const CViewport &vp, const PixelPos &lastScreenPos) const;
 	virtual void UpdatePathFinderData(PathFinderInput &input);