mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
SEAD - (re-)added emissions on/off option and ability to link object functions for state changes.
This commit is contained in:
@@ -17,7 +17,7 @@
|
|||||||
--
|
--
|
||||||
-- ### Authors: **FlightControl**, **applevangelist**
|
-- ### Authors: **FlightControl**, **applevangelist**
|
||||||
--
|
--
|
||||||
-- Last Update: Aug 2021
|
-- Last Update: Nov 2021
|
||||||
--
|
--
|
||||||
-- ===
|
-- ===
|
||||||
--
|
--
|
||||||
@@ -51,6 +51,8 @@ SEAD = {
|
|||||||
SuppressedGroups = {},
|
SuppressedGroups = {},
|
||||||
EngagementRange = 75, -- default 75% engagement range Feature Request #1355
|
EngagementRange = 75, -- default 75% engagement range Feature Request #1355
|
||||||
Padding = 10,
|
Padding = 10,
|
||||||
|
CallBack = nil,
|
||||||
|
UseCallBack = false,
|
||||||
}
|
}
|
||||||
|
|
||||||
--- Missile enumerators
|
--- Missile enumerators
|
||||||
@@ -114,10 +116,14 @@ function SEAD:New( SEADGroupPrefixes, Padding )
|
|||||||
local padding = Padding or 10
|
local padding = Padding or 10
|
||||||
if padding < 10 then padding = 10 end
|
if padding < 10 then padding = 10 end
|
||||||
self.Padding = padding
|
self.Padding = padding
|
||||||
|
self.UseEmissionsOnOff = false
|
||||||
|
|
||||||
|
self.CallBack = nil
|
||||||
|
self.UseCallBack = false
|
||||||
|
|
||||||
self:HandleEvent( EVENTS.Shot, self.HandleEventShot )
|
self:HandleEvent( EVENTS.Shot, self.HandleEventShot )
|
||||||
|
|
||||||
self:I("*** SEAD - Started Version 0.3.1")
|
self:I("*** SEAD - Started Version 0.3.2")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -167,51 +173,75 @@ function SEAD:SetPadding(Padding)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Check if a known HARM was fired
|
--- Set SEAD to use emissions on/off in addition to alarm state.
|
||||||
-- @param #SEAD self
|
-- @param #SEAD self
|
||||||
-- @param #string WeaponName
|
-- @param #boolean Switch True for on, false for off.
|
||||||
-- @return #boolean Returns true for a match
|
-- @return #SEAD self
|
||||||
-- @return #string name Name of hit in table
|
function SEAD:SwitchEmissions(Switch)
|
||||||
function SEAD:_CheckHarms(WeaponName)
|
self:T({Switch})
|
||||||
self:T( { WeaponName } )
|
self.UseEmissionsOnOff = Switch
|
||||||
local hit = false
|
return self
|
||||||
local name = ""
|
end
|
||||||
for _,_name in pairs (SEAD.Harms) do
|
|
||||||
if string.find(WeaponName,_name,1) then
|
|
||||||
hit = true
|
|
||||||
name = _name
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return hit, name
|
|
||||||
end
|
|
||||||
|
|
||||||
--- (Internal) Return distance in meters between two coordinates or -1 on error.
|
--- Add an object to call back when going evasive.
|
||||||
-- @param #SEAD self
|
-- @param #SEAD self
|
||||||
-- @param Core.Point#COORDINATE _point1 Coordinate one
|
-- @param #table Object The object to call. Needs to have object functions as follows:
|
||||||
-- @param Core.Point#COORDINATE _point2 Coordinate two
|
-- `:SeadSuppressionPlanned(Group, Name, SuppressionStartTime, SuppressionEndTime)`
|
||||||
-- @return #number Distance in meters
|
-- `:SeadSuppressionStart(Group, Name)`,
|
||||||
function SEAD:_GetDistance(_point1, _point2)
|
-- `:SeadSuppressionEnd(Group, Name)`,
|
||||||
self:T("_GetDistance")
|
-- @return #SEAD self
|
||||||
if _point1 and _point2 then
|
function SEAD:AddCallBack(Object)
|
||||||
local distance1 = _point1:Get2DDistance(_point2)
|
self:T({Class=Object.ClassName})
|
||||||
local distance2 = _point1:DistanceFromPointVec2(_point2)
|
self.CallBack = Object
|
||||||
--self:T({dist1=distance1, dist2=distance2})
|
self.UseCallBack = true
|
||||||
if distance1 and type(distance1) == "number" then
|
return self
|
||||||
return distance1
|
end
|
||||||
elseif distance2 and type(distance2) == "number" then
|
|
||||||
return distance2
|
--- Check if a known HARM was fired
|
||||||
else
|
-- @param #SEAD self
|
||||||
self:E("*****Cannot calculate distance!")
|
-- @param #string WeaponName
|
||||||
self:E({_point1,_point2})
|
-- @return #boolean Returns true for a match
|
||||||
return -1
|
-- @return #string name Name of hit in table
|
||||||
|
function SEAD:_CheckHarms(WeaponName)
|
||||||
|
self:T( { WeaponName } )
|
||||||
|
local hit = false
|
||||||
|
local name = ""
|
||||||
|
for _,_name in pairs (SEAD.Harms) do
|
||||||
|
if string.find(WeaponName,_name,1) then
|
||||||
|
hit = true
|
||||||
|
name = _name
|
||||||
|
break
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
return hit, name
|
||||||
|
end
|
||||||
|
|
||||||
|
--- (Internal) Return distance in meters between two coordinates or -1 on error.
|
||||||
|
-- @param #SEAD self
|
||||||
|
-- @param Core.Point#COORDINATE _point1 Coordinate one
|
||||||
|
-- @param Core.Point#COORDINATE _point2 Coordinate two
|
||||||
|
-- @return #number Distance in meters
|
||||||
|
function SEAD:_GetDistance(_point1, _point2)
|
||||||
|
self:T("_GetDistance")
|
||||||
|
if _point1 and _point2 then
|
||||||
|
local distance1 = _point1:Get2DDistance(_point2)
|
||||||
|
local distance2 = _point1:DistanceFromPointVec2(_point2)
|
||||||
|
--self:T({dist1=distance1, dist2=distance2})
|
||||||
|
if distance1 and type(distance1) == "number" then
|
||||||
|
return distance1
|
||||||
|
elseif distance2 and type(distance2) == "number" then
|
||||||
|
return distance2
|
||||||
else
|
else
|
||||||
self:E("******Cannot calculate distance!")
|
self:E("*****Cannot calculate distance!")
|
||||||
self:E({_point1,_point2})
|
self:E({_point1,_point2})
|
||||||
return -1
|
return -1
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
self:E("******Cannot calculate distance!")
|
||||||
|
self:E({_point1,_point2})
|
||||||
|
return -1
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--- Detects if an SAM site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME.
|
--- Detects if an SAM site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME.
|
||||||
-- @see SEAD
|
-- @see SEAD
|
||||||
@@ -293,16 +323,34 @@ function SEAD:HandleEventShot( EventData )
|
|||||||
local function SuppressionStart(args)
|
local function SuppressionStart(args)
|
||||||
self:T(string.format("*** SEAD - %s Radar Off & Relocating",args[2]))
|
self:T(string.format("*** SEAD - %s Radar Off & Relocating",args[2]))
|
||||||
local grp = args[1] -- Wrapper.Group#GROUP
|
local grp = args[1] -- Wrapper.Group#GROUP
|
||||||
grp:OptionAlarmStateGreen()
|
local name = args[2] -- #string Group Name
|
||||||
|
if self.UseEmissionsOnOff then
|
||||||
|
grp:EnableEmission(false)
|
||||||
|
else
|
||||||
|
grp:OptionAlarmStateGreen()
|
||||||
|
end
|
||||||
grp:RelocateGroundRandomInRadius(20,300,false,false,"Diamond")
|
grp:RelocateGroundRandomInRadius(20,300,false,false,"Diamond")
|
||||||
|
if self.UseCallBack then
|
||||||
|
local object = self.CallBack
|
||||||
|
object:SeadSuppressionStart(grp,name)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function SuppressionStop(args)
|
local function SuppressionStop(args)
|
||||||
self:T(string.format("*** SEAD - %s Radar On",args[2]))
|
self:T(string.format("*** SEAD - %s Radar On",args[2]))
|
||||||
local grp = args[1] -- Wrapper.Group#GROUP
|
local grp = args[1] -- Wrapper.Group#GROUP
|
||||||
grp:OptionAlarmStateRed()
|
local name = args[2] -- #string Group Nam
|
||||||
|
if self.UseEmissionsOnOff then
|
||||||
|
grp:EnableEmission(true)
|
||||||
|
else
|
||||||
|
grp:OptionAlarmStateRed()
|
||||||
|
end
|
||||||
grp:OptionEngageRange(self.EngagementRange)
|
grp:OptionEngageRange(self.EngagementRange)
|
||||||
self.SuppressedGroups[args[2]] = false
|
self.SuppressedGroups[name] = false
|
||||||
|
if self.UseCallBack then
|
||||||
|
local object = self.CallBack
|
||||||
|
object:SeadSuppressionEnd(grp,name)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- randomize switch-on time
|
-- randomize switch-on time
|
||||||
@@ -318,6 +366,10 @@ function SEAD:HandleEventShot( EventData )
|
|||||||
timer.scheduleFunction(SuppressionStart,{_targetgroup,_targetgroupname},SuppressionStartTime)
|
timer.scheduleFunction(SuppressionStart,{_targetgroup,_targetgroupname},SuppressionStartTime)
|
||||||
timer.scheduleFunction(SuppressionStop,{_targetgroup,_targetgroupname},SuppressionEndTime)
|
timer.scheduleFunction(SuppressionStop,{_targetgroup,_targetgroupname},SuppressionEndTime)
|
||||||
self.SuppressedGroups[_targetgroupname] = true
|
self.SuppressedGroups[_targetgroupname] = true
|
||||||
|
if self.UseCallBack then
|
||||||
|
local object = self.CallBack
|
||||||
|
object:SeadSuppressionPlanned(_targetgroup,_targetgroupname,SuppressionStartTime,SuppressionEndTime)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user