-
Notifications
You must be signed in to change notification settings - Fork 212
bugfix: Fix issue where builders could resume completed tasks after being disabled #2793
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
a334e41
e95478d
bdf1ab1
f72e687
a1acd44
a4ffdb5
6e1a8be
ede3cb1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2186,6 +2186,10 @@ void Object::setDisabledUntil( DisabledType type, UnsignedInt frame ) | |
| sound.setPosition( getPosition() ); | ||
| TheAudio->addAudioEvent( &sound ); | ||
| } | ||
|
|
||
| DozerAIInterface* dozerAI = getAI() ? getAI()->getDozerAIInterface() : nullptr; | ||
| if (dozerAI) | ||
| dozerAI->setPreviousTask(dozerAI->getCurrentTask()); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This looks a bit strange. Wasn't
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, but there was no distinction on how the disabling happened here. A unit entering a transport causes it to become disabled, and thus it would attempt to resume the task after exiting the transport. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
readded to I tested that with the EMP test case shown in the video and it worked. |
||
| } | ||
| } | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -704,17 +704,35 @@ void WorkerAIUpdate::cancelAllTasks() | |
| m_dozerMachine->resetToDefaultState(); | ||
| } | ||
|
|
||
| //------------------------------------------------------------------------------------------------- | ||
| /** Set the previous task so that we may return to it if we become temporarily incapacitated */ | ||
| //------------------------------------------------------------------------------------------------- | ||
| void WorkerAIUpdate::setPreviousTask(DozerTask task) | ||
| { | ||
| if (task == DOZER_TASK_INVALID) | ||
| return; | ||
|
|
||
| m_previousTask = task; | ||
| m_previousTaskInfo = m_task[task]; | ||
| } | ||
|
|
||
| //------------------------------------------------------------------------------------------------- | ||
| /** Attempt to resume the previous task */ | ||
| //------------------------------------------------------------------------------------------------- | ||
| void WorkerAIUpdate::resumePreviousTask() | ||
| { | ||
| if (m_previousTask != DOZER_TASK_INVALID) | ||
| if (m_previousTask == DOZER_TASK_INVALID) | ||
| return; | ||
|
|
||
| if (m_previousTask == DOZER_TASK_BUILD) | ||
| { | ||
| newTask(m_previousTask, TheGameLogic->findObjectByID(m_previousTaskInfo.m_targetObjectID)); | ||
| m_previousTask = DOZER_TASK_INVALID; | ||
| m_previousTaskInfo = DozerTaskInfo(); | ||
| Object* target = TheGameLogic->findObjectByID(m_previousTaskInfo.m_targetObjectID); | ||
| if (target && !target->testStatus(OBJECT_STATUS_UNDER_CONSTRUCTION)) | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| newTask(m_previousTask, target); | ||
| } | ||
|
|
||
| m_previousTask = DOZER_TASK_INVALID; | ||
| m_previousTaskInfo = DozerTaskInfo(); | ||
| } | ||
|
|
||
| //------------------------------------------------------------------------------------------------- | ||
|
|
@@ -798,9 +816,6 @@ void WorkerAIUpdate::internalCancelTask( DozerTask task ) | |
| // call the single method that gets called for completing and canceling tasks | ||
| internalTaskCompleteOrCancelled( task ); | ||
|
|
||
| m_previousTask = task; | ||
| m_previousTaskInfo = m_task[task]; | ||
|
|
||
| // remove the info for this task | ||
| m_task[ task ].m_targetObjectID = INVALID_ID; | ||
| m_task[ task ].m_taskOrderFrame = 0; | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.