From 18e75dbc880b72be78ebd51fb7df341ece6c17c2 Mon Sep 17 00:00:00 2001 From: PeterN Date: Mon, 18 Sep 2023 22:43:03 +0100 Subject: [PATCH] Fix: Don't produce invalid cargo. (#11314) Production for secondary industries did not always check that the produced cargo type isn't valid. --- src/economy.cpp | 3 ++- src/industry_cmd.cpp | 4 ++++ src/newgrf_industries.cpp | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/economy.cpp b/src/economy.cpp index caf0d2a4f5..758363d3c0 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1169,9 +1169,10 @@ static void TriggerIndustryProduction(Industry *i) } } else { for (auto ita = std::begin(i->accepted); ita != std::end(i->accepted); ++ita) { - if (ita->waiting == 0) continue; + if (ita->waiting == 0 || !IsValidCargoID(ita->cargo)) continue; for (auto itp = std::begin(i->produced); itp != std::end(i->produced); ++itp) { + if (!IsValidCargoID(itp->cargo)) continue; itp->waiting = ClampTo(itp->waiting + (ita->waiting * indspec->input_cargo_multiplier[ita - std::begin(i->accepted)][itp - std::begin(i->produced)] / 256)); } diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 5fbbdb2131..6d5f17e6ac 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1122,6 +1122,9 @@ static bool SearchLumberMillTrees(TileIndex tile, void *user_data) */ static void ChopLumberMillTrees(Industry *i) { + /* Skip production if cargo slot is invalid. */ + if (!IsValidCargoID(i->produced[0].cargo)) return; + /* We only want to cut trees if all tiles are completed. */ for (TileIndex tile_cur : i->location) { if (i->TileBelongsToIndustry(tile_cur)) { @@ -1160,6 +1163,7 @@ static void ProduceIndustryGoods(Industry *i) IndustryBehaviour indbehav = indsp->behaviour; for (auto &p : i->produced) { + if (!IsValidCargoID(p.cargo)) continue; p.waiting = ClampTo(p.waiting + p.rate); } diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index e0ce836108..acbf5c2d81 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -643,9 +643,11 @@ void IndustryProductionCallback(Industry *ind, int reason) if (group->version < 2) { /* Callback parameters map directly to industry cargo slot indices */ for (uint i = 0; i < group->num_input; i++) { + if (!IsValidCargoID(ind->accepted[i].cargo)) continue; ind->accepted[i].waiting = ClampTo(ind->accepted[i].waiting - DerefIndProd(group->subtract_input[i], deref) * multiplier); } for (uint i = 0; i < group->num_output; i++) { + if (!IsValidCargoID(ind->produced[i].cargo)) continue; ind->produced[i].waiting = ClampTo(ind->produced[i].waiting + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier); } } else {