mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
* Create GROUP Templates out of the fly, so even when not in the mission.
* Added smoke Altitude and AngleOffset to ZONE_RADIUS for Smoke
This commit is contained in:
@@ -2,8 +2,19 @@
|
|||||||
--
|
--
|
||||||
-- ====
|
-- ====
|
||||||
--
|
--
|
||||||
-- 1) @{#DATABASE} class, extends @{Base#BASE}
|
-- ### Author: **Sven Van de Velde (FlightControl)**
|
||||||
-- ===================================================
|
-- ### Contributions:
|
||||||
|
--
|
||||||
|
-- ====
|
||||||
|
--
|
||||||
|
-- @module Database
|
||||||
|
|
||||||
|
|
||||||
|
--- @type DATABASE
|
||||||
|
-- @extends Core.Base#BASE
|
||||||
|
|
||||||
|
--- # DATABASE class, extends @{Base#BASE}
|
||||||
|
--
|
||||||
-- Mission designers can use the DATABASE class to refer to:
|
-- Mission designers can use the DATABASE class to refer to:
|
||||||
--
|
--
|
||||||
-- * STATICS
|
-- * STATICS
|
||||||
@@ -17,35 +28,10 @@
|
|||||||
--
|
--
|
||||||
-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Group TEMPLATES as defined within the Mission Editor.
|
-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Group TEMPLATES as defined within the Mission Editor.
|
||||||
--
|
--
|
||||||
-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE.
|
-- The singleton object **_DATABASE** is automatically created by MOOSE, that administers all objects within the mission.
|
||||||
-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required.
|
-- Moose refers to **_DATABASE** within the framework extensively, but you can also refer to the _DATABASE object within your missions if required.
|
||||||
--
|
--
|
||||||
-- 1.1) DATABASE iterators
|
-- @field #DATABASE
|
||||||
-- -----------------------
|
|
||||||
-- You can iterate the database with the available iterator methods.
|
|
||||||
-- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide.
|
|
||||||
-- The following iterator methods are currently available within the DATABASE:
|
|
||||||
--
|
|
||||||
-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE.
|
|
||||||
-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE.
|
|
||||||
-- * @{#DATABASE.ForEachPlayer}: Calls a function for each alive player it finds within the DATABASE.
|
|
||||||
-- * @{#DATABASE.ForEachPlayerJoined}: Calls a function for each joined player it finds within the DATABASE.
|
|
||||||
-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE.
|
|
||||||
-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE.
|
|
||||||
--
|
|
||||||
-- ===
|
|
||||||
--
|
|
||||||
--
|
|
||||||
-- ### Author: **Sven Van de Velde (FlightControl)**
|
|
||||||
-- ### Contributions:
|
|
||||||
--
|
|
||||||
-- ====
|
|
||||||
-- @module Database
|
|
||||||
|
|
||||||
|
|
||||||
--- DATABASE class
|
|
||||||
-- @type DATABASE
|
|
||||||
-- @extends Core.Base#BASE
|
|
||||||
DATABASE = {
|
DATABASE = {
|
||||||
ClassName = "DATABASE",
|
ClassName = "DATABASE",
|
||||||
Templates = {
|
Templates = {
|
||||||
@@ -418,10 +404,13 @@ end
|
|||||||
--- Private method that registers new Group Templates within the DATABASE Object.
|
--- Private method that registers new Group Templates within the DATABASE Object.
|
||||||
-- @param #DATABASE self
|
-- @param #DATABASE self
|
||||||
-- @param #table GroupTemplate
|
-- @param #table GroupTemplate
|
||||||
|
-- @param Dcs.DCScoalition#coalition.side CoalitionSide The coalition.side of the object.
|
||||||
|
-- @param Dcs.DCSObject#Object.Category CategoryID The Object.category of the object.
|
||||||
|
-- @param Dcs.DCScountry#country.id CountryID the country.id of the object
|
||||||
-- @return #DATABASE self
|
-- @return #DATABASE self
|
||||||
function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID, CountryID )
|
function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionSide, CategoryID, CountryID, GroupName )
|
||||||
|
|
||||||
local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name)
|
local GroupTemplateName = GroupName or env.getValueDictByKey( GroupTemplate.name )
|
||||||
|
|
||||||
local TraceTable = {}
|
local TraceTable = {}
|
||||||
|
|
||||||
@@ -436,7 +425,7 @@ function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID
|
|||||||
end
|
end
|
||||||
|
|
||||||
GroupTemplate.CategoryID = CategoryID
|
GroupTemplate.CategoryID = CategoryID
|
||||||
GroupTemplate.CoalitionID = CoalitionID
|
GroupTemplate.CoalitionID = CoalitionSide
|
||||||
GroupTemplate.CountryID = CountryID
|
GroupTemplate.CountryID = CountryID
|
||||||
|
|
||||||
self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName
|
self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName
|
||||||
@@ -445,7 +434,7 @@ function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID
|
|||||||
self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units
|
self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units
|
||||||
self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units
|
self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units
|
||||||
self.Templates.Groups[GroupTemplateName].CategoryID = CategoryID
|
self.Templates.Groups[GroupTemplateName].CategoryID = CategoryID
|
||||||
self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionID
|
self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionSide
|
||||||
self.Templates.Groups[GroupTemplateName].CountryID = CountryID
|
self.Templates.Groups[GroupTemplateName].CountryID = CountryID
|
||||||
|
|
||||||
|
|
||||||
@@ -472,13 +461,13 @@ function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID
|
|||||||
self.Templates.Units[UnitTemplate.name].GroupTemplate = GroupTemplate
|
self.Templates.Units[UnitTemplate.name].GroupTemplate = GroupTemplate
|
||||||
self.Templates.Units[UnitTemplate.name].GroupId = GroupTemplate.groupId
|
self.Templates.Units[UnitTemplate.name].GroupId = GroupTemplate.groupId
|
||||||
self.Templates.Units[UnitTemplate.name].CategoryID = CategoryID
|
self.Templates.Units[UnitTemplate.name].CategoryID = CategoryID
|
||||||
self.Templates.Units[UnitTemplate.name].CoalitionID = CoalitionID
|
self.Templates.Units[UnitTemplate.name].CoalitionID = CoalitionSide
|
||||||
self.Templates.Units[UnitTemplate.name].CountryID = CountryID
|
self.Templates.Units[UnitTemplate.name].CountryID = CountryID
|
||||||
|
|
||||||
if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then
|
if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then
|
||||||
self.Templates.ClientsByName[UnitTemplate.name] = UnitTemplate
|
self.Templates.ClientsByName[UnitTemplate.name] = UnitTemplate
|
||||||
self.Templates.ClientsByName[UnitTemplate.name].CategoryID = CategoryID
|
self.Templates.ClientsByName[UnitTemplate.name].CategoryID = CategoryID
|
||||||
self.Templates.ClientsByName[UnitTemplate.name].CoalitionID = CoalitionID
|
self.Templates.ClientsByName[UnitTemplate.name].CoalitionID = CoalitionSide
|
||||||
self.Templates.ClientsByName[UnitTemplate.name].CountryID = CountryID
|
self.Templates.ClientsByName[UnitTemplate.name].CountryID = CountryID
|
||||||
self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate
|
self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ function SPAWN:New( SpawnTemplatePrefix )
|
|||||||
local self = BASE:Inherit( self, BASE:New() ) -- #SPAWN
|
local self = BASE:Inherit( self, BASE:New() ) -- #SPAWN
|
||||||
self:F( { SpawnTemplatePrefix } )
|
self:F( { SpawnTemplatePrefix } )
|
||||||
|
|
||||||
local TemplateGroup = Group.getByName( SpawnTemplatePrefix )
|
local TemplateGroup = GROUP:FindByName( SpawnTemplatePrefix )
|
||||||
if TemplateGroup then
|
if TemplateGroup then
|
||||||
self.SpawnTemplatePrefix = SpawnTemplatePrefix
|
self.SpawnTemplatePrefix = SpawnTemplatePrefix
|
||||||
self.SpawnIndex = 0
|
self.SpawnIndex = 0
|
||||||
@@ -342,7 +342,7 @@ function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix )
|
|||||||
local self = BASE:Inherit( self, BASE:New() )
|
local self = BASE:Inherit( self, BASE:New() )
|
||||||
self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } )
|
self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } )
|
||||||
|
|
||||||
local TemplateGroup = Group.getByName( SpawnTemplatePrefix )
|
local TemplateGroup = GROUP:FindByName( SpawnTemplatePrefix )
|
||||||
if TemplateGroup then
|
if TemplateGroup then
|
||||||
self.SpawnTemplatePrefix = SpawnTemplatePrefix
|
self.SpawnTemplatePrefix = SpawnTemplatePrefix
|
||||||
self.SpawnAliasPrefix = SpawnAliasPrefix
|
self.SpawnAliasPrefix = SpawnAliasPrefix
|
||||||
@@ -1244,14 +1244,18 @@ function SPAWN:SpawnFromVec3( Vec3, SpawnIndex )
|
|||||||
local TY = Vec3.z + ( SY - BY )
|
local TY = Vec3.z + ( SY - BY )
|
||||||
SpawnTemplate.units[UnitID].x = TX
|
SpawnTemplate.units[UnitID].x = TX
|
||||||
SpawnTemplate.units[UnitID].y = TY
|
SpawnTemplate.units[UnitID].y = TY
|
||||||
SpawnTemplate.units[UnitID].alt = Vec3.y
|
if SpawnTemplate.CategoryID ~= Group.Category.SHIP then
|
||||||
|
SpawnTemplate.units[UnitID].alt = Vec3.y
|
||||||
|
end
|
||||||
self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y )
|
self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y )
|
||||||
end
|
end
|
||||||
|
|
||||||
SpawnTemplate.route.points[1].x = Vec3.x
|
SpawnTemplate.route.points[1].x = Vec3.x
|
||||||
SpawnTemplate.route.points[1].y = Vec3.z
|
SpawnTemplate.route.points[1].y = Vec3.z
|
||||||
SpawnTemplate.route.points[1].alt = Vec3.y
|
if SpawnTemplate.CategoryID ~= Group.Category.SHIP then
|
||||||
|
SpawnTemplate.route.points[1].alt = Vec3.y
|
||||||
|
end
|
||||||
|
|
||||||
SpawnTemplate.x = Vec3.x
|
SpawnTemplate.x = Vec3.x
|
||||||
SpawnTemplate.y = Vec3.z
|
SpawnTemplate.y = Vec3.z
|
||||||
|
|
||||||
|
|||||||
@@ -458,12 +458,17 @@ end
|
|||||||
-- @param #ZONE_RADIUS self
|
-- @param #ZONE_RADIUS self
|
||||||
-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color.
|
-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color.
|
||||||
-- @param #number Points (optional) The amount of points in the circle.
|
-- @param #number Points (optional) The amount of points in the circle.
|
||||||
|
-- @param #number AddHeight (optional) The height to be added for the smoke.
|
||||||
|
-- @param #number AddOffSet (optional) The angle to be added for the smoking start position.
|
||||||
-- @return #ZONE_RADIUS self
|
-- @return #ZONE_RADIUS self
|
||||||
function ZONE_RADIUS:SmokeZone( SmokeColor, Points )
|
function ZONE_RADIUS:SmokeZone( SmokeColor, Points, AddHeight, AngleOffset )
|
||||||
self:F2( SmokeColor )
|
self:F2( SmokeColor )
|
||||||
|
|
||||||
local Point = {}
|
local Point = {}
|
||||||
local Vec2 = self:GetVec2()
|
local Vec2 = self:GetVec2()
|
||||||
|
|
||||||
|
AddHeight = AddHeight or 0
|
||||||
|
AngleOffset = AngleOffset or 0
|
||||||
|
|
||||||
Points = Points and Points or 360
|
Points = Points and Points or 360
|
||||||
|
|
||||||
@@ -471,10 +476,10 @@ function ZONE_RADIUS:SmokeZone( SmokeColor, Points )
|
|||||||
local RadialBase = math.pi*2
|
local RadialBase = math.pi*2
|
||||||
|
|
||||||
for Angle = 0, 360, 360 / Points do
|
for Angle = 0, 360, 360 / Points do
|
||||||
local Radial = Angle * RadialBase / 360
|
local Radial = ( Angle + AngleOffset ) * RadialBase / 360
|
||||||
Point.x = Vec2.x + math.cos( Radial ) * self:GetRadius()
|
Point.x = Vec2.x + math.cos( Radial ) * self:GetRadius()
|
||||||
Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius()
|
Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius()
|
||||||
POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor )
|
POINT_VEC2:New( Point.x, Point.y, AddHeight ):Smoke( SmokeColor )
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -486,13 +491,16 @@ end
|
|||||||
-- @param Utilities.Utils#FLARECOLOR FlareColor The flare color.
|
-- @param Utilities.Utils#FLARECOLOR FlareColor The flare color.
|
||||||
-- @param #number Points (optional) The amount of points in the circle.
|
-- @param #number Points (optional) The amount of points in the circle.
|
||||||
-- @param Dcs.DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare.
|
-- @param Dcs.DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare.
|
||||||
|
-- @param #number AddHeight (optional) The height to be added for the smoke.
|
||||||
-- @return #ZONE_RADIUS self
|
-- @return #ZONE_RADIUS self
|
||||||
function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth )
|
function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth, AddHeight )
|
||||||
self:F2( { FlareColor, Azimuth } )
|
self:F2( { FlareColor, Azimuth } )
|
||||||
|
|
||||||
local Point = {}
|
local Point = {}
|
||||||
local Vec2 = self:GetVec2()
|
local Vec2 = self:GetVec2()
|
||||||
|
|
||||||
|
AddHeight = AddHeight or 0
|
||||||
|
|
||||||
Points = Points and Points or 360
|
Points = Points and Points or 360
|
||||||
|
|
||||||
local Angle
|
local Angle
|
||||||
@@ -502,7 +510,7 @@ function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth )
|
|||||||
local Radial = Angle * RadialBase / 360
|
local Radial = Angle * RadialBase / 360
|
||||||
Point.x = Vec2.x + math.cos( Radial ) * self:GetRadius()
|
Point.x = Vec2.x + math.cos( Radial ) * self:GetRadius()
|
||||||
Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius()
|
Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius()
|
||||||
POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth )
|
POINT_VEC2:New( Point.x, Point.y, AddHeight ):Flare( FlareColor, Azimuth )
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|||||||
@@ -110,9 +110,33 @@ GROUPTEMPLATE.Takeoff = {
|
|||||||
[GROUP.Takeoff.Cold] = { "TakeOffParking", "From Parking Area" }
|
[GROUP.Takeoff.Cold] = { "TakeOffParking", "From Parking Area" }
|
||||||
}
|
}
|
||||||
|
|
||||||
--- Create a new GROUP from a DCSGroup
|
--- Create a new GROUP from a given GroupTemplate as a parameter.
|
||||||
|
-- Note that the GroupTemplate is NOT spawned into the mission.
|
||||||
|
-- It is merely added to the @{Database}.
|
||||||
-- @param #GROUP self
|
-- @param #GROUP self
|
||||||
-- @param Dcs.DCSWrapper.Group#Group GroupName The DCS Group name
|
-- @param #table GroupTemplate The GroupTemplate Structure exactly as defined within the mission editor.
|
||||||
|
-- @param Dcs.DCScoalition#coalition.side CoalitionSide The coalition.side of the group.
|
||||||
|
-- @param Dcs.DCSGroup#Group.Category CategoryID The Group.Category of the group.
|
||||||
|
-- @param Dcs.DCScountry#country.id CountryID the country.id of the group.
|
||||||
|
-- @return #GROUP self
|
||||||
|
function GROUP:NewTemplate( GroupTemplate, CoalitionSide, CategoryID, CountryID )
|
||||||
|
local GroupName = GroupTemplate.name
|
||||||
|
_DATABASE:_RegisterGroupTemplate( GroupTemplate, CategoryID, CountryID, CoalitionSide, GroupName )
|
||||||
|
self = BASE:Inherit( self, CONTROLLABLE:New( GroupName ) )
|
||||||
|
self:F2( GroupName )
|
||||||
|
self.GroupName = GroupName
|
||||||
|
|
||||||
|
_DATABASE:AddGroup( GroupName )
|
||||||
|
|
||||||
|
self:SetEventPriority( 4 )
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--- Create a new GROUP from an existing Group in the Mission.
|
||||||
|
-- @param #GROUP self
|
||||||
|
-- @param #string GroupName The Group name
|
||||||
-- @return #GROUP self
|
-- @return #GROUP self
|
||||||
function GROUP:Register( GroupName )
|
function GROUP:Register( GroupName )
|
||||||
self = BASE:Inherit( self, CONTROLLABLE:New( GroupName ) )
|
self = BASE:Inherit( self, CONTROLLABLE:New( GroupName ) )
|
||||||
|
|||||||
Reference in New Issue
Block a user