Changeset - r27935:8fbfc030e7be
[Not reviewed]
master
0 3 0
PeterN - 12 months ago 2023-09-18 21:43:03
peter1138@openttd.org
Fix: Don't produce invalid cargo. (#11314)

Production for secondary industries did not always check that the produced cargo type isn't valid.
3 files changed with 8 insertions and 1 deletions:
0 comments (0 inline, 0 general)
src/economy.cpp
Show inline comments
 
@@ -1166,15 +1166,16 @@ static void TriggerIndustryProduction(In
 
			IndustryProductionCallback(i, 0);
 
		} else {
 
			SetWindowDirty(WC_INDUSTRY_VIEW, i->index);
 
		}
 
	} 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<uint16_t>(itp->waiting + (ita->waiting * indspec->input_cargo_multiplier[ita - std::begin(i->accepted)][itp - std::begin(i->produced)] / 256));
 
			}
 

	
 
			ita->waiting = 0;
 
		}
 
	}
src/industry_cmd.cpp
Show inline comments
 
@@ -1119,12 +1119,15 @@ static bool SearchLumberMillTrees(TileIn
 
/**
 
 * Perform a circular search around the Lumber Mill in order to find trees to cut
 
 * @param i industry
 
 */
 
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)) {
 
			if (!IsIndustryCompleted(tile_cur)) return;
 
		}
 
	}
 
@@ -1157,12 +1160,13 @@ static void ProduceIndustryGoods(Industr
 
	/* produce some cargo */
 
	if ((i->counter % Ticks::INDUSTRY_PRODUCE_TICKS) == 0) {
 
		if (HasBit(indsp->callback_mask, CBM_IND_PRODUCTION_256_TICKS)) IndustryProductionCallback(i, 1);
 

	
 
		IndustryBehaviour indbehav = indsp->behaviour;
 
		for (auto &p : i->produced) {
 
			if (!IsValidCargoID(p.cargo)) continue;
 
			p.waiting = ClampTo<uint16_t>(p.waiting + p.rate);
 
		}
 

	
 
		if ((indbehav & INDUSTRYBEH_PLANT_FIELDS) != 0) {
 
			uint16_t cb_res = CALLBACK_FAILED;
 
			if (HasBit(indsp->callback_mask, CBM_IND_SPECIAL_EFFECT)) {
src/newgrf_industries.cpp
Show inline comments
 
@@ -640,15 +640,17 @@ void IndustryProductionCallback(Industry
 

	
 
		bool deref = (group->version >= 1);
 

	
 
		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<uint16_t>(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<uint16_t>(ind->produced[i].waiting + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier);
 
			}
 
		} else {
 
			/* Callback receives list of cargos to apply for, which need to have their cargo slots in industry looked up */
 
			for (uint i = 0; i < group->num_input; i++) {
 
				auto it = ind->GetCargoAccepted(group->cargo_input[i]);
0 comments (0 inline, 0 general)