Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Allow disabling the seeder unit of cultivators with a seeder configuration (#989) by helgehelge123 · Pull Request #1285 · Courseplay/Courseplay_FS25 · GitHub
Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow disabling the seeder unit of cultivators with a seeder configuration (#989) by helgehelge123 · Pull Request #1285 · Courseplay/Courseplay_FS25 · GitHub
Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow disabling the seeder unit of cultivators with a seeder configuration (#989) by helgehelge123 · Pull Request #1285 · Courseplay/Courseplay_FS25 · GitHub
Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Allow disabling the seeder unit of cultivators with a seeder configuration (#989) by helgehelge123 · Pull Request #1285 · Courseplay/Courseplay_FS25 · GitHub
Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow disabling the seeder unit of cultivators with a seeder configuration (#989) by helgehelge123 · Pull Request #1285 · Courseplay/Courseplay_FS25 · GitHub
Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow disabling the seeder unit of cultivators with a seeder configuration (#989) by helgehelge123 · Pull Request #1285 · Courseplay/Courseplay_FS25 · GitHub
Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Allow disabling the seeder unit of cultivators with a seeder configuration (#989) by helgehelge123 · Pull Request #1285 · Courseplay/Courseplay_FS25 · GitHub
Skip to content

Allow disabling the seeder unit of cultivators with a seeder configuration (#989) - #1285

Draft
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator
Draft

Allow disabling the seeder unit of cultivators with a seeder configuration (#989)#1285
helgehelge123 wants to merge 1 commit into
Courseplay:mainfrom
helgehelge123:fix-989-optional-sowing-cultivator

Conversation

@helgehelge123

Copy link
Copy Markdown

Problem

Fixes#989.

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800 gained a seeder unit configuration (vehicle type cultivatingSowingMachine) with game patch 1.8. Their sowing machine spec has needsActivation="true", so getAIRequiresTurnOn() returns true and Courseplay hides the optional sowing setting for them. As a result the seeder unit is always turned on by the base game AI and cannot be disabled, even when the user only wants to cultivate.

Changes

  1. CpVehicleSettings: the optional sowing setting (optionalSowingMachineEnabled) is now also visible for implements that have both the SowingMachine and the Cultivator specialization, not only for passive sowing machines that don't require turning on. isOptionalSowingMachineSettingDisabled() mirrors the visibility check.

  2. SowingMachineController: while a CP job is running and sowing is disabled by the user, an override of TurnOnVehicle.getAIRequiresTurnOn() returns false for these implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork() fails for machines that require turning on but are turned off, so the driver lowers the implement and then stands still forever, waiting in WAITING_FOR_LOWER.

    ⚠️ The override intentionally checks the specializations directly instead of using the setting's getIsDisabled(): that would call isOptionalSowingMachineSettingVisible(), which itself calls getAIRequiresTurnOn(), resulting in an infinite recursion (stack overflow every update loop).

  3. SowingMachineController:needsRefilling(): no seeds are requested when sowing is disabled, or when the seed fill unit has capacity 0. The Finer 6 SL seeder unit has no real seed tank (capacity="0", which per SowingMachine:getSowingMachineCanConsume() means it can always consume) — CP treated it as permanently empty and kept waiting for a refill that can never happen ("tank is empty" stop when sowing was enabled).

Behavior

  • Setting "Sowing option" appears in the vehicle settings (seeder section) for cultivators with a seeder unit configuration.
  • Default is off (consistent with the existing optional sowing semantics), so the driver cultivates only; enabling it makes the driver seed as before.
  • Normal seed drills are unaffected: without the Cultivator specialization the setting stays hidden/disabled and getAIRequiresTurnOn() falls through to the original implementation.

Testing

Tested in SP on game version 1.10 with the Horsch Finer 6 SL (seeder unit configuration):

  • Sowing option off: driver drives the course and only cultivates, seeder stays off, no refill request.
  • Sowing option on: driver seeds, no more bogus "tank is empty" stop (capacity-0 tank).
  • Manual driving and giants helper unaffected (override only active while a CP job is running).

The Horsch Finer 6 SL, Väderstad TopDown 600 and Dalbo Powerchain 800
gained a seeder unit configuration (vehicle type cultivatingSowingMachine)
with game patch 1.8. Their sowing machine spec needs activation, so
getAIRequiresTurnOn() returns true and Courseplay hid the optional
sowing setting for them. The seeder unit was always turned on by the
base game AI and could not be disabled, even when the user only wanted
to cultivate (Courseplay#989).
Three changes:
1. The optional sowing setting is now also visible for implements that
have both the SowingMachine and the Cultivator specialization.
2. While a CP job is running and sowing is disabled by the user,
TurnOnVehicle.getAIRequiresTurnOn() returns false for these
implements. Without this, TurnOnVehicle:getCanAIImplementContinueWork()
fails for machines that require turning on but are turned off, so the
driver would lower the implement and then stand still forever. The
override intentionally checks the specializations directly instead of
the setting's getIsDisabled(), as that would recurse back into
getAIRequiresTurnOn() via isOptionalSowingMachineSettingVisible().
3. needsRefilling() no longer asks for seeds when sowing is disabled or
when the seed fill unit has capacity 0. Machines like the Finer 6 SL
seeder unit have no real seed tank (capacity 0 means they can always
consume, see SowingMachine:getSowingMachineCanConsume) and could
never be refilled, so CP kept waiting for a refill that can't happen.
FixesCourseplay#989

@pvaikopvaiko left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not very familiar with this part of the CP code, but I'm not sure this is the right approach. I'd need some more detailed explanation why the current setting does not work, what makes this new machines different than the existing ones.

--- Sowing was disabled by the user, so no seeds are needed (#989).
return false
end
if self.implement:getFillUnitCapacity(self.sowingMachineSpec.fillUnitIndex) == 0 then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very familiar with this part of the CP code but I have the gut feeling that this here is either not necessary or incorrect, and should be handled by the implement controller.

@pvaiko

Copy link
Copy Markdown
Contributor

Also, not sure that the "Testing" section in the description means, is that what was actually tested or what the AI thinks should be tested. Anyway, what is missing there is regression testing.

@Tensuko
Tensuko marked this pull request as draft July 16, 2026 07:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horsch Finer 6 SL Sämaschieneneinheit nicht in CP deaktivierbar. (Mit config lösbar?)

2 participants

@helgehelge123@pvaiko