From 897ddecda5f00f301d0990f326cff43be81ea906 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:34:45 -0800 Subject: [PATCH 1/4] Enable counterintel by default for AIs URL0101: Cybran land scout cloaking URAxxx: Cybran aircraft personal stealth UEA0304: UEF Strat jamming --- units/UEA0304/UEA0304_Script.lua | 9 +++++++-- units/URA0303/URA0303_Script.lua | 7 ++++++- units/URA0304/URA0304_Script.lua | 8 ++++++-- units/URA0401/URA0401_script.lua | 7 ++++++- units/URL0101/URL0101_Script.lua | 12 +++++++++--- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/units/UEA0304/UEA0304_Script.lua b/units/UEA0304/UEA0304_Script.lua index d585c48374..9b98c30700 100644 --- a/units/UEA0304/UEA0304_Script.lua +++ b/units/UEA0304/UEA0304_Script.lua @@ -19,8 +19,13 @@ UEA0304 = ClassUnit(TAirUnit) { OnStopBeingBuilt = function(self,builder,layer) TAirUnit.OnStopBeingBuilt(self,builder,layer) - --Turns Jamming off when unit is built - self:SetScriptBit('RULEUTC_JammingToggle', true) + -- Don't turn off jamming for AI so that it uses it by default + if self.Brain.BrainType == 'Human' then + self:SetScriptBit('RULEUTC_JammingToggle', true) + else + self:SetMaintenanceConsumptionActive() + end + end, OnDamage = function(self, instigator, amount, vector, damageType) diff --git a/units/URA0303/URA0303_Script.lua b/units/URA0303/URA0303_Script.lua index dbf2accb14..cbe9c0a27e 100644 --- a/units/URA0303/URA0303_Script.lua +++ b/units/URA0303/URA0303_Script.lua @@ -22,7 +22,12 @@ URA0303 = ClassUnit(CAirUnit) { OnStopBeingBuilt = function(self,builder,layer) CAirUnit.OnStopBeingBuilt(self,builder,layer) self:SetMaintenanceConsumptionInactive() - self:SetScriptBit('RULEUTC_StealthToggle', true) + -- Don't turn off stealth for AI so that it uses it by default + if self.Brain.BrainType == 'Human' then + self:SetScriptBit('RULEUTC_StealthToggle', true) + else + self:SetMaintenanceConsumptionActive() + end self:RequestRefreshUI() end, diff --git a/units/URA0304/URA0304_Script.lua b/units/URA0304/URA0304_Script.lua index d66eba9c4a..d04f684743 100644 --- a/units/URA0304/URA0304_Script.lua +++ b/units/URA0304/URA0304_Script.lua @@ -21,8 +21,12 @@ URA0304 = ClassUnit(CAirUnit) { OnStopBeingBuilt = function(self,builder,layer) CAirUnit.OnStopBeingBuilt(self,builder,layer) - --Turns Stealth off when unit is built - self:SetScriptBit('RULEUTC_StealthToggle', true) + -- Don't turn off stealth for AI so that it uses it by default + if self.Brain.BrainType == 'Human' then + self:SetScriptBit('RULEUTC_StealthToggle', true) + else + self:SetMaintenanceConsumptionActive() + end end, OnDamage = function(self, instigator, amount, vector, damageType) diff --git a/units/URA0401/URA0401_script.lua b/units/URA0401/URA0401_script.lua index ab019e9199..7705618cc8 100644 --- a/units/URA0401/URA0401_script.lua +++ b/units/URA0401/URA0401_script.lua @@ -36,7 +36,12 @@ URA0401 = ClassUnit(CAirUnit) { OnStopBeingBuilt = function(self,builder,layer) CAirUnit.OnStopBeingBuilt(self,builder,layer) - self:SetScriptBit('RULEUTC_StealthToggle', true) + -- Don't turn off stealth for AI so that it uses it by default + if self.Brain.BrainType == 'Human' then + self:SetScriptBit('RULEUTC_StealthToggle', true) + else + self:SetMaintenanceConsumptionActive() + end self.AnimManip = CreateAnimator(self) self.Trash:Add(self.AnimManip) end, diff --git a/units/URL0101/URL0101_Script.lua b/units/URL0101/URL0101_Script.lua index d75e08e1e5..068a2743ff 100644 --- a/units/URL0101/URL0101_Script.lua +++ b/units/URL0101/URL0101_Script.lua @@ -11,9 +11,15 @@ URL0101 = ClassUnit(CWalkingLandUnit) { CWalkingLandUnit.OnStopBeingBuilt(self, builder, layer) self.Trash:Add(CreateRotator(self, 'Spinner', 'y', nil, 90, 5, 90)) - self:SetMaintenanceConsumptionInactive() - self:SetScriptBit('RULEUTC_CloakToggle', true) - self:RequestRefreshUI() + + -- Don't turn off cloak for AI so that it uses it by default + if self.Brain.BrainType == 'Human' then + self:SetMaintenanceConsumptionInactive() + self:SetScriptBit('RULEUTC_CloakToggle', true) + self:RequestRefreshUI() + else + self:SetMaintenanceConsumptionActive() + end end, } From d4193764e32bff9702b197f36aadaabfbde10b42 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:35:03 -0800 Subject: [PATCH 2/4] Remove unused stealth toggle for corsair --- units/DRA0202/DRA0202_Script.lua | 7 ------- 1 file changed, 7 deletions(-) diff --git a/units/DRA0202/DRA0202_Script.lua b/units/DRA0202/DRA0202_Script.lua index 5a24958192..6ffa339274 100644 --- a/units/DRA0202/DRA0202_Script.lua +++ b/units/DRA0202/DRA0202_Script.lua @@ -66,13 +66,6 @@ DRA0202 = ClassUnit(CAirUnit) { }, }, - OnStopBeingBuilt = function(self,builder,layer) - CAirUnit.OnStopBeingBuilt(self,builder,layer) - self:SetMaintenanceConsumptionInactive() - self:SetScriptBit('RULEUTC_StealthToggle', true) - self:RequestRefreshUI() - end, - RotateWings = function(self, target) local trash = self.Trash From 225ecb85c11d8d674dc46b91e4f864b76a403d12 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:44:49 -0800 Subject: [PATCH 3/4] Formatting and annotations --- units/DRA0202/DRA0202_Script.lua | 91 +++++++++++++++++--------------- units/UEA0304/UEA0304_Script.lua | 18 +++++-- units/URA0303/URA0303_Script.lua | 9 ++-- units/URA0304/URA0304_Script.lua | 25 ++++++--- units/URA0401/URA0401_script.lua | 34 +++++++----- units/URL0101/URL0101_Script.lua | 4 ++ units/XRA0305/XRA0305_script.lua | 13 +++-- 7 files changed, 117 insertions(+), 77 deletions(-) diff --git a/units/DRA0202/DRA0202_Script.lua b/units/DRA0202/DRA0202_Script.lua index 6ffa339274..894b29e228 100644 --- a/units/DRA0202/DRA0202_Script.lua +++ b/units/DRA0202/DRA0202_Script.lua @@ -22,50 +22,55 @@ local CreateRotator = CreateRotator DRA0202 = ClassUnit(CAirUnit) { Weapons = { AntiAirMissiles = ClassWeapon(CAAMissileNaniteWeapon) {}, + ---@class DRA0202_GroundMissile : CIFMissileCorsairWeapon GroundMissile = ClassWeapon(CIFMissileCorsairWeapon) { - IdleState = State (CIFMissileCorsairWeapon.IdleState) { - - Main = function(self) - CIFMissileCorsairWeapon.IdleState.Main(self) - end, - - OnGotTarget = function(self) - if self.unit:IsUnitState('Moving') then - self.unit:SetSpeedMult(1.0) - else - self.unit:SetBreakOffTriggerMult(2.0) - self.unit:SetBreakOffDistanceMult(8.0) - self.unit:SetSpeedMult(0.67) - CIFMissileCorsairWeapon.IdleState.OnGotTarget(self) - end - end, - }, - - OnGotTarget = function(self) - local unit = self.unit - - if unit:IsUnitState('Moving') then - unit:SetSpeedMult(1.0) - else - unit:SetBreakOffTriggerMult(2.0) - unit:SetBreakOffDistanceMult(8.0) - unit:SetSpeedMult(0.67) - CIFMissileCorsairWeapon.OnGotTarget(self) - end - end, - - OnLostTarget = function(self) - local unit = self.unit - - unit:SetBreakOffTriggerMult(1.0) - unit:SetBreakOffDistanceMult(1.0) - unit:SetSpeedMult(1.0) - CIFMissileCorsairWeapon.OnLostTarget(self) - end, + IdleState = State(CIFMissileCorsairWeapon.IdleState) { + ---@param self DRA0202_GroundMissile + Main = function(self) + CIFMissileCorsairWeapon.IdleState.Main(self) + end, + ---@param self DRA0202_GroundMissile + OnGotTarget = function(self) + if self.unit:IsUnitState('Moving') then + self.unit:SetSpeedMult(1.0) + else + self.unit:SetBreakOffTriggerMult(2.0) + self.unit:SetBreakOffDistanceMult(8.0) + self.unit:SetSpeedMult(0.67) + CIFMissileCorsairWeapon.IdleState.OnGotTarget(self) + end + end, + }, + + ---@param self DRA0202_GroundMissile + OnGotTarget = function(self) + local unit = self.unit + + if unit:IsUnitState('Moving') then + unit:SetSpeedMult(1.0) + else + unit:SetBreakOffTriggerMult(2.0) + unit:SetBreakOffDistanceMult(8.0) + unit:SetSpeedMult(0.67) + CIFMissileCorsairWeapon.OnGotTarget(self) + end + end, + + ---@param self DRA0202_GroundMissile + OnLostTarget = function(self) + local unit = self.unit + + unit:SetBreakOffTriggerMult(1.0) + unit:SetBreakOffDistanceMult(1.0) + unit:SetSpeedMult(1.0) + CIFMissileCorsairWeapon.OnLostTarget(self) + end, }, }, + ---@param self DRA0202 + ---@param target? Unit | Blip RotateWings = function(self, target) local trash = self.Trash @@ -75,7 +80,7 @@ DRA0202 = ClassUnit(CAirUnit) { end if not self.RWingRotator then self.RWingRotator = CreateRotator(self, 'B03', 'x') - TrashBagAdd(trash,self.RWingRotator) + TrashBagAdd(trash, self.RWingRotator) end local fighterAngle = 0 local bomberAngle = -90 @@ -102,17 +107,19 @@ DRA0202 = ClassUnit(CAirUnit) { end end, + ---@param self DRA0202 OnCreate = function(self) CAirUnit.OnCreate(self) local trash = self.Trash - TrashBagAdd(trash,ForkThread(self.MonitorWings,self)) + TrashBagAdd(trash, ForkThread(self.MonitorWings, self)) end, + ---@param self DRA0202 MonitorWings = function(self) local airTarget while self and not self.Dead do local airTargetWeapon = self:GetWeaponByLabel('AntiAirMissiles') - if airTargetWeapon then + if airTargetWeapon then airTarget = airTargetWeapon:GetCurrentTarget() end diff --git a/units/UEA0304/UEA0304_Script.lua b/units/UEA0304/UEA0304_Script.lua index 9b98c30700..0cf1a301c7 100644 --- a/units/UEA0304/UEA0304_Script.lua +++ b/units/UEA0304/UEA0304_Script.lua @@ -17,19 +17,27 @@ UEA0304 = ClassUnit(TAirUnit) { LinkedRailGun2 = ClassWeapon(TAirToAirLinkedRailgun) {}, }, - OnStopBeingBuilt = function(self,builder,layer) - TAirUnit.OnStopBeingBuilt(self,builder,layer) + ---@param self UEA0304 + ---@param builder Unit + ---@param layer Layer + OnStopBeingBuilt = function(self, builder, layer) + TAirUnit.OnStopBeingBuilt(self, builder, layer) -- Don't turn off jamming for AI so that it uses it by default if self.Brain.BrainType == 'Human' then self:SetScriptBit('RULEUTC_JammingToggle', true) else self:SetMaintenanceConsumptionActive() end - end, - + + --- Do not allow friendly fire from our own army's strategic bombers + ---@param self UEA0304 + ---@param instigator Unit + ---@param amount number + ---@param vector Vector + ---@param damageType DamageType OnDamage = function(self, instigator, amount, vector, damageType) - if instigator and instigator.Army == self.Army and instigator.Blueprint.CategoriesHash.STRATEGICBOMBER then + if instigator and instigator.Army == self.Army and instigator.Blueprint.CategoriesHash["STRATEGICBOMBER"] then return end diff --git a/units/URA0303/URA0303_Script.lua b/units/URA0303/URA0303_Script.lua index cbe9c0a27e..3e1e5799f3 100644 --- a/units/URA0303/URA0303_Script.lua +++ b/units/URA0303/URA0303_Script.lua @@ -19,8 +19,12 @@ URA0303 = ClassUnit(CAirUnit) { Missiles1 = ClassWeapon(CAAMissileNaniteWeapon) {}, Missiles2 = ClassWeapon(CAAMissileNaniteWeapon) {}, }, - OnStopBeingBuilt = function(self,builder,layer) - CAirUnit.OnStopBeingBuilt(self,builder,layer) + + ---@param self URA0303 + ---@param builder Unit + ---@param layer Layer + OnStopBeingBuilt = function(self, builder, layer) + CAirUnit.OnStopBeingBuilt(self, builder, layer) self:SetMaintenanceConsumptionInactive() -- Don't turn off stealth for AI so that it uses it by default if self.Brain.BrainType == 'Human' then @@ -30,7 +34,6 @@ URA0303 = ClassUnit(CAirUnit) { end self:RequestRefreshUI() end, - } TypeClass = URA0303 diff --git a/units/URA0304/URA0304_Script.lua b/units/URA0304/URA0304_Script.lua index d04f684743..6be8c7b7c0 100644 --- a/units/URA0304/URA0304_Script.lua +++ b/units/URA0304/URA0304_Script.lua @@ -16,11 +16,14 @@ URA0304 = ClassUnit(CAirUnit) { AAGun1 = ClassWeapon(CAAAutocannon) {}, AAGun2 = ClassWeapon(CAAAutocannon) {}, }, - ContrailBones = {'Left_Exhaust','Center_Exhaust','Right_Exhaust'}, - ExhaustBones = {'Left_Exhaust','Center_Exhaust','Right_Exhaust'}, - - OnStopBeingBuilt = function(self,builder,layer) - CAirUnit.OnStopBeingBuilt(self,builder,layer) + ContrailBones = { 'Left_Exhaust', 'Center_Exhaust', 'Right_Exhaust' }, + ExhaustBones = { 'Left_Exhaust', 'Center_Exhaust', 'Right_Exhaust' }, + + ---@param self URA0304 + ---@param builder Unit + ---@param layer Layer + OnStopBeingBuilt = function(self, builder, layer) + CAirUnit.OnStopBeingBuilt(self, builder, layer) -- Don't turn off stealth for AI so that it uses it by default if self.Brain.BrainType == 'Human' then self:SetScriptBit('RULEUTC_StealthToggle', true) @@ -28,13 +31,19 @@ URA0304 = ClassUnit(CAirUnit) { self:SetMaintenanceConsumptionActive() end end, - + + ---@param self URA0304 + ---@param instigator Unit + ---@param amount number + ---@param vector Vector + ---@param damageType DamageType OnDamage = function(self, instigator, amount, vector, damageType) - if instigator and instigator:GetBlueprint().CategoriesHash.STRATEGICBOMBER and instigator.Army == self.Army then + if instigator and instigator.Army == self.Army and instigator.Blueprint.CategoriesHash["STRATEGICBOMBER"] then return end - + CAirUnit.OnDamage(self, instigator, amount, vector, damageType) end, } + TypeClass = URA0304 diff --git a/units/URA0401/URA0401_script.lua b/units/URA0401/URA0401_script.lua index 7705618cc8..e2c2160b9b 100644 --- a/units/URA0401/URA0401_script.lua +++ b/units/URA0401/URA0401_script.lua @@ -12,12 +12,14 @@ local util = import("/lua/utilities.lua") local fxutil = import("/lua/effectutilities.lua") ---@class URA0401 : CAirUnit +---@field MovementAmbientExhaustEffectsBag table # Old style trashbag that is a table +---@field AnimManip moho.AnimationManipulator # Takeoff/landing animations URA0401 = ClassUnit(CAirUnit) { Weapons = { Missile01 = ClassWeapon(CDFRocketIridiumWeapon) {}, Missile02 = ClassWeapon(CDFRocketIridiumWeapon) {}, - HeavyBolter = ClassWeapon(CDFHeavyElectronBolterWeapon){}, - HeavyBolterBack = ClassWeapon(CDFHeavyElectronBolterWeapon){}, + HeavyBolter = ClassWeapon(CDFHeavyElectronBolterWeapon) {}, + HeavyBolterBack = ClassWeapon(CDFHeavyElectronBolterWeapon) {}, AAMissile01 = ClassWeapon(CAAMissileNaniteWeapon) {}, AAMissile02 = ClassWeapon(CAAMissileNaniteWeapon) {}, }, @@ -31,11 +33,14 @@ URA0401 = ClassUnit(CAirUnit) { 'Exhaust_Right03', }, - DestructionPartsChassisToss = {'URA0401',}, + DestructionPartsChassisToss = { 'URA0401', }, DestroyNoFallRandomChance = 1.1, - OnStopBeingBuilt = function(self,builder,layer) - CAirUnit.OnStopBeingBuilt(self,builder,layer) + ---@param self URA0401 + ---@param builder Unit + ---@param layer Layer + OnStopBeingBuilt = function(self, builder, layer) + CAirUnit.OnStopBeingBuilt(self, builder, layer) -- Don't turn off stealth for AI so that it uses it by default if self.Brain.BrainType == 'Human' then self:SetScriptBit('RULEUTC_StealthToggle', true) @@ -49,12 +54,12 @@ URA0401 = ClassUnit(CAirUnit) { ---@param self URA0401 ---@param new HorizontalMovementState ---@param old HorizontalMovementState - OnMotionHorzEventChange = function(self, new, old ) + OnMotionHorzEventChange = function(self, new, old) CAirUnit.OnMotionHorzEventChange(self, new, old) - if self.ThrustExhaustTT1 == nil then + if self.ThrustExhaustTT1 == nil then if self.MovementAmbientExhaustEffectsBag then - fxutil.CleanupEffectBag(self,'MovementAmbientExhaustEffectsBag') + fxutil.CleanupEffectBag(self, 'MovementAmbientExhaustEffectsBag') else self.MovementAmbientExhaustEffectsBag = {} end @@ -65,16 +70,17 @@ URA0401 = ClassUnit(CAirUnit) { KillThread(self.ThrustExhaustTT1) fxutil.CleanupEffectBag(self, 'MovementAmbientExhaustEffectsBag') self.ThrustExhaustTT1 = nil - end + end end, + ---@param self URA0401 MovementAmbientExhaustThread = function(self) while not self.Dead do local ExhaustEffects = { '/effects/emitters/dirty_exhaust_smoke_01_emit.bp', - '/effects/emitters/dirty_exhaust_sparks_01_emit.bp', + '/effects/emitters/dirty_exhaust_sparks_01_emit.bp', } - local ExhaustBeam = '/effects/emitters/missile_exhaust_fire_beam_03_emit.bp' + local ExhaustBeam = '/effects/emitters/missile_exhaust_fire_beam_03_emit.bp' for kE, vE in ExhaustEffects do for kB, vB in self.MovementAmbientExhaustBones do @@ -85,9 +91,9 @@ URA0401 = ClassUnit(CAirUnit) { WaitSeconds(2) fxutil.CleanupEffectBag(self, 'MovementAmbientExhaustEffectsBag') - - WaitSeconds(util.GetRandomFloat(1,7)) - end + + WaitSeconds(util.GetRandomFloat(1, 7)) + end end, ---@param self URA0401 diff --git a/units/URL0101/URL0101_Script.lua b/units/URL0101/URL0101_Script.lua index 068a2743ff..17afbb8a0e 100644 --- a/units/URL0101/URL0101_Script.lua +++ b/units/URL0101/URL0101_Script.lua @@ -7,6 +7,10 @@ local CWalkingLandUnit = import("/lua/cybranunits.lua").CWalkingLandUnit ---@class URL0101 : CWalkingLandUnit URL0101 = ClassUnit(CWalkingLandUnit) { + + ---@param self URL0101 + ---@param builder Unit + ---@param layer Layer OnStopBeingBuilt = function(self, builder, layer) CWalkingLandUnit.OnStopBeingBuilt(self, builder, layer) diff --git a/units/XRA0305/XRA0305_script.lua b/units/XRA0305/XRA0305_script.lua index 886d983774..f1cb012430 100644 --- a/units/XRA0305/XRA0305_script.lua +++ b/units/XRA0305/XRA0305_script.lua @@ -13,15 +13,18 @@ local CDFLaserDisintegratorWeapon = import("/lua/cybranweapons.lua").CDFLaserDis ---@class XRA0305 : CAirUnit XRA0305 = ClassUnit(CAirUnit) { - Weapons = { Missiles1 = ClassWeapon(CAAMissileNaniteWeapon) {}, Disintegrator01 = ClassWeapon(CDFLaserDisintegratorWeapon) {}, }, - - OnStopBeingBuilt = function(self,builder,layer) - CAirUnit.OnStopBeingBuilt(self,builder,layer) + + ---@param self XRA0305 + ---@param builder Unit + ---@param layer Layer + OnStopBeingBuilt = function(self, builder, layer) + CAirUnit.OnStopBeingBuilt(self, builder, layer) self:SetMaintenanceConsumptionActive() end, } -TypeClass = XRA0305 \ No newline at end of file + +TypeClass = XRA0305 From d3aa8ad5829258e1569fbff2e5e17102650a4214 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:59:49 -0800 Subject: [PATCH 4/4] Create ai.6635.md --- changelog/snippets/ai.6635.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/snippets/ai.6635.md diff --git a/changelog/snippets/ai.6635.md b/changelog/snippets/ai.6635.md new file mode 100644 index 0000000000..be0b562833 --- /dev/null +++ b/changelog/snippets/ai.6635.md @@ -0,0 +1 @@ +- (#6635) Enable counterintel by default for units created by AIs. This includes Cybran aircraft stealth, Cybran land scout's cloak, and UEF strategic bomber's jamming.