ARTY v1.0.3 buggy

something wrong with nuke, illu smoke
This commit is contained in:
funkyfranky 2018-06-13 23:00:05 +02:00
parent 6c9c4432cc
commit 851c55e985
2 changed files with 180 additions and 17 deletions

View File

@ -998,9 +998,10 @@ do -- COORDINATE
--- Creates an illumination bomb at the point. --- Creates an illumination bomb at the point.
-- @param #COORDINATE self -- @param #COORDINATE self
function COORDINATE:IlluminationBomb() -- @param #number power
function COORDINATE:IlluminationBomb(power)
self:F2() self:F2()
trigger.action.illuminationBomb( self:GetVec3() ) trigger.action.illuminationBomb( self:GetVec3(), power )
end end

View File

@ -55,6 +55,8 @@
-- @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.
-- @field #number Nillu0 Initial amount of illumination shells of the whole group. Default is 0.
-- @field #number Nsmoke0 Initial amount of smoke shells of the whole group. Default is 0.
-- @field #number StatusInterval Update interval in seconds between status updates. Default 10 seconds. -- @field #number StatusInterval Update interval in seconds between status updates. Default 10 seconds.
-- @field #number WaitForShotTime Max time in seconds to wait until fist shot event occurs after target is assigned. If time is passed without shot, the target is deleted. Default is 300 seconds. -- @field #number WaitForShotTime Max time in seconds to wait until fist shot event occurs after target is assigned. If time is passed without shot, the target is deleted. Default is 300 seconds.
-- @field #table DCSdesc DCS descriptors of the ARTY group. -- @field #table DCSdesc DCS descriptors of the ARTY group.
@ -84,7 +86,9 @@
-- @field #number minrange Minimum firing range in kilometers. Targets closer than this distance are not engaged. Default 0.1 km. -- @field #number minrange Minimum firing range in kilometers. Targets closer than this distance are not engaged. Default 0.1 km.
-- @field #number maxrange Maximum firing range in kilometers. Targets further away than this distance are not engaged. Default 10000 km. -- @field #number maxrange Maximum firing range in kilometers. Targets further away than this distance are not engaged. Default 10000 km.
-- @field #number nukewarhead Explosion strength of tactical nuclear warhead in kg TNT. Default 75000. -- @field #number nukewarhead Explosion strength of tactical nuclear warhead in kg TNT. Default 75000.
-- @field #number Nukes Number of nuclear shells, the group has available. Default is same number as normal shells. Note that if normal shells are empty, firing nukes is also not possible any more. -- @field #number Nukes Number of nuclear shells, the group has available. Note that if normal shells are empty, firing nukes is also not possible any more.
-- @field #number Nillu Number of illumination shells the group has available. Note that if normal shells are empty, firing illumination shells is also not possible any more.
-- @filed #number Nsmoke Number of smoke shells the group has available. Note that if normal shells are empty, firing smoke shells is also not possible any more.
-- @field #number nukerange Demolition range of tactical nuclear explostions. -- @field #number nukerange Demolition range of tactical nuclear explostions.
-- @field #boolean nukefire Ignite additional fires and smoke for nuclear explosions Default true. -- @field #boolean nukefire Ignite additional fires and smoke for nuclear explosions Default true.
-- @field #number nukefires Number of nuclear fires and subexplosions. -- @field #number nukefires Number of nuclear fires and subexplosions.
@ -226,6 +230,8 @@
-- * @{#ARTY.WeaponType}.Rockets: Only unguided are used during the attack. Corresponding ammo type are rockets/nurs and can be defined by @{#ARTY.SetRocketTypes}. -- * @{#ARTY.WeaponType}.Rockets: Only unguided are used during the attack. Corresponding ammo type are rockets/nurs and can be defined by @{#ARTY.SetRocketTypes}.
-- * @{#ARTY.WeaponType}.CruiseMissile: Only cruise missiles are used during the attack. Corresponding ammo type are missiles and can be defined by @{#ARTY.SetMissileTypes}. -- * @{#ARTY.WeaponType}.CruiseMissile: Only cruise missiles are used during the attack. Corresponding ammo type are missiles and can be defined by @{#ARTY.SetMissileTypes}.
-- * @{#ARTY.WeaponType}.TacticalNukes: Use tactical nuclear shells. This works only with units that have shells and is described below. -- * @{#ARTY.WeaponType}.TacticalNukes: Use tactical nuclear shells. This works only with units that have shells and is described below.
-- * @{#ARTY.WeaponType}.IlluminationShells: Use illumination shells. This works only with units that have shells and is described below.
-- * @{#ARTY.WeaponType}.SmokeShells: Use smoke shells. This works only with units that have shells and is described below.
-- --
-- ## Assigning Moves -- ## Assigning Moves
-- The ARTY group can be commanded to move. This is done by the @{#ARTY.AssignMoveCoord}(*coord*,*time*,*speed*,*onroad*,*cancel*,*name*) function. -- The ARTY group can be commanded to move. This is done by the @{#ARTY.AssignMoveCoord}(*coord*,*time*,*speed*,*onroad*,*cancel*,*name*) function.
@ -471,6 +477,8 @@ ARTY={
Nrockets0=0, Nrockets0=0,
Nmissiles0=0, Nmissiles0=0,
Nukes0=0, Nukes0=0,
Nillu0=0,
Nsmoke0=0,
StatusInterval=10, StatusInterval=10,
WaitForShotTime=300, WaitForShotTime=300,
DCSdesc=nil, DCSdesc=nil,
@ -499,6 +507,8 @@ ARTY={
maxrange=1000000, maxrange=1000000,
nukewarhead=75000, nukewarhead=75000,
Nukes=nil, Nukes=nil,
Nillu=nil,
Nsmoke=nil,
nukefire=false, nukefire=false,
nukefires=nil, nukefires=nil,
nukerange=nil, nukerange=nil,
@ -519,11 +529,10 @@ ARTY.WeaponType={
Auto=1073741822, Auto=1073741822,
Cannon=805306368, Cannon=805306368,
Rockets=30720, Rockets=30720,
--UnguidedAny=805339120,
--GuidedMissile=268402688,
CruiseMissile=2097152, CruiseMissile=2097152,
--AntiShipMissile=65536,
TacticalNukes=666, TacticalNukes=666,
IlluminationShells=667,
SmokeShells=668,
} }
--- Database of common artillery unit properties. --- Database of common artillery unit properties.
@ -1440,6 +1449,22 @@ function ARTY:SetTacNukeWarhead(strength)
self.nukewarhead=self.nukewarhead*1000*1000 -- convert to kg TNT. self.nukewarhead=self.nukewarhead*1000*1000 -- convert to kg TNT.
end end
--- Set number of illumination shells available to the group.
-- Note that it can be max the number of normal shells. Also if all normal shells are empty, firing illumination shells is also not possible any more until group gets rearmed.
-- @param #ARTY self
-- @param #number n Number of warheads for the whole group.
function ARTY:SetIlluminationShells(n)
self.Nillu=n
end
--- Set number of smoke shells available to the group.
-- Note that it can be max the number of normal shells. Also if all normal shells are empty, firing smoke shells is also not possible any more until group gets rearmed.
-- @param #ARTY self
-- @param #number n Number of warheads for the whole group.
function ARTY:SetSmokeShells(n)
self.Nsmoke=n
end
--- Set nuclear fires and extra demolition explosions. --- Set nuclear fires and extra demolition explosions.
-- @param #ARTY self -- @param #ARTY self
-- @param #number nfires (Optional) Number of big smoke and fire objects created in the demolition zone. -- @param #number nfires (Optional) Number of big smoke and fire objects created in the demolition zone.
@ -1497,6 +1522,8 @@ function ARTY:onafterStart(Controllable, From, Event, To)
if self.nukefires==nil then if self.nukefires==nil then
self.nukefires=20/1000/1000*self.nukerange*self.nukerange self.nukefires=20/1000/1000*self.nukerange*self.nukerange
end end
-- Init nuclear shells.
if self.Nukes~=nil then if self.Nukes~=nil then
self.Nukes0=math.min(self.Nukes, self.Nshells0) self.Nukes0=math.min(self.Nukes, self.Nshells0)
else else
@ -1504,6 +1531,22 @@ function ARTY:onafterStart(Controllable, From, Event, To)
self.Nukes0=0 self.Nukes0=0
end end
-- Init illumination shells.
if self.Nillu~=nil then
self.Nillu0=math.min(self.Nillu, self.Nshells0)
else
self.Nillu=0
self.Nillu0=0
end
-- Init smoke shells.
if self.Nsmoke~=nil then
self.Nsmoke0=math.min(self.Nsmoke, self.Nshells0)
else
self.Nsmoke=0
self.Nsmoke0=0
end
-- Check if we have and arty type that is in the DB. -- Check if we have and arty type that is in the DB.
local _dbproperties=self:_CheckDB(self.DisplayName) local _dbproperties=self:_CheckDB(self.DisplayName)
self:T({dbproperties=_dbproperties}) self:T({dbproperties=_dbproperties})
@ -1561,6 +1604,8 @@ function ARTY:onafterStart(Controllable, From, Event, To)
text=text..string.format("Nuclear warhead = %d tons TNT\n", self.nukewarhead/1000) text=text..string.format("Nuclear warhead = %d tons TNT\n", self.nukewarhead/1000)
text=text..string.format("Nuclear demolition = %d m\n", self.nukerange) text=text..string.format("Nuclear demolition = %d m\n", self.nukerange)
text=text..string.format("Nuclear fires = %d (active=%s)\n", self.nukefires, tostring(self.nukefire)) text=text..string.format("Nuclear fires = %d (active=%s)\n", self.nukefires, tostring(self.nukefire))
text=text..string.format("Number of illum. = %d\n", self.Nillu0)
text=text..string.format("Number of smoke = %d\n", self.Nsmoke0)
if self.RearmingGroup or self.RearmingPlaceCoord then if self.RearmingGroup or self.RearmingPlaceCoord then
text=text..string.format("Rearming safe dist. = %d m\n", self.RearmingDistance) text=text..string.format("Rearming safe dist. = %d m\n", self.RearmingDistance)
end end
@ -1668,6 +1713,8 @@ function ARTY:_StatusReport(display)
-- Get Ammo. -- Get Ammo.
local Nammo, Nshells, Nrockets, Nmissiles=self:GetAmmo() local Nammo, Nshells, Nrockets, Nmissiles=self:GetAmmo()
local Nnukes=self.Nukes local Nnukes=self.Nukes
local Nillu=self.Nillu
local Nsmoke=self.Nsmoke
local Tnow=timer.getTime() local Tnow=timer.getTime()
local Clock=self:_SecondsToClock(timer.getAbsTime()) local Clock=self:_SecondsToClock(timer.getAbsTime())
@ -1681,6 +1728,8 @@ function ARTY:_StatusReport(display)
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)
text=text..string.format("Number of illum. = %d\n", Nillu)
text=text..string.format("Number of smoke = %d\n", Nsmoke)
if self.currentTarget then if self.currentTarget then
text=text..string.format("Current Target = %s\n", tostring(self.currentTarget.name)) text=text..string.format("Current Target = %s\n", tostring(self.currentTarget.name))
text=text..string.format("Curr. Tgt assigned = %d\n", Tnow-self.currentTarget.Tassigned) text=text..string.format("Curr. Tgt assigned = %d\n", Tnow-self.currentTarget.Tassigned)
@ -1747,10 +1796,16 @@ function ARTY:_OnEventShot(EventData)
-- Last known position of the weapon fired. -- Last known position of the weapon fired.
local _lastpos={x=0, y=0, z=0} local _lastpos={x=0, y=0, z=0}
--- Track the position of the weapon if it is supposed to model a tac nuke. --- Track the position of the weapon if it is supposed to model a tac nuke, illumination or smoke shell.
-- @param #table _weapon -- @param #table _weapon
local function _TrackWeapon(_weapon) local function _TrackWeapon(_weapon)
-- Coordinate of the target
local _targetcoord=self.currentTarget.coord -- Core.Point#COORDINATE
self.illuMinalt=400
self.illuMaxalt=1000
self.illuPower=1000
-- When the pcall status returns false the weapon has hit. -- When the pcall status returns false the weapon has hit.
local _status,_currpos = pcall( local _status,_currpos = pcall(
function() function()
@ -1758,31 +1813,94 @@ function ARTY:_OnEventShot(EventData)
end) end)
self:T(ARTY.id..string.format("ARTY %s: Weapon still in air: %s", self.groupname, tostring(_status))) self:T(ARTY.id..string.format("ARTY %s: Weapon still in air: %s", self.groupname, tostring(_status)))
local _destroyweapon=false
if _status then if _status then
-- Update last position. -- Update last position.
_lastpos={x=_currpos.x, y=_currpos.y, z=_currpos.z} _lastpos={x=_currpos.x, y=_currpos.y, z=_currpos.z}
--[[
-- Coordinate and distance to target.
local _coord=COORDINATE:NewFromVec3(_lastpos)
local _dist=_coord:Get2DDistance(self.currentTarget.coord)
env.info("FF dist = ".._dist)
if self.currentTarget.weapontype==ARTY.WeaponType.IlluminationShells then
-- Check if within distace.
if _dist<self.currentTarget.radius then
env.info("FF in range dist = ".._dist)
-- Get random coordinate within certain radius of the target.
local _cr=_targetcoord:GetRandomCoordinateInRadius(self.currentTarget.radius)
-- Get random altitude over target.
local _alt=_cr:GetLandHeight()+math.random(self.illuMinalt,self.illumMaxalt)
-- Adjust explosion height of coordinate.
local _ci=COORDINATE:New(_cr.x,_alt,_cr.z)
-- Create illumination flare.
_ci:IlluminationBomb(self.illuPower)
-- Destroy actual shell.
_destroyweapon=true
end
elseif self.currentTarget.weapontype==ARTY.WeaponType.SmokeShells then
if _dist<self.currentTarget.radius then
env.info("FF in range dist = ".._dist)
-- Get random coordinate within a certain radius.
local _cr=_coord:GetRandomCoordinateInRadius(self.currentTarget.radius)
-- Fire smoke at this coordinate.
_cr:SmokeRed()
-- Destroy actual shell.
_destroyweapon=true
end
end
if _destroyweapon then
-- Destroy weapon and stop timer.
_weapon:destroy()
--return nil
else
-- Check again in 0.05 seconds. -- Check again in 0.05 seconds.
--return timer.getTime() + self.dtBombtrack -- TODO: Make dt input parameter.
--return timer.getTime() + 0.05
end
]]
return timer.getTime() + 0.05 return timer.getTime() + 0.05
else else
local _impactcoord=COORDINATE:NewFromVec3(_lastpos) local _impactcoord=COORDINATE:NewFromVec3(_lastpos)
if self.currentTarget.weapontype==ARTY.WeaponType.TacticalNukes then
-- Create a "nuclear" explosion and blast at the impact point. -- Create a "nuclear" explosion and blast at the impact point.
SCHEDULER:New(nil, ARTY._NuclearBlast, {self,_impactcoord}, 1.0) SCHEDULER:New(nil, ARTY._NuclearBlast, {self,_impactcoord}, 1.0)
end
end end
end end
-- Start track the shell if we want to model a tactical nuke. -- Start track the shell if we want to model a tactical nuke.
if self.currentTarget.weapontype==ARTY.WeaponType.TacticalNukes and self.Nukes>0 then local _tracknuke = self.currentTarget.weapontype==ARTY.WeaponType.TacticalNukes and self.Nukes>0
self:T(ARTY.id..string.format("ARTY %s: Tracking of weapon starts in two seconds.", self.groupname)) local _trackillu = self.currentTarget.weapontype==ARTY.WeaponType.IlluminationShells and self.Nillu>0
timer.scheduleFunction(_TrackWeapon, EventData.weapon, timer.getTime() + 2.0) local _tracksmoke = self.currentTarget.weapontype==ARTY.WeaponType.SmokeShells and self.Nsmoke>0
if _tracknuke or _trackillu or _tracksmoke then
self:T(ARTY.id..string.format("ARTY %s: Tracking of weapon starts in one second.", self.groupname))
timer.scheduleFunction(_TrackWeapon, EventData.weapon, timer.getTime() + 1.0)
end end
-- Get current ammo. -- Get current ammo.
@ -1793,6 +1911,16 @@ function ARTY:_OnEventShot(EventData)
self.Nukes=self.Nukes-1 self.Nukes=self.Nukes-1
end end
-- Decrease available illuminatin shells because we just fired one.
if self.currentTarget.weapontype==ARTY.WeaponType.IlluminationShells then
self.Nillu=self.Nillu-1
end
-- Decrease available illuminatin shells because we just fired one.
if self.currentTarget.weapontype==ARTY.WeaponType.SmokeShells then
self.Nsmoke=self.Nsmoke-1
end
-- Check if we are completely out of ammo. -- Check if we are completely out of ammo.
local _outofammo=false local _outofammo=false
if _nammo==0 then if _nammo==0 then
@ -2463,6 +2591,12 @@ function ARTY:onafterOpenFire(Controllable, From, Event, To, target)
elseif target.weapontype==ARTY.WeaponType.TacticalNukes then elseif target.weapontype==ARTY.WeaponType.TacticalNukes then
nfire=self.Nukes nfire=self.Nukes
_type="nuclear shells" _type="nuclear shells"
elseif target.weapontype==ARTY.WeaponType.IlluminationShells then
nfire=self.Nillu
_type="illumination shells"
elseif target.weapontype==ARTY.WeaponType.SmokeShells then
nfire=self.Nsmoke
_type="smoke shells"
elseif target.weapontype==ARTY.WeaponType.Rockets then elseif target.weapontype==ARTY.WeaponType.Rockets then
nfire=Nrockets nfire=Nrockets
_type="rockets" _type="rockets"
@ -2704,6 +2838,8 @@ function ARTY:onafterRearmed(Controllable, From, Event, To)
-- "Rearm" tactical nukes as well. -- "Rearm" tactical nukes as well.
self.Nukes=self.Nukes0 self.Nukes=self.Nukes0
self.Nillu=self.Nillu0
self.Nsmoke=self.Nsmoke0
-- Route ARTY group back to where it came from (if distance is > 100 m). -- Route ARTY group back to where it came from (if distance is > 100 m).
local dist=self.Controllable:GetCoordinate():Get2DDistance(self.InitialCoord) local dist=self.Controllable:GetCoordinate():Get2DDistance(self.InitialCoord)
@ -2960,7 +3096,7 @@ function ARTY:_FireAtCoord(coord, radius, nshells, weapontype)
local group=self.Controllable --Wrapper.Group#GROUP local group=self.Controllable --Wrapper.Group#GROUP
-- Tactical nukes are actually cannon shells. -- Tactical nukes are actually cannon shells.
if weapontype==ARTY.WeaponType.TacticalNukes then if weapontype==ARTY.WeaponType.TacticalNukes or weapontype==ARTY.WeaponType.IlluminationShells or weapontype==ARTY.WeaponType.SmokeShells then
weapontype=ARTY.WeaponType.Cannon weapontype=ARTY.WeaponType.Cannon
end end
@ -3627,6 +3763,10 @@ function ARTY:_Markertext(text)
assignment.weapontype=ARTY.WeaponType.CruiseMissile assignment.weapontype=ARTY.WeaponType.CruiseMissile
elseif val:lower():find("nuke") then elseif val:lower():find("nuke") then
assignment.weapontype=ARTY.WeaponType.TacticalNukes assignment.weapontype=ARTY.WeaponType.TacticalNukes
elseif val:lower():find("illu") then
assignment.weapontype=ARTY.WeaponType.IlluminationShells
elseif val:lower():find("smoke") then
assignment.weapontype=ARTY.WeaponType.SmokeShells
else else
assignment.weapontype=ARTY.WeaponType.Auto assignment.weapontype=ARTY.WeaponType.Auto
end end
@ -4224,6 +4364,16 @@ function ARTY:_CheckOutOfAmmo(targets)
self:T(ARTY.id..string.format("Group %s, tactical nukes requested for target %s but nukes empty.", self.groupname, Target.name)) self:T(ARTY.id..string.format("Group %s, tactical nukes requested for target %s but nukes empty.", self.groupname, Target.name))
_partlyoutofammo=true _partlyoutofammo=true
elseif Target.weapontype==ARTY.WeaponType.IlluminationShells and self.Nillu<=0 then
self:T(ARTY.id..string.format("Group %s, illumination shells requested for target %s but illumination shells empty.", self.groupname, Target.name))
_partlyoutofammo=true
elseif Target.weapontype==ARTY.WeaponType.SmokeShells and self.Nsmoke<=0 then
self:T(ARTY.id..string.format("Group %s, smoke shells requested for target %s but smoke shells empty.", self.groupname, Target.name))
_partlyoutofammo=true
elseif Target.weapontype==ARTY.WeaponType.Rockets and _nrockets==0 then elseif Target.weapontype==ARTY.WeaponType.Rockets and _nrockets==0 then
self:T(ARTY.id..string.format("Group %s, rockets requested for target %s but rockets empty.", self.groupname, Target.name)) self:T(ARTY.id..string.format("Group %s, rockets requested for target %s but rockets empty.", self.groupname, Target.name))
@ -4258,6 +4408,10 @@ function ARTY:_CheckWeaponTypeAvailable(target)
nfire=Nshells nfire=Nshells
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
nfire=self.Nillu
elseif target.weapontype==ARTY.WeaponType.SmokeShells then
nfire=self.Nsmoke
elseif target.weapontype==ARTY.WeaponType.Rockets then elseif target.weapontype==ARTY.WeaponType.Rockets then
nfire=Nrockets nfire=Nrockets
elseif target.weapontype==ARTY.WeaponType.CruiseMissile then elseif target.weapontype==ARTY.WeaponType.CruiseMissile then
@ -4280,6 +4434,10 @@ function ARTY:_CheckWeaponTypePossible(target)
possible=self.Nshells0>0 possible=self.Nshells0>0
elseif target.weapontype==ARTY.WeaponType.TacticalNukes then elseif target.weapontype==ARTY.WeaponType.TacticalNukes then
possible=self.Nukes0>0 possible=self.Nukes0>0
elseif target.weapontype==ARTY.WeaponType.IlluminationShells then
possible=self.Nillus0>0
elseif target.weapontype==ARTY.WeaponType.SmokeShells then
possible=self.Nsmoke0>0
elseif target.weapontype==ARTY.WeaponType.Rockets then elseif target.weapontype==ARTY.WeaponType.Rockets then
possible=self.Nrockets0>0 possible=self.Nrockets0>0
elseif target.weapontype==ARTY.WeaponType.CruiseMissile then elseif target.weapontype==ARTY.WeaponType.CruiseMissile then
@ -4421,6 +4579,10 @@ function ARTY:_WeaponTypeName(tnumber)
name="Cruise Missiles" name="Cruise Missiles"
elseif tnumber==ARTY.WeaponType.TacticalNukes then elseif tnumber==ARTY.WeaponType.TacticalNukes then
name="Tactical Nukes" name="Tactical Nukes"
elseif tnumber==ARTY.WeaponType.IlluminationShells then
name="Illumination Shells"
elseif tnumber==ARTY.WeaponType.SmokeShells then
name="Smoke Shells"
end end
return name return name
end end