mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
Merge branch 'master' into FF/MasterDevel
This commit is contained in:
commit
1ba1738aa0
@ -1271,24 +1271,36 @@ end
|
|||||||
-- @param #string ClientName Name of the Client.
|
-- @param #string ClientName Name of the Client.
|
||||||
-- @return #number Coalition ID.
|
-- @return #number Coalition ID.
|
||||||
function DATABASE:GetCoalitionFromClientTemplate( ClientName )
|
function DATABASE:GetCoalitionFromClientTemplate( ClientName )
|
||||||
|
if self.Templates.ClientsByName[ClientName] then
|
||||||
return self.Templates.ClientsByName[ClientName].CoalitionID
|
return self.Templates.ClientsByName[ClientName].CoalitionID
|
||||||
end
|
end
|
||||||
|
self:E("ERROR: Template does not exist for client "..tostring(ClientName))
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
--- Get category ID from client name.
|
--- Get category ID from client name.
|
||||||
-- @param #DATABASE self
|
-- @param #DATABASE self
|
||||||
-- @param #string ClientName Name of the Client.
|
-- @param #string ClientName Name of the Client.
|
||||||
-- @return #number Category ID.
|
-- @return #number Category ID.
|
||||||
function DATABASE:GetCategoryFromClientTemplate( ClientName )
|
function DATABASE:GetCategoryFromClientTemplate( ClientName )
|
||||||
|
if self.Templates.ClientsByName[ClientName] then
|
||||||
return self.Templates.ClientsByName[ClientName].CategoryID
|
return self.Templates.ClientsByName[ClientName].CategoryID
|
||||||
end
|
end
|
||||||
|
self:E("ERROR: Template does not exist for client "..tostring(ClientName))
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
--- Get country ID from client name.
|
--- Get country ID from client name.
|
||||||
-- @param #DATABASE self
|
-- @param #DATABASE self
|
||||||
-- @param #string ClientName Name of the Client.
|
-- @param #string ClientName Name of the Client.
|
||||||
-- @return #number Country ID.
|
-- @return #number Country ID.
|
||||||
function DATABASE:GetCountryFromClientTemplate( ClientName )
|
function DATABASE:GetCountryFromClientTemplate( ClientName )
|
||||||
|
if self.Templates.ClientsByName[ClientName] then
|
||||||
return self.Templates.ClientsByName[ClientName].CountryID
|
return self.Templates.ClientsByName[ClientName].CountryID
|
||||||
end
|
end
|
||||||
|
self:E("ERROR: Template does not exist for client "..tostring(ClientName))
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
--- Airbase
|
--- Airbase
|
||||||
|
|
||||||
|
|||||||
@ -2233,7 +2233,7 @@ do -- COORDINATE
|
|||||||
-- local MarkGroup = GROUP:FindByName( "AttackGroup" )
|
-- local MarkGroup = GROUP:FindByName( "AttackGroup" )
|
||||||
-- local MarkID = TargetCoord:MarkToGroup( "This is a target for the attack group", AttackGroup )
|
-- local MarkID = TargetCoord:MarkToGroup( "This is a target for the attack group", AttackGroup )
|
||||||
-- <<< logic >>>
|
-- <<< logic >>>
|
||||||
-- RemoveMark( MarkID ) -- The mark is now removed
|
-- TargetCoord:RemoveMark( MarkID ) -- The mark is now removed
|
||||||
function COORDINATE:RemoveMark( MarkID )
|
function COORDINATE:RemoveMark( MarkID )
|
||||||
trigger.action.removeMark( MarkID )
|
trigger.action.removeMark( MarkID )
|
||||||
end
|
end
|
||||||
|
|||||||
@ -4729,8 +4729,11 @@ do -- SET_CLIENT
|
|||||||
local MClientCoalition = false
|
local MClientCoalition = false
|
||||||
for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do
|
for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do
|
||||||
local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName )
|
local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName )
|
||||||
|
if ClientCoalitionID==nil and MClient:IsAlive()~=nil then
|
||||||
|
ClientCoalitionID=MClient:GetCoalition()
|
||||||
|
end
|
||||||
self:T3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } )
|
self:T3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } )
|
||||||
if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then
|
if self.FilterMeta.Coalitions[CoalitionName] and ClientCoalitionID and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then
|
||||||
MClientCoalition = true
|
MClientCoalition = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -4742,8 +4745,11 @@ do -- SET_CLIENT
|
|||||||
local MClientCategory = false
|
local MClientCategory = false
|
||||||
for CategoryID, CategoryName in pairs( self.Filter.Categories ) do
|
for CategoryID, CategoryName in pairs( self.Filter.Categories ) do
|
||||||
local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName )
|
local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName )
|
||||||
|
if ClientCategoryID==nil and MClient:IsAlive()~=nil then
|
||||||
|
ClientCategoryID=MClient:GetCategory()
|
||||||
|
end
|
||||||
self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } )
|
self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } )
|
||||||
if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then
|
if self.FilterMeta.Categories[CategoryName] and ClientCategoryID and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then
|
||||||
MClientCategory = true
|
MClientCategory = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -4767,8 +4773,11 @@ do -- SET_CLIENT
|
|||||||
local MClientCountry = false
|
local MClientCountry = false
|
||||||
for CountryID, CountryName in pairs( self.Filter.Countries ) do
|
for CountryID, CountryName in pairs( self.Filter.Countries ) do
|
||||||
local ClientCountryID = _DATABASE:GetCountryFromClientTemplate( MClientName )
|
local ClientCountryID = _DATABASE:GetCountryFromClientTemplate( MClientName )
|
||||||
|
if ClientCountryID==nil and MClient:IsAlive()~=nil then
|
||||||
|
ClientCountryID=MClient:GetCountry()
|
||||||
|
end
|
||||||
self:T3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } )
|
self:T3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } )
|
||||||
if country.id[CountryName] and country.id[CountryName] == ClientCountryID then
|
if country.id[CountryName] and ClientCountryID and country.id[CountryName] == ClientCountryID then
|
||||||
MClientCountry = true
|
MClientCountry = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -58,7 +58,7 @@ do -- UserFlag
|
|||||||
|
|
||||||
--- Set the userflag to a given Number.
|
--- Set the userflag to a given Number.
|
||||||
-- @param #USERFLAG self
|
-- @param #USERFLAG self
|
||||||
-- @param #number Number The number value to be checked if it is the same as the userflag.
|
-- @param #number Number The number value to set the flag to.
|
||||||
-- @param #number Delay Delay in seconds, before the flag is set.
|
-- @param #number Delay Delay in seconds, before the flag is set.
|
||||||
-- @return #USERFLAG The userflag instance.
|
-- @return #USERFLAG The userflag instance.
|
||||||
-- @usage
|
-- @usage
|
||||||
|
|||||||
@ -45,6 +45,7 @@
|
|||||||
-- @field #table currentMove Holds the current commanded move, if there is one assigned.
|
-- @field #table currentMove Holds the current commanded move, if there is one assigned.
|
||||||
-- @field #number Nammo0 Initial amount total ammunition (shells+rockets+missiles) of the whole group.
|
-- @field #number Nammo0 Initial amount total ammunition (shells+rockets+missiles) of the whole group.
|
||||||
-- @field #number Nshells0 Initial amount of shells of the whole group.
|
-- @field #number Nshells0 Initial amount of shells of the whole group.
|
||||||
|
-- @field #number Narty0 Initial amount of artillery shells of the whole group.
|
||||||
-- @field #number Nrockets0 Initial amount of rockets of the whole group.
|
-- @field #number Nrockets0 Initial amount of rockets of the whole group.
|
||||||
-- @field #number Nmissiles0 Initial amount of missiles of the whole group.
|
-- @field #number Nmissiles0 Initial amount of missiles of the whole group.
|
||||||
-- @field #number Nukes0 Initial amount of tactical nukes of the whole group. Default is 0.
|
-- @field #number Nukes0 Initial amount of tactical nukes of the whole group. Default is 0.
|
||||||
@ -415,7 +416,7 @@
|
|||||||
-- arty set, battery "Paladin Alpha", rearming place
|
-- arty set, battery "Paladin Alpha", rearming place
|
||||||
--
|
--
|
||||||
-- Setting the rearming group is independent of the position of the mark. Just create one anywhere on the map and type
|
-- Setting the rearming group is independent of the position of the mark. Just create one anywhere on the map and type
|
||||||
-- arty set, battery "Mortar Bravo", rearming group "Ammo Truck M818"
|
-- arty set, battery "Mortar Bravo", rearming group "Ammo Truck M939"
|
||||||
-- Note that the name of the rearming group has to be given in quotation marks and spelt exactly as the group name defined in the mission editor.
|
-- Note that the name of the rearming group has to be given in quotation marks and spelt exactly as the group name defined in the mission editor.
|
||||||
--
|
--
|
||||||
-- ## Transporting
|
-- ## Transporting
|
||||||
@ -453,7 +454,7 @@
|
|||||||
-- -- Creat a new ARTY object from a Paladin group.
|
-- -- Creat a new ARTY object from a Paladin group.
|
||||||
-- paladin=ARTY:New(GROUP:FindByName("Blue Paladin"))
|
-- paladin=ARTY:New(GROUP:FindByName("Blue Paladin"))
|
||||||
--
|
--
|
||||||
-- -- Define a rearming group. This is a Transport M818 truck.
|
-- -- Define a rearming group. This is a Transport M939 truck.
|
||||||
-- paladin:SetRearmingGroup(GROUP:FindByName("Blue Ammo Truck"))
|
-- paladin:SetRearmingGroup(GROUP:FindByName("Blue Ammo Truck"))
|
||||||
--
|
--
|
||||||
-- -- Set the max firing range. A Paladin unit has a range of 20 km.
|
-- -- Set the max firing range. A Paladin unit has a range of 20 km.
|
||||||
@ -694,7 +695,7 @@ ARTY.db={
|
|||||||
|
|
||||||
--- Arty script version.
|
--- Arty script version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
ARTY.version="1.3.0"
|
ARTY.version="1.3.1"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -707,7 +708,7 @@ ARTY.version="1.3.0"
|
|||||||
-- DONE: Add user defined rearm weapon types.
|
-- DONE: Add user defined rearm weapon types.
|
||||||
-- DONE: Check if target is in range. Maybe this requires a data base with the ranges of all arty units. <solved by user function>
|
-- DONE: Check if target is in range. Maybe this requires a data base with the ranges of all arty units. <solved by user function>
|
||||||
-- DONE: Make ARTY move to rearming position.
|
-- DONE: Make ARTY move to rearming position.
|
||||||
-- DONE: Check that right rearming vehicle is specified. Blue M818, Red Ural-375. Are there more? <user needs to know!>
|
-- DONE: Check that right rearming vehicle is specified. Blue M939, Red Ural-375. Are there more? <user needs to know!>
|
||||||
-- DONE: Check if ARTY group is still alive.
|
-- DONE: Check if ARTY group is still alive.
|
||||||
-- DONE: Handle dead events.
|
-- DONE: Handle dead events.
|
||||||
-- DONE: Abort firing task if no shooting event occured with 5(?) minutes. Something went wrong then. Min/max range for example.
|
-- DONE: Abort firing task if no shooting event occured with 5(?) minutes. Something went wrong then. Min/max range for example.
|
||||||
@ -1532,7 +1533,7 @@ end
|
|||||||
|
|
||||||
--- Assign a group, which is responsible for rearming the ARTY group. If the group is too far away from the ARTY group it will be guided towards the ARTY group.
|
--- Assign a group, which is responsible for rearming the ARTY group. If the group is too far away from the ARTY group it will be guided towards the ARTY group.
|
||||||
-- @param #ARTY self
|
-- @param #ARTY self
|
||||||
-- @param Wrapper.Group#GROUP group Group that is supposed to rearm the ARTY group. For the blue coalition, this is often a unarmed M818 transport whilst for red an unarmed Ural-375 transport can be used.
|
-- @param Wrapper.Group#GROUP group Group that is supposed to rearm the ARTY group. For the blue coalition, this is often a unarmed M939 transport whilst for red an unarmed Ural-375 transport can be used.
|
||||||
-- @return self
|
-- @return self
|
||||||
function ARTY:SetRearmingGroup(group)
|
function ARTY:SetRearmingGroup(group)
|
||||||
self:F({group=group})
|
self:F({group=group})
|
||||||
@ -1887,7 +1888,7 @@ function ARTY:onafterStart(Controllable, From, Event, To)
|
|||||||
MESSAGE:New(text, 5):ToAllIf(self.Debug)
|
MESSAGE:New(text, 5):ToAllIf(self.Debug)
|
||||||
|
|
||||||
-- Get Ammo.
|
-- Get Ammo.
|
||||||
self.Nammo0, self.Nshells0, self.Nrockets0, self.Nmissiles0=self:GetAmmo(self.Debug)
|
self.Nammo0, self.Nshells0, self.Nrockets0, self.Nmissiles0, self.Narty0=self:GetAmmo(self.Debug)
|
||||||
|
|
||||||
-- Init nuclear explosion parameters if they were not set by user.
|
-- Init nuclear explosion parameters if they were not set by user.
|
||||||
if self.nukerange==nil then
|
if self.nukerange==nil then
|
||||||
@ -2093,7 +2094,7 @@ function ARTY:_StatusReport(display)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Get Ammo.
|
-- Get Ammo.
|
||||||
local Nammo, Nshells, Nrockets, Nmissiles=self:GetAmmo()
|
local Nammo, Nshells, Nrockets, Nmissiles, Narty=self:GetAmmo()
|
||||||
local Nnukes=self.Nukes
|
local Nnukes=self.Nukes
|
||||||
local Nillu=self.Nillu
|
local Nillu=self.Nillu
|
||||||
local Nsmoke=self.Nsmoke
|
local Nsmoke=self.Nsmoke
|
||||||
@ -2106,7 +2107,7 @@ function ARTY:_StatusReport(display)
|
|||||||
text=text..string.format("Clock = %s\n", Clock)
|
text=text..string.format("Clock = %s\n", Clock)
|
||||||
text=text..string.format("FSM state = %s\n", self:GetState())
|
text=text..string.format("FSM state = %s\n", self:GetState())
|
||||||
text=text..string.format("Total ammo count = %d\n", Nammo)
|
text=text..string.format("Total ammo count = %d\n", Nammo)
|
||||||
text=text..string.format("Number of shells = %d\n", Nshells)
|
text=text..string.format("Number of shells = %d\n", Narty)
|
||||||
text=text..string.format("Number of rockets = %d\n", Nrockets)
|
text=text..string.format("Number of rockets = %d\n", Nrockets)
|
||||||
text=text..string.format("Number of missiles = %d\n", Nmissiles)
|
text=text..string.format("Number of missiles = %d\n", Nmissiles)
|
||||||
text=text..string.format("Number of nukes = %d\n", Nnukes)
|
text=text..string.format("Number of nukes = %d\n", Nnukes)
|
||||||
@ -2293,7 +2294,7 @@ function ARTY:OnEventShot(EventData)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Get current ammo.
|
-- Get current ammo.
|
||||||
local _nammo,_nshells,_nrockets,_nmissiles=self:GetAmmo()
|
local _nammo,_nshells,_nrockets,_nmissiles,_narty=self:GetAmmo()
|
||||||
|
|
||||||
-- Decrease available nukes because we just fired one.
|
-- Decrease available nukes because we just fired one.
|
||||||
if self.currentTarget.weapontype==ARTY.WeaponType.TacticalNukes then
|
if self.currentTarget.weapontype==ARTY.WeaponType.TacticalNukes then
|
||||||
@ -2323,7 +2324,7 @@ function ARTY:OnEventShot(EventData)
|
|||||||
|
|
||||||
-- Weapon type name for current target.
|
-- Weapon type name for current target.
|
||||||
local _weapontype=self:_WeaponTypeName(self.currentTarget.weapontype)
|
local _weapontype=self:_WeaponTypeName(self.currentTarget.weapontype)
|
||||||
self:T(self.lid..string.format("Group %s ammo: total=%d, shells=%d, rockets=%d, missiles=%d", self.groupname, _nammo, _nshells, _nrockets, _nmissiles))
|
self:T(self.lid..string.format("Group %s ammo: total=%d, shells=%d, rockets=%d, missiles=%d", self.groupname, _nammo, _narty, _nrockets, _nmissiles))
|
||||||
self:T(self.lid..string.format("Group %s uses weapontype %s for current target.", self.groupname, _weapontype))
|
self:T(self.lid..string.format("Group %s uses weapontype %s for current target.", self.groupname, _weapontype))
|
||||||
|
|
||||||
-- Default switches for cease fire and relocation.
|
-- Default switches for cease fire and relocation.
|
||||||
@ -2771,7 +2772,7 @@ function ARTY:onafterStatus(Controllable, From, Event, To)
|
|||||||
self:_EventFromTo("onafterStatus", Event, From, To)
|
self:_EventFromTo("onafterStatus", Event, From, To)
|
||||||
|
|
||||||
-- Get ammo.
|
-- Get ammo.
|
||||||
local nammo, nshells, nrockets, nmissiles=self:GetAmmo()
|
local nammo, nshells, nrockets, nmissiles, narty=self:GetAmmo()
|
||||||
|
|
||||||
-- We have a cargo group ==> check if group was loaded into a carrier.
|
-- We have a cargo group ==> check if group was loaded into a carrier.
|
||||||
if self.iscargo and self.cargogroup then
|
if self.iscargo and self.cargogroup then
|
||||||
@ -2788,7 +2789,7 @@ function ARTY:onafterStatus(Controllable, From, Event, To)
|
|||||||
|
|
||||||
-- FSM state.
|
-- FSM state.
|
||||||
local fsmstate=self:GetState()
|
local fsmstate=self:GetState()
|
||||||
self:T(self.lid..string.format("Status %s, Ammo total=%d: shells=%d [smoke=%d, illu=%d, nukes=%d*%.3f kT], rockets=%d, missiles=%d", fsmstate, nammo, nshells, self.Nsmoke, self.Nillu, self.Nukes, self.nukewarhead/1000000, nrockets, nmissiles))
|
self:T(self.lid..string.format("Status %s, Ammo total=%d: shells=%d [smoke=%d, illu=%d, nukes=%d*%.3f kT], rockets=%d, missiles=%d", fsmstate, nammo, narty, self.Nsmoke, self.Nillu, self.Nukes, self.nukewarhead/1000000, nrockets, nmissiles))
|
||||||
|
|
||||||
if self.Controllable and self.Controllable:IsAlive() then
|
if self.Controllable and self.Controllable:IsAlive() then
|
||||||
|
|
||||||
@ -2872,18 +2873,17 @@ function ARTY:onafterStatus(Controllable, From, Event, To)
|
|||||||
self:CeaseFire(self.currentTarget)
|
self:CeaseFire(self.currentTarget)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if self:is("CombatReady") then
|
||||||
-- Open fire on timed target.
|
-- Open fire on timed target.
|
||||||
self:OpenFire(_timedTarget)
|
self:OpenFire(_timedTarget)
|
||||||
|
end
|
||||||
elseif _normalTarget then
|
elseif _normalTarget then
|
||||||
|
|
||||||
|
if self:is("CombatReady") then
|
||||||
-- Open fire on normal target.
|
-- Open fire on normal target.
|
||||||
self:OpenFire(_normalTarget)
|
self:OpenFire(_normalTarget)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
-- Get ammo.
|
|
||||||
--local nammo, nshells, nrockets, nmissiles=self:GetAmmo()
|
|
||||||
|
|
||||||
-- Check if we have a target in the queue for which weapons are still available.
|
-- Check if we have a target in the queue for which weapons are still available.
|
||||||
local gotsome=false
|
local gotsome=false
|
||||||
@ -3045,14 +3045,14 @@ function ARTY:onafterOpenFire(Controllable, From, Event, To, target)
|
|||||||
local range=Controllable:GetCoordinate():Get2DDistance(target.coord)
|
local range=Controllable:GetCoordinate():Get2DDistance(target.coord)
|
||||||
|
|
||||||
-- Get ammo.
|
-- Get ammo.
|
||||||
local Nammo, Nshells, Nrockets, Nmissiles=self:GetAmmo()
|
local Nammo, Nshells, Nrockets, Nmissiles, Narty=self:GetAmmo()
|
||||||
local nfire=Nammo
|
local nfire=Narty
|
||||||
local _type="shots"
|
local _type="shots"
|
||||||
if target.weapontype==ARTY.WeaponType.Auto then
|
if target.weapontype==ARTY.WeaponType.Auto then
|
||||||
nfire=Nammo
|
nfire=Narty
|
||||||
_type="shots"
|
_type="shots"
|
||||||
elseif target.weapontype==ARTY.WeaponType.Cannon then
|
elseif target.weapontype==ARTY.WeaponType.Cannon then
|
||||||
nfire=Nshells
|
nfire=Narty
|
||||||
_type="shells"
|
_type="shells"
|
||||||
elseif target.weapontype==ARTY.WeaponType.TacticalNukes then
|
elseif target.weapontype==ARTY.WeaponType.TacticalNukes then
|
||||||
nfire=self.Nukes
|
nfire=self.Nukes
|
||||||
@ -3337,7 +3337,7 @@ function ARTY:_CheckRearmed()
|
|||||||
self:F2()
|
self:F2()
|
||||||
|
|
||||||
-- Get current ammo.
|
-- Get current ammo.
|
||||||
local nammo,nshells,nrockets,nmissiles=self:GetAmmo()
|
local nammo,nshells,nrockets,nmissiles,narty=self:GetAmmo()
|
||||||
|
|
||||||
-- Number of units still alive.
|
-- Number of units still alive.
|
||||||
local units=self.Controllable:GetUnits()
|
local units=self.Controllable:GetUnits()
|
||||||
@ -3604,6 +3604,10 @@ function ARTY:_FireAtCoord(coord, radius, nshells, weapontype)
|
|||||||
weapontype=ARTY.WeaponType.Cannon
|
weapontype=ARTY.WeaponType.Cannon
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if group:HasTask() then
|
||||||
|
group:ClearTasks()
|
||||||
|
end
|
||||||
|
|
||||||
-- Set ROE to weapon free.
|
-- Set ROE to weapon free.
|
||||||
group:OptionROEOpenFire()
|
group:OptionROEOpenFire()
|
||||||
|
|
||||||
@ -3614,7 +3618,7 @@ function ARTY:_FireAtCoord(coord, radius, nshells, weapontype)
|
|||||||
local fire=group:TaskFireAtPoint(vec2, radius, nshells, weapontype)
|
local fire=group:TaskFireAtPoint(vec2, radius, nshells, weapontype)
|
||||||
|
|
||||||
-- Execute task.
|
-- Execute task.
|
||||||
group:SetTask(fire)
|
group:SetTask(fire,1)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Set task for attacking a group.
|
--- Set task for attacking a group.
|
||||||
@ -3632,6 +3636,10 @@ function ARTY:_AttackGroup(target)
|
|||||||
weapontype=ARTY.WeaponType.Cannon
|
weapontype=ARTY.WeaponType.Cannon
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if group:HasTask() then
|
||||||
|
group:ClearTasks()
|
||||||
|
end
|
||||||
|
|
||||||
-- Set ROE to weapon free.
|
-- Set ROE to weapon free.
|
||||||
group:OptionROEOpenFire()
|
group:OptionROEOpenFire()
|
||||||
|
|
||||||
@ -3642,7 +3650,7 @@ function ARTY:_AttackGroup(target)
|
|||||||
local fire=group:TaskAttackGroup(targetgroup, weapontype, AI.Task.WeaponExpend.ONE, 1)
|
local fire=group:TaskAttackGroup(targetgroup, weapontype, AI.Task.WeaponExpend.ONE, 1)
|
||||||
|
|
||||||
-- Execute task.
|
-- Execute task.
|
||||||
group:SetTask(fire)
|
group:SetTask(fire,1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -3915,6 +3923,7 @@ end
|
|||||||
-- @return #number Number of shells the group has left.
|
-- @return #number Number of shells the group has left.
|
||||||
-- @return #number Number of rockets the group has left.
|
-- @return #number Number of rockets the group has left.
|
||||||
-- @return #number Number of missiles the group has left.
|
-- @return #number Number of missiles the group has left.
|
||||||
|
-- @return #number Number of artillery shells the group has left.
|
||||||
function ARTY:GetAmmo(display)
|
function ARTY:GetAmmo(display)
|
||||||
self:F3({display=display})
|
self:F3({display=display})
|
||||||
|
|
||||||
@ -3928,6 +3937,7 @@ function ARTY:GetAmmo(display)
|
|||||||
local nshells=0
|
local nshells=0
|
||||||
local nrockets=0
|
local nrockets=0
|
||||||
local nmissiles=0
|
local nmissiles=0
|
||||||
|
local nartyshells=0
|
||||||
|
|
||||||
-- Get all units.
|
-- Get all units.
|
||||||
local units=self.Controllable:GetUnits()
|
local units=self.Controllable:GetUnits()
|
||||||
@ -4030,7 +4040,8 @@ function ARTY:GetAmmo(display)
|
|||||||
|
|
||||||
-- Add up all shells.
|
-- Add up all shells.
|
||||||
nshells=nshells+Nammo
|
nshells=nshells+Nammo
|
||||||
|
local _,_,_,_,_,shells = unit:GetAmmunition()
|
||||||
|
nartyshells=nartyshells+shells
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
text=text..string.format("- %d shells of type %s\n", Nammo, _weaponName)
|
text=text..string.format("- %d shells of type %s\n", Nammo, _weaponName)
|
||||||
|
|
||||||
@ -4076,7 +4087,7 @@ function ARTY:GetAmmo(display)
|
|||||||
-- Total amount of ammunition.
|
-- Total amount of ammunition.
|
||||||
nammo=nshells+nrockets+nmissiles
|
nammo=nshells+nrockets+nmissiles
|
||||||
|
|
||||||
return nammo, nshells, nrockets, nmissiles
|
return nammo, nshells, nrockets, nmissiles, nartyshells
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Returns a name of a missile category.
|
--- Returns a name of a missile category.
|
||||||
@ -4827,7 +4838,10 @@ function ARTY:_CheckShootingStarted()
|
|||||||
|
|
||||||
-- Check if we waited long enough and no shot was fired.
|
-- Check if we waited long enough and no shot was fired.
|
||||||
--if dt > self.WaitForShotTime and self.Nshots==0 then
|
--if dt > self.WaitForShotTime and self.Nshots==0 then
|
||||||
if dt > self.WaitForShotTime and (self.Nshots==0 or self.currentTarget.nshells >= self.Nshots) then --https://github.com/FlightControl-Master/MOOSE/issues/1356
|
|
||||||
|
self:T(string.format("dt = %d WaitTime = %d | shots = %d TargetShells = %d",dt,self.WaitForShotTime,self.Nshots,self.currentTarget.nshells))
|
||||||
|
|
||||||
|
if (dt > self.WaitForShotTime and self.Nshots==0) or (self.currentTarget.nshells <= self.Nshots) then --https://github.com/FlightControl-Master/MOOSE/issues/1356
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:T(self.lid..string.format("%s, no shot event after %d seconds. Removing current target %s from list.", self.groupname, self.WaitForShotTime, name))
|
self:T(self.lid..string.format("%s, no shot event after %d seconds. Removing current target %s from list.", self.groupname, self.WaitForShotTime, name))
|
||||||
@ -4889,7 +4903,7 @@ end
|
|||||||
function ARTY:_CheckOutOfAmmo(targets)
|
function ARTY:_CheckOutOfAmmo(targets)
|
||||||
|
|
||||||
-- Get current ammo.
|
-- Get current ammo.
|
||||||
local _nammo,_nshells,_nrockets,_nmissiles=self:GetAmmo()
|
local _nammo,_nshells,_nrockets,_nmissiles,_narty=self:GetAmmo()
|
||||||
|
|
||||||
-- Special weapon type requested ==> Check if corresponding ammo is empty.
|
-- Special weapon type requested ==> Check if corresponding ammo is empty.
|
||||||
local _partlyoutofammo=false
|
local _partlyoutofammo=false
|
||||||
@ -4901,7 +4915,7 @@ function ARTY:_CheckOutOfAmmo(targets)
|
|||||||
self:T(self.lid..string.format("Group %s, auto weapon requested for target %s but all ammo is empty.", self.groupname, Target.name))
|
self:T(self.lid..string.format("Group %s, auto weapon requested for target %s but all ammo is empty.", self.groupname, Target.name))
|
||||||
_partlyoutofammo=true
|
_partlyoutofammo=true
|
||||||
|
|
||||||
elseif Target.weapontype==ARTY.WeaponType.Cannon and _nshells==0 then
|
elseif Target.weapontype==ARTY.WeaponType.Cannon and _narty==0 then
|
||||||
|
|
||||||
self:T(self.lid..string.format("Group %s, cannons requested for target %s but shells empty.", self.groupname, Target.name))
|
self:T(self.lid..string.format("Group %s, cannons requested for target %s but shells empty.", self.groupname, Target.name))
|
||||||
_partlyoutofammo=true
|
_partlyoutofammo=true
|
||||||
@ -4945,14 +4959,14 @@ end
|
|||||||
function ARTY:_CheckWeaponTypeAvailable(target)
|
function ARTY:_CheckWeaponTypeAvailable(target)
|
||||||
|
|
||||||
-- Get current ammo of group.
|
-- Get current ammo of group.
|
||||||
local Nammo, Nshells, Nrockets, Nmissiles=self:GetAmmo()
|
local Nammo, Nshells, Nrockets, Nmissiles, Narty=self:GetAmmo()
|
||||||
|
|
||||||
-- Check if enough ammo is there for the selected weapon type.
|
-- Check if enough ammo is there for the selected weapon type.
|
||||||
local nfire=Nammo
|
local nfire=Nammo
|
||||||
if target.weapontype==ARTY.WeaponType.Auto then
|
if target.weapontype==ARTY.WeaponType.Auto then
|
||||||
nfire=Nammo
|
nfire=Nammo
|
||||||
elseif target.weapontype==ARTY.WeaponType.Cannon then
|
elseif target.weapontype==ARTY.WeaponType.Cannon then
|
||||||
nfire=Nshells
|
nfire=Narty
|
||||||
elseif target.weapontype==ARTY.WeaponType.TacticalNukes then
|
elseif target.weapontype==ARTY.WeaponType.TacticalNukes then
|
||||||
nfire=self.Nukes
|
nfire=self.Nukes
|
||||||
elseif target.weapontype==ARTY.WeaponType.IlluminationShells then
|
elseif target.weapontype==ARTY.WeaponType.IlluminationShells then
|
||||||
|
|||||||
@ -7946,6 +7946,7 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
|
|||||||
local clients=_DATABASE.CLIENTS
|
local clients=_DATABASE.CLIENTS
|
||||||
for clientname, client in pairs(clients) do
|
for clientname, client in pairs(clients) do
|
||||||
local template=_DATABASE:GetGroupTemplateFromUnitName(clientname)
|
local template=_DATABASE:GetGroupTemplateFromUnitName(clientname)
|
||||||
|
if template then
|
||||||
local units=template.units
|
local units=template.units
|
||||||
for i,unit in pairs(units) do
|
for i,unit in pairs(units) do
|
||||||
local coord=COORDINATE:New(unit.x, unit.alt, unit.y)
|
local coord=COORDINATE:New(unit.x, unit.alt, unit.y)
|
||||||
@ -7953,6 +7954,7 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
return coords
|
return coords
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -63,6 +63,8 @@
|
|||||||
-- @field #number power Radio power in Watts. Default 100 W.
|
-- @field #number power Radio power in Watts. Default 100 W.
|
||||||
-- @field Sound.RadioQueue#RADIOQUEUE radioqueue Radio queue for broadcasing messages.
|
-- @field Sound.RadioQueue#RADIOQUEUE radioqueue Radio queue for broadcasing messages.
|
||||||
-- @field #string soundpath Path to sound files.
|
-- @field #string soundpath Path to sound files.
|
||||||
|
-- @field #string soundpathAirports Path to airport names sound files.
|
||||||
|
-- @field #string soundpathNato Path to NATO alphabet sound files.
|
||||||
-- @field #string relayunitname Name of the radio relay unit.
|
-- @field #string relayunitname Name of the radio relay unit.
|
||||||
-- @field #table towerfrequency Table with tower frequencies.
|
-- @field #table towerfrequency Table with tower frequencies.
|
||||||
-- @field #string activerunway The active runway specified by the user.
|
-- @field #string activerunway The active runway specified by the user.
|
||||||
@ -1081,12 +1083,24 @@ function ATIS:SetLocale(locale)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Set sound files folder within miz file.
|
--- Set sound files folder within miz file (not your local hard drive!).
|
||||||
-- @param #ATIS self
|
-- @param #ATIS self
|
||||||
-- @param #string path Path for sound files. Default "ATIS Soundfiles/". Mind the slash "/" at the end!
|
-- @param #string pathMain Path to folder containing main sound files. Default "ATIS Soundfiles/". Mind the slash "/" at the end!
|
||||||
|
-- @param #string pathAirports Path folder containing the airport names sound files. Default is `"ATIS Soundfiles/<Map Name>"`, *e.g.* `"ATIS Soundfiles/Caucasus/"`.
|
||||||
|
-- @param #string pathNato Path folder containing the NATO alphabet sound files. Default is "ATIS Soundfiles/NATO Alphabet/".
|
||||||
-- @return #ATIS self
|
-- @return #ATIS self
|
||||||
function ATIS:SetSoundfilesPath( path )
|
function ATIS:SetSoundfilesPath( pathMain, pathAirports, pathNato )
|
||||||
self.soundpath = tostring( path or "ATIS Soundfiles/" )
|
self.soundpath = tostring( pathMain or "ATIS Soundfiles/" )
|
||||||
|
if pathAirports==nil then
|
||||||
|
self.soundpathAirports=self.soundpath..env.mission.theatre.."/"
|
||||||
|
else
|
||||||
|
self.soundpathAirports=pathAirports
|
||||||
|
end
|
||||||
|
if pathNato==nil then
|
||||||
|
self.soundpathNato=self.soundpath.."NATO Alphabet/"
|
||||||
|
else
|
||||||
|
self.soundpathNato=pathNato
|
||||||
|
end
|
||||||
self:T( self.lid .. string.format( "Setting sound files path to %s", self.soundpath ) )
|
self:T( self.lid .. string.format( "Setting sound files path to %s", self.soundpath ) )
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@ -2059,10 +2073,45 @@ function ATIS:onafterBroadcast( From, Event, To )
|
|||||||
-- Cloud preset (DCS 2.7)
|
-- Cloud preset (DCS 2.7)
|
||||||
local cloudspreset = clouds.preset or "Nothing"
|
local cloudspreset = clouds.preset or "Nothing"
|
||||||
|
|
||||||
|
env.info("FF cloud preset "..cloudspreset)
|
||||||
|
|
||||||
-- Precepitation: 0=None, 1=Rain, 2=Thunderstorm, 3=Snow, 4=Snowstorm.
|
-- Precepitation: 0=None, 1=Rain, 2=Thunderstorm, 3=Snow, 4=Snowstorm.
|
||||||
local precepitation = 0
|
local precepitation = 0
|
||||||
|
|
||||||
if cloudspreset:find( "Preset10" ) then
|
if cloudspreset:find( "RainyPreset1" ) then
|
||||||
|
-- Overcast + Rain
|
||||||
|
clouddens = 9
|
||||||
|
if temperature > 5 then
|
||||||
|
precepitation = 1 -- rain
|
||||||
|
else
|
||||||
|
precepitation = 3 -- snow
|
||||||
|
end
|
||||||
|
elseif cloudspreset:find( "RainyPreset2" ) then
|
||||||
|
-- Overcast + Rain
|
||||||
|
clouddens = 9
|
||||||
|
if temperature > 5 then
|
||||||
|
precepitation = 1 -- rain
|
||||||
|
else
|
||||||
|
precepitation = 3 -- snow
|
||||||
|
end
|
||||||
|
elseif cloudspreset:find( "RainyPreset3" ) then
|
||||||
|
-- Overcast + Rain
|
||||||
|
clouddens = 9
|
||||||
|
if temperature > 5 then
|
||||||
|
precepitation = 1 -- rain
|
||||||
|
else
|
||||||
|
precepitation = 3 -- snow
|
||||||
|
end
|
||||||
|
env.info("Fprecipt "..precepitation)
|
||||||
|
elseif cloudspreset:find( "RainyPreset" ) then
|
||||||
|
-- Overcast + Rain
|
||||||
|
clouddens = 9
|
||||||
|
if temperature > 5 then
|
||||||
|
precepitation = 1 -- rain
|
||||||
|
else
|
||||||
|
precepitation = 3 -- snow
|
||||||
|
end
|
||||||
|
elseif cloudspreset:find( "Preset10" ) then
|
||||||
-- Scattered 5
|
-- Scattered 5
|
||||||
clouddens = 4
|
clouddens = 4
|
||||||
elseif cloudspreset:find( "Preset11" ) then
|
elseif cloudspreset:find( "Preset11" ) then
|
||||||
@ -2143,38 +2192,8 @@ function ATIS:onafterBroadcast( From, Event, To )
|
|||||||
elseif cloudspreset:find( "Preset9" ) then
|
elseif cloudspreset:find( "Preset9" ) then
|
||||||
-- Scattered 4
|
-- Scattered 4
|
||||||
clouddens = 4
|
clouddens = 4
|
||||||
elseif cloudspreset:find( "RainyPreset" ) then
|
|
||||||
-- Overcast + Rain
|
|
||||||
clouddens = 9
|
|
||||||
if temperature > 5 then
|
|
||||||
precepitation = 1 -- rain
|
|
||||||
else
|
else
|
||||||
precepitation = 3 -- snow
|
self:E(string.format("WARNING! Unknown weather preset: %s", tostring(cloudspreset)))
|
||||||
end
|
|
||||||
elseif cloudspreset:find( "RainyPreset1" ) then
|
|
||||||
-- Overcast + Rain
|
|
||||||
clouddens = 9
|
|
||||||
if temperature > 5 then
|
|
||||||
precepitation = 1 -- rain
|
|
||||||
else
|
|
||||||
precepitation = 3 -- snow
|
|
||||||
end
|
|
||||||
elseif cloudspreset:find( "RainyPreset2" ) then
|
|
||||||
-- Overcast + Rain
|
|
||||||
clouddens = 9
|
|
||||||
if temperature > 5 then
|
|
||||||
precepitation = 1 -- rain
|
|
||||||
else
|
|
||||||
precepitation = 3 -- snow
|
|
||||||
end
|
|
||||||
elseif cloudspreset:find( "RainyPreset3" ) then
|
|
||||||
-- Overcast + Rain
|
|
||||||
clouddens = 9
|
|
||||||
if temperature > 5 then
|
|
||||||
precepitation = 1 -- rain
|
|
||||||
else
|
|
||||||
precepitation = 3 -- snow
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local CLOUDBASE = string.format( "%d", UTILS.MetersToFeet( cloudbase ) )
|
local CLOUDBASE = string.format( "%d", UTILS.MetersToFeet( cloudbase ) )
|
||||||
@ -2249,7 +2268,7 @@ function ATIS:onafterBroadcast( From, Event, To )
|
|||||||
end
|
end
|
||||||
if not self.useSRS then
|
if not self.useSRS then
|
||||||
--self:I(string.format( "%s/%s.ogg", self.theatre, self.airbasename ))
|
--self:I(string.format( "%s/%s.ogg", self.theatre, self.airbasename ))
|
||||||
self.radioqueue:NewTransmission( string.format( "%s/%s.ogg", self.theatre, self.airbasename ), 3.0, self.soundpath, nil, nil, subtitle, self.subduration )
|
self.radioqueue:NewTransmission( string.format( "%s.ogg", self.airbasename ), 3.0, self.soundpathAirports, nil, nil, subtitle, self.subduration )
|
||||||
end
|
end
|
||||||
local alltext = subtitle
|
local alltext = subtitle
|
||||||
|
|
||||||
@ -2260,7 +2279,7 @@ function ATIS:onafterBroadcast( From, Event, To )
|
|||||||
local _INFORMATION = subtitle
|
local _INFORMATION = subtitle
|
||||||
if not self.useSRS then
|
if not self.useSRS then
|
||||||
self:Transmission( self.Sound.Information, 0.5, subtitle )
|
self:Transmission( self.Sound.Information, 0.5, subtitle )
|
||||||
self.radioqueue:NewTransmission( string.format( "NATO Alphabet/%s.ogg", NATO ), 0.75, self.soundpath )
|
self.radioqueue:NewTransmission( string.format( "%s.ogg", NATO ), 0.75, self.soundpathNato )
|
||||||
end
|
end
|
||||||
alltext = alltext .. ";\n" .. subtitle
|
alltext = alltext .. ";\n" .. subtitle
|
||||||
|
|
||||||
@ -2875,7 +2894,7 @@ function ATIS:onafterBroadcast( From, Event, To )
|
|||||||
if not self.useSRS then
|
if not self.useSRS then
|
||||||
self:Transmission( self.Sound.TACANChannel, 1.0, subtitle )
|
self:Transmission( self.Sound.TACANChannel, 1.0, subtitle )
|
||||||
self.radioqueue:Number2Transmission( tostring( self.tacan ), nil, 0.2 )
|
self.radioqueue:Number2Transmission( tostring( self.tacan ), nil, 0.2 )
|
||||||
self.radioqueue:NewTransmission( "NATO Alphabet/Xray.ogg", 0.75, self.soundpath, nil, 0.2 )
|
self.radioqueue:NewTransmission( "Xray.ogg", 0.75, self.soundpathNato, nil, 0.2 )
|
||||||
end
|
end
|
||||||
alltext = alltext .. ";\n" .. subtitle
|
alltext = alltext .. ";\n" .. subtitle
|
||||||
end
|
end
|
||||||
@ -2916,7 +2935,7 @@ function ATIS:onafterBroadcast( From, Event, To )
|
|||||||
subtitle = string.format( "%s %s", advtxt, NATO )
|
subtitle = string.format( "%s %s", advtxt, NATO )
|
||||||
if not self.useSRS then
|
if not self.useSRS then
|
||||||
self:Transmission( self.Sound.AdviceOnInitial, 0.5, subtitle )
|
self:Transmission( self.Sound.AdviceOnInitial, 0.5, subtitle )
|
||||||
self.radioqueue:NewTransmission( string.format( "NATO Alphabet/%s.ogg", NATO ), 0.75, self.soundpath )
|
self.radioqueue:NewTransmission( string.format( "%s.ogg", NATO ), 0.75, self.soundpathNato )
|
||||||
end
|
end
|
||||||
alltext = alltext .. ";\n" .. subtitle
|
alltext = alltext .. ";\n" .. subtitle
|
||||||
|
|
||||||
@ -3171,7 +3190,7 @@ end
|
|||||||
-- @param #ATIS.Soundfile sound ATIS sound object.
|
-- @param #ATIS.Soundfile sound ATIS sound object.
|
||||||
-- @param #number interval Interval in seconds after the last transmission finished.
|
-- @param #number interval Interval in seconds after the last transmission finished.
|
||||||
-- @param #string subtitle Subtitle of the transmission.
|
-- @param #string subtitle Subtitle of the transmission.
|
||||||
-- @param #string path Path to sound file. Default self.soundpath.
|
-- @param #string path Path to sound file. Default `self.soundpath`.
|
||||||
function ATIS:Transmission( sound, interval, subtitle, path )
|
function ATIS:Transmission( sound, interval, subtitle, path )
|
||||||
self.radioqueue:NewTransmission( sound.filename, sound.duration, path or self.soundpath, nil, interval, subtitle, self.subduration )
|
self.radioqueue:NewTransmission( sound.filename, sound.duration, path or self.soundpath, nil, interval, subtitle, self.subduration )
|
||||||
end
|
end
|
||||||
|
|||||||
@ -197,6 +197,45 @@ CALLSIGN={
|
|||||||
Cargo=11,
|
Cargo=11,
|
||||||
Ascot=12,
|
Ascot=12,
|
||||||
},
|
},
|
||||||
|
AH64={
|
||||||
|
Army_Air = 9,
|
||||||
|
Apache = 10,
|
||||||
|
Crow = 11,
|
||||||
|
Sioux = 12,
|
||||||
|
Gatling = 13,
|
||||||
|
Gunslinger = 14,
|
||||||
|
Hammerhead = 15,
|
||||||
|
Bootleg = 16,
|
||||||
|
Palehorse = 17,
|
||||||
|
Carnivor = 18,
|
||||||
|
Saber = 19,
|
||||||
|
},
|
||||||
|
Kiowa = {
|
||||||
|
Anvil = 1,
|
||||||
|
Azrael = 2,
|
||||||
|
BamBam = 3,
|
||||||
|
Blackjack = 4,
|
||||||
|
Bootleg = 5,
|
||||||
|
BurninStogie = 6,
|
||||||
|
Chaos = 7,
|
||||||
|
CrazyHorse = 8,
|
||||||
|
Crusader = 9,
|
||||||
|
Darkhorse = 10,
|
||||||
|
Eagle = 11,
|
||||||
|
Lighthorse = 12,
|
||||||
|
Mustang = 13,
|
||||||
|
Outcast = 14,
|
||||||
|
Palehorse = 15,
|
||||||
|
Pegasus = 16,
|
||||||
|
Pistol = 17,
|
||||||
|
Roughneck = 18,
|
||||||
|
Saber = 19,
|
||||||
|
Shamus = 20,
|
||||||
|
Spur = 21,
|
||||||
|
Stetson = 22,
|
||||||
|
Wrath = 23,
|
||||||
|
},
|
||||||
|
|
||||||
} --#CALLSIGN
|
} --#CALLSIGN
|
||||||
|
|
||||||
--- Utilities static class.
|
--- Utilities static class.
|
||||||
@ -1924,6 +1963,18 @@ function UTILS.GetCallsignName(Callsign)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
for name, value in pairs(CALLSIGN.AH64) do
|
||||||
|
if value==Callsign then
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for name, value in pairs(CALLSIGN.Kiowa) do
|
||||||
|
if value==Callsign then
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return "Ghostrider"
|
return "Ghostrider"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -445,7 +445,11 @@ function UNIT:IsPlayer()
|
|||||||
if not group then return false end
|
if not group then return false end
|
||||||
|
|
||||||
-- Units of template group.
|
-- Units of template group.
|
||||||
local units=group:GetTemplate().units
|
local template = group:GetTemplate()
|
||||||
|
|
||||||
|
if (template == nil) or (template.units == nil ) then return false end
|
||||||
|
|
||||||
|
local units=template.units
|
||||||
|
|
||||||
-- Get numbers.
|
-- Get numbers.
|
||||||
for _,unit in pairs(units) do
|
for _,unit in pairs(units) do
|
||||||
@ -789,11 +793,13 @@ end
|
|||||||
--- Get the number of ammunition and in particular the number of shells, rockets, bombs and missiles a unit currently has.
|
--- Get the number of ammunition and in particular the number of shells, rockets, bombs and missiles a unit currently has.
|
||||||
-- @param #UNIT self
|
-- @param #UNIT self
|
||||||
-- @return #number Total amount of ammo the unit has left. This is the sum of shells, rockets, bombs and missiles.
|
-- @return #number Total amount of ammo the unit has left. This is the sum of shells, rockets, bombs and missiles.
|
||||||
-- @return #number Number of shells left.
|
-- @return #number Number of shells left. Shells include MG ammunition, AP and HE shells, and artillery shells where applicable.
|
||||||
-- @return #number Number of rockets left.
|
-- @return #number Number of rockets left.
|
||||||
-- @return #number Number of bombs left.
|
-- @return #number Number of bombs left.
|
||||||
-- @return #number Number of missiles left.
|
-- @return #number Number of missiles left.
|
||||||
-- @return #number Number of artillery shells left (with explosive mass, included in shells; shells can also be machine gun ammo)
|
-- @return #number Number of artillery shells left (with explosive mass, included in shells; HE will also be reported as artillery shells for tanks)
|
||||||
|
-- @return #number Number of tank AP shells left (for tanks, if applicable)
|
||||||
|
-- @return #number Number of tank HE shells left (for tanks, if applicable)
|
||||||
function UNIT:GetAmmunition()
|
function UNIT:GetAmmunition()
|
||||||
|
|
||||||
-- Init counter.
|
-- Init counter.
|
||||||
@ -803,6 +809,8 @@ function UNIT:GetAmmunition()
|
|||||||
local nmissiles=0
|
local nmissiles=0
|
||||||
local nbombs=0
|
local nbombs=0
|
||||||
local narti=0
|
local narti=0
|
||||||
|
local nAPshells = 0
|
||||||
|
local nHEshells = 0
|
||||||
|
|
||||||
local unit=self
|
local unit=self
|
||||||
|
|
||||||
@ -844,6 +852,14 @@ function UNIT:GetAmmunition()
|
|||||||
narti=narti+Nammo
|
narti=narti+Nammo
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if ammotable[w].desc.typeName and string.find(ammotable[w].desc.typeName,"_AP",1,true) then
|
||||||
|
nAPshells = nAPshells+Nammo
|
||||||
|
end
|
||||||
|
|
||||||
|
if ammotable[w].desc.typeName and string.find(ammotable[w].desc.typeName,"_HE",1,true) then
|
||||||
|
nHEshells = nHEshells+Nammo
|
||||||
|
end
|
||||||
|
|
||||||
elseif Category==Weapon.Category.ROCKET then
|
elseif Category==Weapon.Category.ROCKET then
|
||||||
|
|
||||||
-- Add up all rockets.
|
-- Add up all rockets.
|
||||||
@ -880,7 +896,55 @@ function UNIT:GetAmmunition()
|
|||||||
-- Total amount of ammunition.
|
-- Total amount of ammunition.
|
||||||
nammo=nshells+nrockets+nmissiles+nbombs
|
nammo=nshells+nrockets+nmissiles+nbombs
|
||||||
|
|
||||||
return nammo, nshells, nrockets, nbombs, nmissiles, narti
|
return nammo, nshells, nrockets, nbombs, nmissiles, narti, nAPshells, nHEshells
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Checks if a tank still has AP shells.
|
||||||
|
-- @param #UNIT self
|
||||||
|
-- @return #boolean HasAPShells
|
||||||
|
function UNIT:HasAPShells()
|
||||||
|
local _,_,_,_,_,_,shells = self:GetAmmunition()
|
||||||
|
if shells > 0 then return true else return false end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get number of AP shells from a tank.
|
||||||
|
-- @param #UNIT self
|
||||||
|
-- @return #number Number of AP shells
|
||||||
|
function UNIT:GetAPShells()
|
||||||
|
local _,_,_,_,_,_,shells = self:GetAmmunition()
|
||||||
|
return shells or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get number of HE shells from a tank.
|
||||||
|
-- @param #UNIT self
|
||||||
|
-- @return #number Number of HE shells
|
||||||
|
function UNIT:GetHEShells()
|
||||||
|
local _,_,_,_,_,_,_,shells = self:GetAmmunition()
|
||||||
|
return shells or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Checks if a tank still has HE shells.
|
||||||
|
-- @param #UNIT self
|
||||||
|
-- @return #boolean HasHEShells
|
||||||
|
function UNIT:HasHEShells()
|
||||||
|
local _,_,_,_,_,_,_,shells = self:GetAmmunition()
|
||||||
|
if shells > 0 then return true else return false end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Checks if an artillery unit still has artillery shells.
|
||||||
|
-- @param #UNIT self
|
||||||
|
-- @return #boolean HasArtiShells
|
||||||
|
function UNIT:HasArtiShells()
|
||||||
|
local _,_,_,_,_,shells = self:GetAmmunition()
|
||||||
|
if shells > 0 then return true else return false end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get number of artillery shells from an artillery unit.
|
||||||
|
-- @param #UNIT self
|
||||||
|
-- @return #number Number of artillery shells
|
||||||
|
function UNIT:GetArtiShells()
|
||||||
|
local _,_,_,_,_,shells = self:GetAmmunition()
|
||||||
|
return shells or 0
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Returns the unit sensors.
|
--- Returns the unit sensors.
|
||||||
@ -1192,17 +1256,17 @@ function UNIT:GetThreatLevel()
|
|||||||
if self:IsGround() then
|
if self:IsGround() then
|
||||||
|
|
||||||
local ThreatLevels = {
|
local ThreatLevels = {
|
||||||
"Unarmed",
|
[1] = "Unarmed",
|
||||||
"Infantry",
|
[2] = "Infantry",
|
||||||
"Old Tanks & APCs",
|
[3] = "Old Tanks & APCs",
|
||||||
"Tanks & IFVs without ATGM",
|
[4] = "Tanks & IFVs without ATGM",
|
||||||
"Tanks & IFV with ATGM",
|
[5] = "Tanks & IFV with ATGM",
|
||||||
"Modern Tanks",
|
[6] = "Modern Tanks",
|
||||||
"AAA",
|
[7] = "AAA",
|
||||||
"IR Guided SAMs",
|
[8] = "IR Guided SAMs",
|
||||||
"SR SAMs",
|
[9] = "SR SAMs",
|
||||||
"MR SAMs",
|
[10] = "MR SAMs",
|
||||||
"LR SAMs"
|
[11] = "LR SAMs"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1228,17 +1292,17 @@ function UNIT:GetThreatLevel()
|
|||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
|
|
||||||
local ThreatLevels = {
|
local ThreatLevels = {
|
||||||
"Unarmed",
|
[1] = "Unarmed",
|
||||||
"Tanker",
|
[2] = "Tanker",
|
||||||
"AWACS",
|
[3] = "AWACS",
|
||||||
"Transport Helicopter",
|
[4] = "Transport Helicopter",
|
||||||
"UAV",
|
[5] = "UAV",
|
||||||
"Bomber",
|
[6] = "Bomber",
|
||||||
"Strategic Bomber",
|
[7] = "Strategic Bomber",
|
||||||
"Attack Helicopter",
|
[8] = "Attack Helicopter",
|
||||||
"Battleplane",
|
[9] = "Battleplane",
|
||||||
"Multirole Fighter",
|
[10] = "Multirole Fighter",
|
||||||
"Fighter"
|
[11] = "Fighter"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1272,17 +1336,17 @@ function UNIT:GetThreatLevel()
|
|||||||
--["Unarmed ships"] = {"Ships","HeavyArmoredUnits",},
|
--["Unarmed ships"] = {"Ships","HeavyArmoredUnits",},
|
||||||
|
|
||||||
local ThreatLevels = {
|
local ThreatLevels = {
|
||||||
"Unarmed ship",
|
[1] = "Unarmed ship",
|
||||||
"Light armed ships",
|
[2] = "Light armed ships",
|
||||||
"Corvettes",
|
[3] = "Corvettes",
|
||||||
"",
|
[4] = "",
|
||||||
"Frigates",
|
[5] = "Frigates",
|
||||||
"",
|
[6] = "",
|
||||||
"Cruiser",
|
[7] = "Cruiser",
|
||||||
"",
|
[8] = "",
|
||||||
"Destroyer",
|
[9] = "Destroyer",
|
||||||
"",
|
[10] = "",
|
||||||
"Aircraft Carrier"
|
[11] = "Aircraft Carrier"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user