Merge remote-tracking branch 'origin/master' into branch

This commit is contained in:
Applevangelist
2025-01-24 12:26:30 +01:00
4 changed files with 154 additions and 60 deletions

View File

@@ -1415,7 +1415,7 @@ function ZONE_RADIUS:SearchZone( EvaluateFunction, ObjectCategories )
id = world.VolumeType.SPHERE, id = world.VolumeType.SPHERE,
params = { params = {
point = ZoneCoord:GetVec3(), point = ZoneCoord:GetVec3(),
radius = ZoneRadius / 2, radius = ZoneRadius,
} }
} }

View File

@@ -619,63 +619,148 @@ ARTY.WeaponType={
} }
--- Database of common artillery unit properties. --- Database of common artillery unit properties.
-- @type ARTY.dbitem
-- @field #string displayname Name displayed in ME.
-- @field #number minrange Minimum firing range in meters.
-- @field #number maxrange Maximum firing range in meters.
-- @field #number reloadtime Reload time in seconds.
--- Database of common artillery unit properties.
-- Table key is the "type name" and table value is and `ARTY.dbitem`.
-- @type ARTY.db -- @type ARTY.db
ARTY.db={ ARTY.db={
["2B11 mortar"] = { -- type "2B11 mortar" ["LeFH_18-40-105"] = {
minrange = 500, -- correct? displayname = "FH LeFH-18 105mm", -- name displayed in the ME
maxrange = 7000, -- 7 km minrange = 500, -- min range (green circle) in meters
reloadtime = 30, -- 30 sec maxrange = 10500, -- max range (red circle) in meters
reloadtime = nil, -- reload time in seconds
}, },
["SPH 2S1 Gvozdika"] = { -- type "SAU Gvozdika" ["M2A1-105"] = {
minrange = 300, -- correct? displayname = "FH M2A1 105mm",
maxrange = 15000, -- 15 km minrange = 500,
reloadtime = nil, -- unknown maxrange = 11500,
reloadtime = nil,
}, },
["SPH 2S19 Msta"] = { --type "SAU Msta", alias "2S19 Msta" ["Pak40"] = {
minrange = 300, -- correct? displayname = "FH Pak 40 75mm",
maxrange = 23500, -- 23.5 km minrange = 500,
reloadtime = nil, -- unknown maxrange = 3000,
reloadtime = nil,
},
["L118_Unit"] = {
displayname = "L118 Light Artillery Gun",
minrange = 500,
maxrange = 17500,
reloadtime = nil,
}, },
["SPH 2S3 Akatsia"] = { -- type "SAU Akatsia", alias "2S3 Akatsia" ["Smerch"] = {
minrange = 300, -- correct? displayname = "MLRS 9A52 Smerch CM 300mm",
maxrange = 17000, -- 17 km minrange = 20000,
reloadtime = nil, -- unknown maxrange = 70000,
reloadtime = 2160,
}, },
["SPH 2S9 Nona"] = { --type "SAU 2-C9" ["Smerch_HE"] = {
minrange = 500, -- correct? displayname = "MLRS 9A52 Smerch HE 300mm",
maxrange = 7000, -- 7 km minrange = 20000,
reloadtime = nil, -- unknown maxrange = 70000,
reloadtime = 2160,
}, },
["SPH M109 Paladin"] = { -- type "M-109", alias "M109" ["Uragan_BM-27"] = {
minrange = 300, -- correct? displayname = "MLRS 9K57 Uragan BM-27 220mm",
maxrange = 22000, -- 22 km minrange = 11500,
reloadtime = nil, -- unknown maxrange = 35800,
reloadtime = 840,
}, },
["SpGH Dana"] = { -- type "SpGH_Dana" ["Grad-URAL"] = {
minrange = 300, -- correct? displayname = "MLRS BM-21 Grad 122mm",
maxrange = 18700, -- 18.7 km minrange = 5000,
reloadtime = nil, -- unknown maxrange = 19000,
reloadtime = 420,
}, },
["MLRS BM-21 Grad"] = { --type "Grad-URAL", alias "MLRS BM-21 Grad" ["HL_B8M1"] = {
minrange = 5000, -- 5 km displayname = "MLRS HL with B8M1 80mm",
maxrange = 19000, -- 19 km minrange = 500,
reloadtime = 420, -- 7 min maxrange = 5000,
reloadtime = nil,
}, },
["MLRS 9K57 Uragan BM-27"] = { -- type "Uragan_BM-27" ["tt_B8M1"] = {
minrange = 11500, -- 11.5 km displayname = "MLRS LC with B8M1 80mm",
maxrange = 35800, -- 35.8 km minrange = 500,
reloadtime = 840, -- 14 min maxrange = 5000,
reloadtime = nil,
}, },
["MLRS 9A52 Smerch"] = { -- type "Smerch" ["MLRS"] = {
minrange = 20000, -- 20 km displayname = "MLRS M270 227mm",
maxrange = 70000, -- 70 km minrange = 10000,
reloadtime = 2160, -- 36 min maxrange = 32000,
reloadtime = 540,
}, },
["MLRS M270"] = { --type "MRLS", alias "M270 MRLS" ["2B11 mortar"] = {
minrange = 10000, -- 10 km displayname = "Mortar 2B11 120mm",
maxrange = 32000, -- 32 km minrange = 500,
reloadtime = 540, -- 9 min maxrange = 7000,
reloadtime = 30,
}, },
["PLZ05"] = {
displayname = "PLZ-05",
minrange = 500,
maxrange = 23500,
reloadtime = nil,
},
["SAU Gvozdika"] = {
displayname = "SPH 2S1 Gvozdika 122mm",
minrange = 300,
maxrange = 15000,
reloadtime = nil,
},
["SAU Msta"] = {
displayname = "SPH 2S19 Msta 152mm",
minrange = 300,
maxrange = 23500,
reloadtime = nil,
},
["SAU Akatsia"] = {
displayname = "SPH 2S3 Akatsia 152mm",
minrange = 300,
maxrange = 17000,
reloadtime = nil,
},
["SpGH_Dana"] = {
displayname = "SPH Dana vz77 152mm",
minrange = 300,
maxrange = 18700,
reloadtime = nil,
},
["M-109"] = {
displayname = "SPH M109 Paladin 155mm",
minrange = 300,
maxrange = 22000,
reloadtime = nil,
},
["M12_GMC"] = {
displayname = "SPH M12 GMC 155mm",
minrange = 300,
maxrange = 18200,
reloadtime = nil,
},
["Wespe124"] = {
displayname = "SPH Sd.Kfz.124 Wespe 105mm",
minrange = 300,
maxrange = 7000,
reloadtime = nil,
},
["T155_Firtina"] = {
displayname = "SPH T155 Firtina 155mm",
minrange = 300,
maxrange = 41000,
reloadtime = nil,
},
["SAU 2-C9"] = {
displayname = "SPM 2S9 Nona 120mm M",
minrange = 500,
maxrange = 7000,
reloadtime = nil,
},
} }
--- Target. --- Target.
@@ -695,7 +780,7 @@ ARTY.db={
--- Arty script version. --- Arty script version.
-- @field #string version -- @field #string version
ARTY.version="1.3.2" ARTY.version="1.3.3"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -797,8 +882,8 @@ function ARTY:New(group, alias)
-- Maximum speed in km/h. -- Maximum speed in km/h.
self.SpeedMax=group:GetSpeedMax() self.SpeedMax=group:GetSpeedMax()
-- Group is mobile or not (e.g. mortars). -- Group is mobile or not (e.g. mortars). Some immobile units have a speed of 1 m/s = 3.6 km/h. So we check this number.
if self.SpeedMax>1 then if self.SpeedMax>3.6 then
self.ismobile=true self.ismobile=true
else else
self.ismobile=false self.ismobile=false
@@ -1923,7 +2008,7 @@ function ARTY:onafterStart(Controllable, From, Event, To)
end 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.Type)
self:T({dbproperties=_dbproperties}) self:T({dbproperties=_dbproperties})
if _dbproperties~=nil then if _dbproperties~=nil then
for property,value in pairs(_dbproperties) do for property,value in pairs(_dbproperties) do
@@ -1969,8 +2054,8 @@ function ARTY:onafterStart(Controllable, From, Event, To)
text=text..string.format("Type = %s\n", self.Type) text=text..string.format("Type = %s\n", self.Type)
text=text..string.format("Display Name = %s\n", self.DisplayName) text=text..string.format("Display Name = %s\n", self.DisplayName)
text=text..string.format("Number of units = %d\n", self.IniGroupStrength) text=text..string.format("Number of units = %d\n", self.IniGroupStrength)
text=text..string.format("Speed max = %d km/h\n", self.SpeedMax) text=text..string.format("Speed max = %.1f km/h\n", self.SpeedMax)
text=text..string.format("Speed default = %d km/h\n", self.Speed) text=text..string.format("Speed default = %.1f km/h\n", self.Speed)
text=text..string.format("Is mobile = %s\n", tostring(self.ismobile)) text=text..string.format("Is mobile = %s\n", tostring(self.ismobile))
text=text..string.format("Is cargo = %s\n", tostring(self.iscargo)) text=text..string.format("Is cargo = %s\n", tostring(self.iscargo))
text=text..string.format("Min range = %.1f km\n", self.minrange/1000) text=text..string.format("Min range = %.1f km\n", self.minrange/1000)

View File

@@ -1060,7 +1060,7 @@ function FOX:onafterMissileLaunch(From, Event, To, missile)
-- Tracking info and init of last bomb position. -- Tracking info and init of last bomb position.
local text=string.format("FOX: Tracking missile %s(%s) - target %s - shooter %s", missile.missileType, missile.missileName, tostring(missile.targetName), missile.shooterName) local text=string.format("FOX: Tracking missile %s(%s) - target %s - shooter %s", missile.missileType, missile.missileName, tostring(missile.targetName), missile.shooterName)
self:I(FOX.lid..text) self:T(FOX.lid..text)
MESSAGE:New(text, 10):ToAllIf(self.Debug) MESSAGE:New(text, 10):ToAllIf(self.Debug)
-- Loop over players. -- Loop over players.

View File

@@ -48,8 +48,8 @@ function SCENERY:Register( SceneryName, SceneryObject )
self.SceneryObject = SceneryObject self.SceneryObject = SceneryObject
if self.SceneryObject then if self.SceneryObject and self.SceneryObject.getLife then -- fix some objects do not have all functions
self.Life0 = self.SceneryObject:getLife() self.Life0 = self.SceneryObject:getLife() or 0
else else
self.Life0 = 0 self.Life0 = 0
end end
@@ -59,7 +59,7 @@ function SCENERY:Register( SceneryName, SceneryObject )
return self return self
end end
--- Returns the Value of the zone with the given PropertyName, or nil if no matching property exists. --- Returns the value of the scenery with the given PropertyName, or nil if no matching property exists.
-- @param #SCENERY self -- @param #SCENERY self
-- @param #string PropertyName The name of a the QuadZone Property from the scenery assignment to be retrieved. -- @param #string PropertyName The name of a the QuadZone Property from the scenery assignment to be retrieved.
-- @return #string The Value of the QuadZone Property from the scenery assignment with the given PropertyName, or nil if absent. -- @return #string The Value of the QuadZone Property from the scenery assignment with the given PropertyName, or nil if absent.
@@ -67,6 +67,14 @@ function SCENERY:GetProperty(PropertyName)
return self.Properties[PropertyName] return self.Properties[PropertyName]
end end
--- Checks if the value of the scenery with the given PropertyName exists.
-- @param #SCENERY self
-- @param #string PropertyName The name of a the QuadZone Property from the scenery assignment to be retrieved.
-- @return #boolean Outcome True if it exists, else false.
function SCENERY:HasProperty(PropertyName)
return self.Properties[PropertyName] ~= nil and true or false
end
--- Returns the scenery Properties table. --- Returns the scenery Properties table.
-- @param #SCENERY self -- @param #SCENERY self
-- @return #table The Key:Value table of QuadZone properties of the zone from the scenery assignment . -- @return #table The Key:Value table of QuadZone properties of the zone from the scenery assignment .
@@ -97,7 +105,7 @@ function SCENERY:GetDCSObject()
return self.SceneryObject return self.SceneryObject
end end
--- Get current life points from the SCENERY Object. --- Get current life points from the SCENERY Object. Note - Some scenery objects always have 0 life points.
-- **CAVEAT**: Some objects change their life value or "hitpoints" **after** the first hit. Hence we will adjust the life0 value to 120% -- **CAVEAT**: Some objects change their life value or "hitpoints" **after** the first hit. Hence we will adjust the life0 value to 120%
-- of the last life value if life exceeds life0 (initial life) at any point. Thus will will get a smooth percentage decrease, if you use this e.g. as success -- of the last life value if life exceeds life0 (initial life) at any point. Thus will will get a smooth percentage decrease, if you use this e.g. as success
-- criteria for a bombing task. -- criteria for a bombing task.
@@ -105,7 +113,7 @@ end
--@return #number life --@return #number life
function SCENERY:GetLife() function SCENERY:GetLife()
local life = 0 local life = 0
if self.SceneryObject then if self.SceneryObject and self.SceneryObject.getLife then
life = self.SceneryObject:getLife() life = self.SceneryObject:getLife()
if life > self.Life0 then if life > self.Life0 then
self.Life0 = math.floor(life * 1.2) self.Life0 = math.floor(life * 1.2)
@@ -121,7 +129,7 @@ function SCENERY:GetLife0()
return self.Life0 or 0 return self.Life0 or 0
end end
--- Check if SCENERY Object is alive. --- Check if SCENERY Object is alive. Note - Some scenery objects always have 0 life points.
--@param #SCENERY self --@param #SCENERY self
--@param #number Threshold (Optional) If given, SCENERY counts as alive above this relative life in percent (1..100). --@param #number Threshold (Optional) If given, SCENERY counts as alive above this relative life in percent (1..100).
--@return #number life --@return #number life
@@ -133,7 +141,7 @@ function SCENERY:IsAlive(Threshold)
end end
end end
--- Check if SCENERY Object is dead. --- Check if SCENERY Object is dead. Note - Some scenery objects always have 0 life points.
--@param #SCENERY self --@param #SCENERY self
--@param #number Threshold (Optional) If given, SCENERY counts as dead below this relative life in percent (1..100). --@param #number Threshold (Optional) If given, SCENERY counts as dead below this relative life in percent (1..100).
--@return #number life --@return #number life
@@ -145,12 +153,13 @@ function SCENERY:IsDead(Threshold)
end end
end end
--- Get SCENERY relative life in percent, e.g. 75. --- Get SCENERY relative life in percent, e.g. 75. Note - Some scenery objects always have 0 life points.
--@param #SCENERY self --@param #SCENERY self
--@return #number rlife --@return #number rlife
function SCENERY:GetRelativeLife() function SCENERY:GetRelativeLife()
local life = self:GetLife() local life = self:GetLife()
local life0 = self:GetLife0() local life0 = self:GetLife0()
if life == 0 or life0 == 0 then return 0 end
local rlife = math.floor((life/life0)*100) local rlife = math.floor((life/life0)*100)
return rlife return rlife
end end