diff --git a/changelog/snippets/fix.7284.md b/changelog/snippets/fix.7284.md new file mode 100644 index 0000000000..3061e5a115 --- /dev/null +++ b/changelog/snippets/fix.7284.md @@ -0,0 +1 @@ +- Fix error when issuing an assist order to a mobile shield/deceiver with a destroyed unit in the selection (#7284). This should fix mobile shields sometimes stopping in range of enemies while assisting another unit, instead of continuing to move. diff --git a/lua/SimCallbacks.lua b/lua/SimCallbacks.lua index 38559ce2bc..34db1e3943 100644 --- a/lua/SimCallbacks.lua +++ b/lua/SimCallbacks.lua @@ -338,7 +338,8 @@ Callbacks.FlagShield = function(data, units) local target = GetEntityById(data.target) if units and target then for k, u in units do - if IsEntity(u) and u.PointerEnabled == true then + if not IsDestroyed(u) and u.PointerEnabled == true then + ---@cast u UAL0307 | UEL0307 | URL0306 | XSL0307 u.PointerEnabled = false --turn the pointer flag off u:DisablePointer() --turn the pointer off end diff --git a/units/UAL0307/UAL0307_script.lua b/units/UAL0307/UAL0307_script.lua index 5bce9b89b3..a9c3fed772 100644 --- a/units/UAL0307/UAL0307_script.lua +++ b/units/UAL0307/UAL0307_script.lua @@ -49,12 +49,13 @@ UAL0307 = ClassUnit(AShieldHoverLandUnit, ShieldEffectsComponent) { end, DisablePointer = function(self) - self.TargetPointer:SetFireTargetLayerCaps('None') --this disables the stop feature - note that its reset on layer change! - self.PointerRestartThread = self.Trash:Add(ForkThread(self.PointerRestart,self)) + if not IsDestroyed(self.TargetPointer) then + self.TargetPointer:SetFireTargetLayerCaps('None') --this disables the stop feature - note that its reset on layer change! + self.PointerRestartThread = self.Trash:Add(ForkThread(self.PointerRestart, self)) + end end, PointerRestart = function(self) - --sadly i couldnt find some way of doing this without a thread. dont know where to check if its still assisting other than this. while self.PointerEnabled == false do WaitTicks(11) if IsDestroyed(self) or IsDestroyed(self.TargetPointer) then diff --git a/units/UEL0307/UEL0307_script.lua b/units/UEL0307/UEL0307_script.lua index c0d181eed8..2da39bacac 100644 --- a/units/UEL0307/UEL0307_script.lua +++ b/units/UEL0307/UEL0307_script.lua @@ -85,22 +85,19 @@ UEL0307 = ClassUnit(TShieldLandUnit, ShieldEffectsComponent) { end, DisablePointer = function(self) - self.TargetPointer:SetFireTargetLayerCaps('None') --this disables the stop feature - note that its reset on layer change! - self.PointerRestartThread = self:ForkThread(self.PointerRestart) + if not IsDestroyed(self.TargetPointer) then + self.TargetPointer:SetFireTargetLayerCaps('None') --this disables the stop feature - note that its reset on layer change! + self.PointerRestartThread = self:ForkThread(self.PointerRestart) + end end, PointerRestart = function(self) - --sadly i couldnt find some way of doing this without a thread. dont know where to check if its still assisting other than this. while not self.PointerEnabled do - - WaitSeconds(1) - - -- break if we're a gooner + WaitTicks(11) if IsDestroyed(self) or IsDestroyed(self.TargetPointer) then break end - -- if not gooner, check whether we need to enable our weapon to keep reasonable distance if not self:GetGuardedUnit() then self.PointerEnabled = true self.TargetPointer:SetFireTargetLayerCaps(self.TargetLayerCaps[self.Layer]) --this resets the stop feature - note that its reset on layer change! diff --git a/units/URL0306/URL0306_Script.lua b/units/URL0306/URL0306_Script.lua index a8a3f1f3b7..0570801788 100644 --- a/units/URL0306/URL0306_Script.lua +++ b/units/URL0306/URL0306_Script.lua @@ -54,16 +54,21 @@ URL0306 = ClassUnit(CLandUnit) { end, DisablePointer = function(self) - self.TargetPointer:SetFireTargetLayerCaps('None') --this disables the stop feature - note that its reset on layer change! - local thread = ForkThread(self.PointerRestart,self) - self.Trash:Add(thread) - self.PointerRestartThread = thread + if not IsDestroyed(self.TargetPointer) then + self.TargetPointer:SetFireTargetLayerCaps('None') --this disables the stop feature - note that its reset on layer change! + local thread = ForkThread(self.PointerRestart, self) + self.Trash:Add(thread) + self.PointerRestartThread = thread + end end, PointerRestart = function(self) - --sadly i couldnt find some way of doing this without a thread. dont know where to check if its still assisting other than this. while self.PointerEnabled == false do WaitTicks(11) + if IsDestroyed(self) or IsDestroyed(self.TargetPointer) then + break + end + if not self:GetGuardedUnit() then self.PointerEnabled = true self.TargetPointer:SetFireTargetLayerCaps(self.TargetLayerCaps[self.Layer]) --this resets the stop feature - note that its reset on layer change! diff --git a/units/XSL0307/XSL0307_script.lua b/units/XSL0307/XSL0307_script.lua index 664228ddbb..888e27520a 100644 --- a/units/XSL0307/XSL0307_script.lua +++ b/units/XSL0307/XSL0307_script.lua @@ -47,11 +47,13 @@ XSL0307 = ClassUnit(SShieldHoverLandUnit, ShieldEffectsComponent) { ---@param self XSL0307 DisablePointer = function(self) - self.TargetPointer:SetFireTargetLayerCaps('None') + if not IsDestroyed(self.TargetPointer) then + self.TargetPointer:SetFireTargetLayerCaps('None') - local thread = ForkThread(self.PointerRestart, self) - self.Trash:Add(thread) - self.PointerRestartThread = thread + local thread = ForkThread(self.PointerRestart, self) + self.Trash:Add(thread) + self.PointerRestartThread = thread + end end, ---@param self XSL0307