diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index 68eaae970..729a5116d 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -1637,6 +1637,7 @@ do -- COORDINATE if AirbaseCategory == Airbase.Category.SHIP or AirbaseCategory == Airbase.Category.HELIPAD then RoutePoint.linkUnit = AirbaseID RoutePoint.helipadId = AirbaseID + RoutePoint.airdromeId = airbase:IsAirdrome() and AirbaseID or nil elseif AirbaseCategory == Airbase.Category.AIRDROME then RoutePoint.airdromeId = AirbaseID else diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index 5ee275fd5..f9134d6a5 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -89,11 +89,23 @@ do -- SET_BASE Index = {}, Database = nil, CallScheduler = nil, - + Filter = {}, + FilterCoalitionNumbers = { + [coalition.side.RED+1] = "red", + [coalition.side.BLUE+1] = "blue", + [coalition.side.NEUTRAL+1] = "neutral", + }, + FilterMeta = { + Coalitions = { + ["red"] = coalition.side.RED, + ["blue"] = coalition.side.BLUE, + ["neutral"] = coalition.side.NEUTRAL, + }, + }, } --- Filters - -- @type SET_BASE.Filters + -- @type SET_BASE.Filter -- @field #table Coalition Coalitions -- @field #table Prefix Prefixes. @@ -103,14 +115,14 @@ do -- SET_BASE -- @usage -- -- Define a new SET_BASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. -- DBObject = SET_BASE:New() - function SET_BASE:New( Database ) + function SET_BASE:New(Database) -- Inherits from BASE - local self = BASE:Inherit( self, FSM:New() ) -- Core.Set#SET_BASE + local self = BASE:Inherit(self, FSM:New()) -- Core.Set#SET_BASE self.Database = Database - self:SetStartState( "Started" ) + self:SetStartState("Started") --- Added Handler OnAfter for SET_BASE -- @function [parent=#SET_BASE] OnAfterAdded @@ -121,7 +133,7 @@ do -- SET_BASE -- @param #string ObjectName The name of the object. -- @param Object The object. - self:AddTransition( "*", "Added", "*" ) + self:AddTransition("*", "Added", "*") --- Removed Handler OnAfter for SET_BASE -- @function [parent=#SET_BASE] OnAfterRemoved @@ -132,7 +144,7 @@ do -- SET_BASE -- @param #string ObjectName The name of the object. -- @param Object The object. - self:AddTransition( "*", "Removed", "*" ) + self:AddTransition("*", "Removed", "*") self.YieldInterval = 10 self.TimeInterval = 0.001 @@ -140,9 +152,9 @@ do -- SET_BASE self.Set = {} self.Index = {} - self.CallScheduler = SCHEDULER:New( self ) + self.CallScheduler = SCHEDULER:New(self) - self:SetEventPriority( 2 ) + self:SetEventPriority(2) return self end @@ -191,18 +203,44 @@ do -- SET_BASE -- @return #SET_BASE self function SET_BASE:Clear(TriggerEvent) - for Name, Object in pairs( self.Set ) do - self:Remove( Name, not TriggerEvent ) + for Name, Object in pairs(self.Set) do + self:Remove(Name, not TriggerEvent) end return self end + + --- Builds a set of objects of same coalitions. + -- Possible current coalitions are red, blue and neutral. + -- @param #SET_BASE self + -- @param #string Coalitions Can take the following values: "red", "blue", "neutral" and coalition.side.RED, coalition.side.BLUE,coalition.side.NEUTRAL + -- @param #boolean Clear If `true`, clear any previously defined filters. + -- @return #SET_BASE self + function SET_BASE:FilterCoalitions(Coalitions, Clear) + + if Clear or (not self.Filter.Coalitions) then + self.Filter.Coalitions = {} + end + + -- Ensure table. + if type(Coalitions) ~= "table" then Coalitions = {Coalitions} end + for CoalitionID, Coalition in pairs(Coalitions) do + local coalition = Coalition + if type(Coalition) == "number" then + coalition = self.FilterCoalitionNumbers[Coalition+1] or "unknown" + --self:I("Filter Coaltion for "..coalition) + end + self.Filter.Coalitions[coalition] = coalition + end + + return self + end --- Finds an @{Core.Base#BASE} object based on the object Name. -- @param #SET_BASE self -- @param #string ObjectName -- @return Core.Base#BASE The Object found. - function SET_BASE:_Find( ObjectName ) + function SET_BASE:_Find(ObjectName) local ObjectFound = self.Set[ObjectName] return ObjectFound @@ -225,8 +263,8 @@ do -- SET_BASE local Names = {} - for Name, Object in pairs( self.Set ) do - table.insert( Names, Name ) + for Name, Object in pairs(self.Set) do + table.insert(Names, Name) end return Names @@ -240,8 +278,8 @@ do -- SET_BASE local Objects = {} - for Name, Object in pairs( self.Set ) do - table.insert( Objects, Object ) + for Name, Object in pairs(self.Set) do + table.insert(Objects, Object) end return Objects @@ -251,8 +289,8 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #string ObjectName -- @param #boolean NoTriggerEvent (Optional) When `true`, the :Remove() method will not trigger a **Removed** event. - function SET_BASE:Remove( ObjectName, NoTriggerEvent ) - --self:F2( { ObjectName = ObjectName } ) + function SET_BASE:Remove(ObjectName, NoTriggerEvent) + --self:F2({ ObjectName = ObjectName }) local TriggerEvent = true if NoTriggerEvent then @@ -265,9 +303,9 @@ do -- SET_BASE if Object then - for Index, Key in ipairs( self.Index ) do + for Index, Key in ipairs(self.Index) do if Key == ObjectName then - table.remove( self.Index, Index ) + table.remove(self.Index, Index) self.Set[ObjectName] = nil break end @@ -275,7 +313,7 @@ do -- SET_BASE -- When NoTriggerEvent is true, then no Removed event will be triggered. if TriggerEvent then - self:Removed( ObjectName, Object ) + self:Removed(ObjectName, Object) end end end @@ -285,10 +323,10 @@ do -- SET_BASE -- @param #string ObjectName The name of the object. -- @param Core.Base#BASE Object The object itself. -- @return Core.Base#BASE The added BASE Object. - function SET_BASE:Add( ObjectName, Object ) + function SET_BASE:Add(ObjectName, Object) -- Debug info. - --self:T2( { ObjectName = ObjectName, Object = Object } ) + --self:T2({ ObjectName = ObjectName, Object = Object }) -- Error ahndling if not ObjectName or ObjectName == "" then @@ -299,17 +337,17 @@ do -- SET_BASE -- Ensure that the existing element is removed from the Set before a new one is inserted to the Set if self.Set[ObjectName] then - self:Remove( ObjectName, true ) + self:Remove(ObjectName, true) end -- Add object to set. self.Set[ObjectName] = Object -- Add Object name to Index. - table.insert( self.Index, ObjectName ) + table.insert(self.Index, ObjectName) -- Trigger Added event. - self:Added( ObjectName, Object ) + self:Added(ObjectName, Object) return self end @@ -318,12 +356,12 @@ do -- SET_BASE -- @param #SET_BASE self -- @param Wrapper.Object#OBJECT Object -- @return Core.Base#BASE The added BASE Object. - function SET_BASE:AddObject( Object ) - --self:F2( Object.ObjectName ) + function SET_BASE:AddObject(Object) + --self:F2(Object.ObjectName) - --self:T( Object.UnitName ) - --self:T( Object.ObjectName ) - self:Add( Object.ObjectName, Object ) + --self:T(Object.UnitName) + --self:T(Object.ObjectName) + self:Add(Object.ObjectName, Object) end @@ -360,16 +398,16 @@ do -- SET_BASE -- @param #SET_BASE self -- @param Core.Set#SET_BASE SetB Set *B*. -- @return Core.Set#SET_BASE The union set, i.e. contains objects that are in set *A* **or** in set *B*. - function SET_BASE:GetSetUnion( SetB ) + function SET_BASE:GetSetUnion(SetB) local union = SET_BASE:New() - for _, ObjectA in pairs( self.Set ) do - union:AddObject( ObjectA ) + for _, ObjectA in pairs(self.Set) do + union:AddObject(ObjectA) end - for _, ObjectB in pairs( SetB.Set ) do - union:AddObject( ObjectB ) + for _, ObjectB in pairs(SetB.Set) do + union:AddObject(ObjectB) end return union @@ -398,7 +436,7 @@ do -- SET_BASE -- @param #SET_BASE self -- @param Core.Set#SET_BASE SetB Set other set, called *B*. -- @return Core.Set#SET_BASE The set of objects that are in set *B* but **not** in this set *A*. - function SET_BASE:GetSetComplement( SetB ) + function SET_BASE:GetSetComplement(SetB) local complement = self:GetSetUnion(SetB) local intersection = self:GetSetIntersection(SetB) @@ -415,11 +453,11 @@ do -- SET_BASE -- @param Core.Set#SET_BASE SetA First set. -- @param Core.Set#SET_BASE SetB Set to be merged into first set. -- @return Core.Set#SET_BASE The set of objects that are included in SetA and SetB. - function SET_BASE:CompareSets( SetA, SetB ) + function SET_BASE:CompareSets(SetA, SetB) - for _, ObjectB in pairs( SetB.Set ) do - if SetA:IsIncludeObject( ObjectB ) then - SetA:Add( ObjectB ) + for _, ObjectB in pairs(SetB.Set) do + if SetA:IsIncludeObject(ObjectB) then + SetA:Add(ObjectB) end end @@ -430,12 +468,12 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #string ObjectName -- @return Core.Base#BASE - function SET_BASE:Get( ObjectName ) - --self:F( ObjectName ) + function SET_BASE:Get(ObjectName) + --self:F(ObjectName) local Object = self.Set[ObjectName] - --self:T3( { ObjectName, Object } ) + --self:T3({ ObjectName, Object }) return Object end @@ -445,7 +483,7 @@ do -- SET_BASE function SET_BASE:GetFirst() local ObjectName = self.Index[1] local FirstObject = self.Set[ObjectName] - --self:T3( { FirstObject } ) + --self:T3({ FirstObject }) return FirstObject end @@ -456,7 +494,7 @@ do -- SET_BASE local tablemax = table.maxn(self.Index) local ObjectName = self.Index[tablemax] local LastObject = self.Set[ObjectName] - --self:T3( { LastObject } ) + --self:T3({ LastObject }) return LastObject end @@ -470,7 +508,7 @@ do -- SET_BASE end --local tablemax = table.maxn(self.Index) local RandomItem = self.Set[self.Index[math.random(1,tablemax)]] - --self:T3( { RandomItem } ) + --self:T3({ RandomItem }) return RandomItem end @@ -487,7 +525,7 @@ do -- SET_BASE --local tablemax = table.maxn(self.Index) --local RandomItem = self.Set[self.Index[math.random(1,tablemax)]] local RandomItem = sorted[math.random(1,tablemax)] - --self:T3( { RandomItem } ) + --self:T3({ RandomItem }) return RandomItem end @@ -502,10 +540,10 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #SET_BASE BaseSet -- @return #SET_BASE - function SET_BASE:SetDatabase( BaseSet ) + function SET_BASE:SetDatabase(BaseSet) -- Copy the filter criteria of the BaseSet - local OtherFilter = UTILS.DeepCopy( BaseSet.Filter ) + local OtherFilter = UTILS.DeepCopy(BaseSet.Filter) self.Filter = OtherFilter -- Now base the new Set on the BaseSet @@ -517,7 +555,7 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #number Limit Defines how many objects are evaluated of the set as part of the Some iterators. The default is 1. -- @return #SET_BASE self - function SET_BASE:SetSomeIteratorLimit( Limit ) + function SET_BASE:SetSomeIteratorLimit(Limit) self.SomeIteratorLimit = Limit or 1 @@ -554,10 +592,10 @@ do -- SET_BASE --self:Clear() - for ObjectName, Object in pairs( self.Database ) do + for ObjectName, Object in pairs(self.Database) do - if self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) + if self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) else self:Remove(ObjectName, true) end @@ -583,16 +621,16 @@ do -- SET_BASE -- @return #SET_BASE self function SET_BASE:_FilterStart() - for ObjectName, Object in pairs( self.Database ) do + for ObjectName, Object in pairs(self.Database) do - if self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) + if self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) end end -- Follow alive players and clients - -- self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) - -- self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit ) + -- self:HandleEvent(EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit) + -- self:HandleEvent(EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit) return self end @@ -602,7 +640,7 @@ do -- SET_BASE -- @return #SET_BASE self function SET_BASE:FilterDeads() -- R2.1 allow deads to be filtered to automatically handle deads in the collection. - self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) + self:HandleEvent(EVENTS.Dead, self._EventOnDeadOrCrash) return self end @@ -612,7 +650,7 @@ do -- SET_BASE -- @return #SET_BASE self function SET_BASE:FilterCrashes() -- R2.1 allow crashes to be filtered to automatically handle crashes in the collection. - self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) + self:HandleEvent(EVENTS.Crash, self._EventOnDeadOrCrash) return self end @@ -622,9 +660,9 @@ do -- SET_BASE -- @return #SET_BASE self function SET_BASE:FilterStop() - self:UnHandleEvent( EVENTS.Birth ) - self:UnHandleEvent( EVENTS.Dead ) - self:UnHandleEvent( EVENTS.Crash ) + self:UnHandleEvent(EVENTS.Birth) + self:UnHandleEvent(EVENTS.Dead) + self:UnHandleEvent(EVENTS.Crash) return self end @@ -634,19 +672,19 @@ do -- SET_BASE -- @param Core.Point#COORDINATE Coordinate A @{Core.Point#COORDINATE} object (but **not** a simple DCS#Vec2!) from where to evaluate the closest object in the set. -- @return Core.Base#BASE The closest object. -- @usage - -- myset:FindNearestObjectFromPointVec2( ZONE:New("Test Zone"):GetCoordinate() ) - function SET_BASE:FindNearestObjectFromPointVec2( Coordinate ) - --self:F2( Coordinate ) + -- myset:FindNearestObjectFromPointVec2(ZONE:New("Test Zone"):GetCoordinate()) + function SET_BASE:FindNearestObjectFromPointVec2(Coordinate) + --self:F2(Coordinate) local NearestObject = nil local ClosestDistance = nil - for ObjectID, ObjectData in pairs( self.Set ) do + for ObjectID, ObjectData in pairs(self.Set) do if NearestObject == nil then NearestObject = ObjectData - ClosestDistance = Coordinate:DistanceFromPointVec2( ObjectData:GetCoordinate() ) + ClosestDistance = Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) else - local Distance = Coordinate:DistanceFromPointVec2( ObjectData:GetCoordinate() ) + local Distance = Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) if Distance < ClosestDistance then NearestObject = ObjectData ClosestDistance = Distance @@ -662,15 +700,15 @@ do -- SET_BASE --- Handles the OnBirth event for the Set. -- @param #SET_BASE self -- @param Core.Event#EVENTDATA Event - function SET_BASE:_EventOnBirth( Event ) - --self:F3( { Event } ) + function SET_BASE:_EventOnBirth(Event) + --self:F3({ Event }) if Event.IniDCSUnit then - local ObjectName, Object = self:AddInDatabase( Event ) - --self:T3( ObjectName, Object ) - if Object and self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) - -- self:_EventOnPlayerEnterUnit( Event ) + local ObjectName, Object = self:AddInDatabase(Event) + --self:T3(ObjectName, Object) + if Object and self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) + -- self:_EventOnPlayerEnterUnit(Event) end end end @@ -678,13 +716,13 @@ do -- SET_BASE --- Handles the OnDead or OnCrash event for alive units set. -- @param #SET_BASE self -- @param Core.Event#EVENTDATA Event - function SET_BASE:_EventOnDeadOrCrash( Event ) - --self:F( { Event } ) + function SET_BASE:_EventOnDeadOrCrash(Event) + --self:F({ Event }) if Event.IniDCSUnit then - local ObjectName, Object = self:FindInDatabase( Event ) + local ObjectName, Object = self:FindInDatabase(Event) if ObjectName then - self:Remove( ObjectName ) + self:Remove(ObjectName) end end end @@ -692,15 +730,15 @@ do -- SET_BASE --- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). -- @param #SET_BASE self -- @param Core.Event#EVENTDATA Event - -- function SET_BASE:_EventOnPlayerEnterUnit( Event ) - -- --self:F3( { Event } ) + -- function SET_BASE:_EventOnPlayerEnterUnit(Event) + -- --self:F3({ Event }) -- -- if Event.IniDCSUnit then - -- local ObjectName, Object = self:AddInDatabase( Event ) - -- self:T3( ObjectName, Object ) - -- if self:IsIncludeObject( Object ) then - -- self:Add( ObjectName, Object ) - -- --self:_EventOnPlayerEnterUnit( Event ) + -- local ObjectName, Object = self:AddInDatabase(Event) + -- self:T3(ObjectName, Object) + -- if self:IsIncludeObject(Object) then + -- self:Add(ObjectName, Object) + -- --self:_EventOnPlayerEnterUnit(Event) -- end -- end -- end @@ -708,15 +746,15 @@ do -- SET_BASE --- Handles the OnPlayerLeaveUnit event to clean the active players table. -- @param #SET_BASE self -- @param Core.Event#EVENTDATA Event - -- function SET_BASE:_EventOnPlayerLeaveUnit( Event ) - -- --self:F3( { Event } ) + -- function SET_BASE:_EventOnPlayerLeaveUnit(Event) + -- --self:F3({ Event }) -- -- local ObjectName = Event.IniDCSUnit -- if Event.IniDCSUnit then -- if Event.IniDCSGroup then -- local GroupUnits = Event.IniDCSGroup:getUnits() -- local PlayerCount = 0 - -- for _, DCSUnit in pairs( GroupUnits ) do + -- for _, DCSUnit in pairs(GroupUnits) do -- if DCSUnit ~= Event.IniDCSUnit then -- if DCSUnit:getPlayerName() ~= nil then -- PlayerCount = PlayerCount + 1 @@ -725,7 +763,7 @@ do -- SET_BASE -- end -- self:E(PlayerCount) -- if PlayerCount == 0 then - -- self:Remove( Event.IniDCSGroupName ) + -- self:Remove(Event.IniDCSGroupName) -- end -- end -- end @@ -741,43 +779,43 @@ do -- SET_BASE -- @param #function Function (Optional) A function returning a #boolean true/false. Only if true, the IteratorFunction is called. -- @param #table FunctionArguments (Optional) Function arguments. -- @return #SET_BASE self - function SET_BASE:ForEach( IteratorFunction, arg, Set, Function, FunctionArguments ) - --self:F3( arg ) + function SET_BASE:ForEach(IteratorFunction, arg, Set, Function, FunctionArguments) + --self:F3(arg) Set = Set or self:GetSet() arg = arg or {} local function CoRoutine() local Count = 0 - for ObjectID, ObjectData in pairs( Set ) do + for ObjectID, ObjectData in pairs(Set) do local Object = ObjectData - --self:T3( Object ) + --self:T3(Object) if Function then - if Function( unpack( FunctionArguments or {} ), Object ) == true then - IteratorFunction( Object, unpack( arg ) ) + if Function(unpack(FunctionArguments or {}), Object) == true then + IteratorFunction(Object, unpack(arg)) end else - IteratorFunction( Object, unpack( arg ) ) + IteratorFunction(Object, unpack(arg)) end Count = Count + 1 -- if Count % self.YieldInterval == 0 then - -- coroutine.yield( false ) + -- coroutine.yield(false) -- end end return true end - -- local co = coroutine.create( CoRoutine ) + -- local co = coroutine.create(CoRoutine) local co = CoRoutine local function Schedule() - -- local status, res = coroutine.resume( co ) + -- local status, res = coroutine.resume(co) local status, res = co() - --self:T3( { status, res } ) + --self:T3({ status, res }) if status == false then - error( res ) + error(res) end if res == false then return true -- resume next time the loop @@ -786,7 +824,7 @@ do -- SET_BASE return false end - -- self.CallScheduler:Schedule( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) + -- self.CallScheduler:Schedule(self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0) Schedule() return self @@ -796,8 +834,8 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #function IteratorFunction The function that will be called. -- @return #SET_BASE self - function SET_BASE:ForSome( IteratorFunction, arg, Set, Function, FunctionArguments ) - --self:F3( arg ) + function SET_BASE:ForSome(IteratorFunction, arg, Set, Function, FunctionArguments) + --self:F3(arg) Set = Set or self:GetSet() arg = arg or {} @@ -806,38 +844,38 @@ do -- SET_BASE local function CoRoutine() local Count = 0 - for ObjectID, ObjectData in pairs( Set ) do + for ObjectID, ObjectData in pairs(Set) do local Object = ObjectData - --self:T3( Object ) + --self:T3(Object) if Function then - if Function( unpack( FunctionArguments ), Object ) == true then - IteratorFunction( Object, unpack( arg ) ) + if Function(unpack(FunctionArguments), Object) == true then + IteratorFunction(Object, unpack(arg)) end else - IteratorFunction( Object, unpack( arg ) ) + IteratorFunction(Object, unpack(arg)) end Count = Count + 1 if Count >= Limit then break end -- if Count % self.YieldInterval == 0 then - -- coroutine.yield( false ) + -- coroutine.yield(false) -- end end return true end - -- local co = coroutine.create( CoRoutine ) + -- local co = coroutine.create(CoRoutine) local co = CoRoutine local function Schedule() - -- local status, res = coroutine.resume( co ) + -- local status, res = coroutine.resume(co) local status, res = co() - --self:T3( { status, res } ) + --self:T3({ status, res }) if status == false then - error( res ) + error(res) end if res == false then return true -- resume next time the loop @@ -846,7 +884,7 @@ do -- SET_BASE return false end - -- self.CallScheduler:Schedule( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) + -- self.CallScheduler:Schedule(self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0) Schedule() return self @@ -857,10 +895,10 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter. ---- @return #SET_BASE self - -- function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... ) - -- --self:F3( arg ) + -- function SET_BASE:ForEachDCSUnitAlive(IteratorFunction, ...) + -- --self:F3(arg) -- - -- self:ForEach( IteratorFunction, arg, self.DCSUnitsAlive ) + -- self:ForEach(IteratorFunction, arg, self.DCSUnitsAlive) -- -- return self -- end @@ -869,10 +907,10 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter. ---- @return #SET_BASE self - -- function SET_BASE:ForEachPlayer( IteratorFunction, ... ) - -- --self:F3( arg ) + -- function SET_BASE:ForEachPlayer(IteratorFunction, ...) + -- --self:F3(arg) -- - -- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) + -- self:ForEach(IteratorFunction, arg, self.PlayersAlive) -- -- return self -- end @@ -882,10 +920,10 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter. ---- @return #SET_BASE self - -- function SET_BASE:ForEachClient( IteratorFunction, ... ) - -- --self:F3( arg ) + -- function SET_BASE:ForEachClient(IteratorFunction, ...) + -- --self:F3(arg) -- - -- self:ForEach( IteratorFunction, arg, self.Clients ) + -- self:ForEach(IteratorFunction, arg, self.Clients) -- -- return self -- end @@ -894,8 +932,8 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #table Object -- @return #SET_BASE self - function SET_BASE:IsIncludeObject( Object ) - --self:F3( Object ) + function SET_BASE:IsIncludeObject(Object) + --self:F3(Object) return true end @@ -904,8 +942,8 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #table Object -- @return #boolean `true` if object is in set and `false` otherwise. - function SET_BASE:IsInSet( Object ) - --self:F3( Object ) + function SET_BASE:IsInSet(Object) + --self:F3(Object) local outcome = false local name = Object:GetName() --self:I("SET_BASE: Objectname = "..name) @@ -916,7 +954,7 @@ do -- SET_BASE outcome = true end end - ) + ) return outcome end @@ -924,8 +962,8 @@ do -- SET_BASE -- @param #SET_BASE self -- @param #table Object -- @return #SET_BASE self - function SET_BASE:IsNotInSet( Object ) - --self:F3( Object ) + function SET_BASE:IsNotInSet(Object) + --self:F3(Object) return not self:IsInSet(Object) end @@ -936,7 +974,7 @@ do -- SET_BASE --self:F3() local ObjectNames = "" - for ObjectName, Object in pairs( self.Set ) do + for ObjectName, Object in pairs(self.Set) do ObjectNames = ObjectNames .. ObjectName .. ", " end @@ -947,14 +985,14 @@ do -- SET_BASE -- @param #SET_BASE self -- @param Core.Base#BASE MasterObject (Optional) The master object as a reference. -- @return #string A string with the names of the objects. - function SET_BASE:Flush( MasterObject ) + function SET_BASE:Flush(MasterObject) --self:F3() local ObjectNames = "" - for ObjectName, Object in pairs( self.Set ) do + for ObjectName, Object in pairs(self.Set) do ObjectNames = ObjectNames .. ObjectName .. ", " end - --self:F( { MasterObject = MasterObject and MasterObject:GetClassNameAndID(), "Objects in Set:", ObjectNames } ) + --self:F({ MasterObject = MasterObject and MasterObject:GetClassNameAndID(), "Objects in Set:", ObjectNames }) return ObjectNames end @@ -967,7 +1005,7 @@ do -- SET_BASE local AliveSet = {} -- Clean the Set before returning with only the alive Objects. - for ObjectName, Object in pairs( self.Set ) do + for ObjectName, Object in pairs(self.Set) do if Object then if Object:IsAlive() then AliveSet[#AliveSet+1] = Object @@ -1060,12 +1098,12 @@ do -- -- -- Create the SetCarrier SET_GROUP collection. -- - -- local SetHelicopter = SET_GROUP:New():FilterPrefixes( "Helicopter" ):FilterStart() + -- local SetHelicopter = SET_GROUP:New():FilterPrefixes("Helicopter"):FilterStart() -- -- -- Put a Dead event handler on SetCarrier, to ensure that when a carrier is destroyed, that all internal parameters are reset. -- - -- function SetHelicopter:OnAfterDead( From, Event, To, GroupObject ) - -- --self:F( { GroupObject = GroupObject:GetName() } ) + -- function SetHelicopter:OnAfterDead(From, Event, To, GroupObject) + -- --self:F({ GroupObject = GroupObject:GetName() }) -- end -- -- While this is a good example, there is a catch. @@ -1077,15 +1115,15 @@ do -- -- Within that constructor, we want to set an enclosed event handler OnAfterDead for SetHelicopter. -- -- But within the OnAfterDead method, we want to refer to the self variable of the AI_CARGO_DISPATCHER. -- - -- function AI_CARGO_DISPATCHER:New( SetCarrier, SetCargo, SetDeployZones ) + -- function AI_CARGO_DISPATCHER:New(SetCarrier, SetCargo, SetDeployZones) -- - -- local self = BASE:Inherit( self, FSM:New() ) -- #AI_CARGO_DISPATCHER + -- local self = BASE:Inherit(self, FSM:New()) -- #AI_CARGO_DISPATCHER -- -- -- Put a Dead event handler on SetCarrier, to ensure that when a carrier is destroyed, that all internal parameters are reset. -- -- Note the "." notation, and the explicit declaration of SetHelicopter, which would be using the ":" notation the implicit self variable declaration. -- - -- function SetHelicopter.OnAfterDead( SetHelicopter, From, Event, To, GroupObject ) - -- SetHelicopter:F( { GroupObject = GroupObject:GetName() } ) + -- function SetHelicopter.OnAfterDead(SetHelicopter, From, Event, To, GroupObject) + -- SetHelicopter:F({ GroupObject = GroupObject:GetName() }) -- self.PickupCargo[GroupObject] = nil -- So here I clear the PickupCargo table entry of the self object AI_CARGO_DISPATCHER. -- self.CarrierHome[GroupObject] = nil -- end @@ -1130,9 +1168,9 @@ do function SET_GROUP:New() -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.GROUPS ) ) -- #SET_GROUP + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.GROUPS)) -- #SET_GROUP - self:FilterActive( false ) + self:FilterActive(false) return self @@ -1153,7 +1191,7 @@ do --local AliveSet = SET_GROUP:New() local AliveSet = {} -- Clean the Set before returning with only the alive Groups. - for GroupName, GroupObject in pairs( self.Set ) do + for GroupName, GroupObject in pairs(self.Set) do local GroupObject = GroupObject -- Wrapper.Group#GROUP if GroupObject then if GroupObject:IsAlive() then @@ -1176,9 +1214,9 @@ do local ReportUnitTypes = REPORT:New() - for GroupID, GroupData in pairs( self:GetSet() ) do + for GroupID, GroupData in pairs(self:GetSet()) do local Units = GroupData:GetUnits() - for UnitID, UnitData in pairs( Units ) do + for UnitID, UnitData in pairs(Units) do if UnitData:IsAlive() then local UnitType = UnitData:GetTypeName() @@ -1191,8 +1229,8 @@ do end end - for UnitTypeID, UnitType in pairs( UnitTypes ) do - ReportUnitTypes:Add( UnitType .. " of " .. UnitTypeID ) + for UnitTypeID, UnitType in pairs(UnitTypes) do + ReportUnitTypes:Add(UnitType .. " of " .. UnitTypeID) end return ReportUnitTypes @@ -1204,14 +1242,14 @@ do -- @param Wrapper.Group#GROUP group The group which should be added to the set. -- @param #boolean DontSetCargoBayLimit If true, do not attempt to auto-add the cargo bay limit per unit in this group. -- @return Core.Set#SET_GROUP self - function SET_GROUP:AddGroup( group, DontSetCargoBayLimit ) + function SET_GROUP:AddGroup(group, DontSetCargoBayLimit) - self:Add( group:GetName(), group ) + self:Add(group:GetName(), group) if not DontSetCargoBayLimit then -- I set the default cargo bay weight limit each time a new group is added to the set. -- TODO Why is this here in the first place? - for UnitID, UnitData in pairs( group:GetUnits() or {} ) do + for UnitID, UnitData in pairs(group:GetUnits() or {}) do if UnitData and UnitData:IsAlive() then UnitData:SetCargoBayWeightLimit() end @@ -1225,12 +1263,12 @@ do -- @param Core.Set#SET_GROUP self -- @param #string AddGroupNames A single name or an array of GROUP names. -- @return Core.Set#SET_GROUP self - function SET_GROUP:AddGroupsByName( AddGroupNames ) + function SET_GROUP:AddGroupsByName(AddGroupNames) - local AddGroupNamesArray = (type( AddGroupNames ) == "table") and AddGroupNames or { AddGroupNames } + local AddGroupNamesArray = (type(AddGroupNames) == "table") and AddGroupNames or { AddGroupNames } - for AddGroupID, AddGroupName in pairs( AddGroupNamesArray ) do - self:Add( AddGroupName, GROUP:FindByName( AddGroupName ) ) + for AddGroupID, AddGroupName in pairs(AddGroupNamesArray) do + self:Add(AddGroupName, GROUP:FindByName(AddGroupName)) end return self @@ -1240,12 +1278,12 @@ do -- @param Core.Set#SET_GROUP self -- @param Wrapper.Group#GROUP RemoveGroupNames A single name or an array of GROUP names. -- @return Core.Set#SET_GROUP self - function SET_GROUP:RemoveGroupsByName( RemoveGroupNames ) + function SET_GROUP:RemoveGroupsByName(RemoveGroupNames) - local RemoveGroupNamesArray = (type( RemoveGroupNames ) == "table") and RemoveGroupNames or { RemoveGroupNames } + local RemoveGroupNamesArray = (type(RemoveGroupNames) == "table") and RemoveGroupNames or { RemoveGroupNames } - for RemoveGroupID, RemoveGroupName in pairs( RemoveGroupNamesArray ) do - self:Remove( RemoveGroupName ) + for RemoveGroupID, RemoveGroupName in pairs(RemoveGroupNamesArray) do + self:Remove(RemoveGroupName) end return self @@ -1255,7 +1293,7 @@ do -- @param #SET_GROUP self -- @param #string GroupName -- @return Wrapper.Group#GROUP The found Group. - function SET_GROUP:FindGroup( GroupName ) + function SET_GROUP:FindGroup(GroupName) local GroupFound = self.Set[GroupName] return GroupFound @@ -1265,20 +1303,20 @@ do -- @param #SET_GROUP self -- @param Core.Point#COORDINATE Coordinate A @{Core.Point#COORDINATE} object from where to evaluate the closest object in the set. -- @return Wrapper.Group#GROUP The closest group. - function SET_GROUP:FindNearestGroupFromPointVec2( Coordinate ) - --self:F2( Coordinate ) + function SET_GROUP:FindNearestGroupFromPointVec2(Coordinate) + --self:F2(Coordinate) local NearestGroup = nil -- Wrapper.Group#GROUP local ClosestDistance = nil local Set = self:GetAliveSet() - for ObjectID, ObjectData in pairs( Set ) do + for ObjectID, ObjectData in pairs(Set) do if NearestGroup == nil then NearestGroup = ObjectData - ClosestDistance = Coordinate:DistanceFromPointVec2( ObjectData:GetCoordinate() ) + ClosestDistance = Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) else - local Distance = Coordinate:DistanceFromPointVec2( ObjectData:GetCoordinate() ) + local Distance = Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) if Distance < ClosestDistance then NearestGroup = ObjectData ClosestDistance = Distance @@ -1294,7 +1332,7 @@ do -- @param #table Zones Table of Core.Zone#ZONE Zone objects, or a Core.Set#SET_ZONE -- @param #boolean Clear If `true`, clear any previously defined filters. -- @return #SET_GROUP self - function SET_GROUP:FilterZones( Zones, Clear ) + function SET_GROUP:FilterZones(Zones, Clear) if Clear or not self.Filter.Zones then self.Filter.Zones = {} @@ -1303,14 +1341,14 @@ do local zones = {} if Zones.ClassName and Zones.ClassName == "SET_ZONE" then zones = Zones.Set - elseif type( Zones ) ~= "table" or (type( Zones ) == "table" and Zones.ClassName) then - self:E( "***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!" ) + elseif type(Zones) ~= "table" or (type(Zones) == "table" and Zones.ClassName) then + self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") return self else zones = Zones end - for _, Zone in pairs( zones ) do + for _, Zone in pairs(zones) do local zonename = Zone:GetName() self.Filter.Zones[zonename] = Zone end @@ -1333,7 +1371,7 @@ do -- if grp:GetName() == "Exclude Me" then isinclude = false end -- return isinclude -- end - -- ):FilterOnce() + -- ):FilterOnce() -- BASE:I(groundset:Flush()) @@ -1343,21 +1381,6 @@ do -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @param #boolean Clear If `true`, clear any previously defined filters. -- @return #SET_GROUP self - function SET_GROUP:FilterCoalitions( Coalitions, Clear ) - - if Clear or (not self.Filter.Coalitions) then - self.Filter.Coalitions = {} - end - - -- Ensure table. - Coalitions = UTILS.EnsureTable(Coalitions, false) - - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - - return self - end --- Builds a set of groups out of categories. -- Possible current categories are plane, helicopter, ground, ship. @@ -1365,17 +1388,17 @@ do -- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". -- @param #boolean Clear If `true`, clear any previously defined filters. -- @return #SET_GROUP self - function SET_GROUP:FilterCategories( Categories, Clear ) + function SET_GROUP:FilterCategories(Categories, Clear) if Clear or not self.Filter.Categories then self.Filter.Categories = {} end - if type( Categories ) ~= "table" then + if type(Categories) ~= "table" then Categories = { Categories } end - for CategoryID, Category in pairs( Categories ) do + for CategoryID, Category in pairs(Categories) do self.Filter.Categories[Category] = Category end @@ -1386,7 +1409,7 @@ do -- @param #SET_GROUP self -- @return #SET_GROUP self function SET_GROUP:FilterCategoryGround() - self:FilterCategories( "ground" ) + self:FilterCategories("ground") return self end @@ -1394,7 +1417,7 @@ do -- @param #SET_GROUP self -- @return #SET_GROUP self function SET_GROUP:FilterCategoryAirplane() - self:FilterCategories( "plane" ) + self:FilterCategories("plane") return self end @@ -1402,7 +1425,7 @@ do -- @param #SET_GROUP self -- @return #SET_GROUP self function SET_GROUP:FilterCategoryHelicopter() - self:FilterCategories( "helicopter" ) + self:FilterCategories("helicopter") return self end @@ -1410,7 +1433,7 @@ do -- @param #SET_GROUP self -- @return #SET_GROUP self function SET_GROUP:FilterCategoryShip() - self:FilterCategories( "ship" ) + self:FilterCategories("ship") return self end @@ -1418,7 +1441,7 @@ do -- @param #SET_GROUP self -- @return #SET_GROUP self function SET_GROUP:FilterCategoryStructure() - self:FilterCategories( "structure" ) + self:FilterCategories("structure") return self end @@ -1427,14 +1450,14 @@ do -- @param #SET_GROUP self -- @param #string Countries Can take those country strings known within DCS world. -- @return #SET_GROUP self - function SET_GROUP:FilterCountries( Countries ) + function SET_GROUP:FilterCountries(Countries) if not self.Filter.Countries then self.Filter.Countries = {} end - if type( Countries ) ~= "table" then + if type(Countries) ~= "table" then Countries = { Countries } end - for CountryID, Country in pairs( Countries ) do + for CountryID, Country in pairs(Countries) do self.Filter.Countries[Country] = Country end return self @@ -1445,14 +1468,14 @@ do -- @param #SET_GROUP self -- @param #string Prefixes The string pattern(s) that needs to be contained in the group name. Can also be passed as a `#table` of strings. -- @return #SET_GROUP self - function SET_GROUP:FilterPrefixes( Prefixes ) + function SET_GROUP:FilterPrefixes(Prefixes) if not self.Filter.GroupPrefixes then self.Filter.GroupPrefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.GroupPrefixes[Prefix] = Prefix end return self @@ -1465,10 +1488,10 @@ do local Database = _DATABASE.GROUPS - for ObjectName, Object in pairs( Database ) do - if self:IsIncludeObject( Object ) and self:IsNotInSet(Object) then - self:Add( ObjectName, Object ) - elseif (not self:IsIncludeObject( Object )) and self:IsInSet(Object) then + for ObjectName, Object in pairs(Database) do + if self:IsIncludeObject(Object) and self:IsNotInSet(Object) then + self:Add(ObjectName, Object) + elseif (not self:IsIncludeObject(Object)) and self:IsInSet(Object) then self:Remove(ObjectName) end end @@ -1489,15 +1512,15 @@ do -- GroupSet = SET_GROUP:New():FilterActive():FilterStart() -- -- -- Include only active groups to the set of the blue coalition, and filter one time. - -- GroupSet = SET_GROUP:New():FilterActive():FilterCoalition( "blue" ):FilterOnce() + -- GroupSet = SET_GROUP:New():FilterActive():FilterCoalition("blue"):FilterOnce() -- -- -- Include only active groups to the set of the blue coalition, and filter one time. -- -- Later, reset to include back inactive groups to the set. - -- GroupSet = SET_GROUP:New():FilterActive():FilterCoalition( "blue" ):FilterOnce() + -- GroupSet = SET_GROUP:New():FilterActive():FilterCoalition("blue"):FilterOnce() -- ... logic ... - -- GroupSet = SET_GROUP:New():FilterActive( false ):FilterCoalition( "blue" ):FilterOnce() + -- GroupSet = SET_GROUP:New():FilterActive(false):FilterCoalition("blue"):FilterOnce() -- - function SET_GROUP:FilterActive( Active ) + function SET_GROUP:FilterActive(Active) Active = Active or not (Active == false) self.Filter.Active = Active return self @@ -1518,12 +1541,12 @@ do if _DATABASE then self:_FilterStart() - self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) - self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.RemoveUnit, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.UnitLost, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnDeadOrCrash ) + self:HandleEvent(EVENTS.Birth, self._EventOnBirth) + self:HandleEvent(EVENTS.Dead, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.Crash, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.RemoveUnit, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.UnitLost, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.PlayerLeaveUnit, self._EventOnDeadOrCrash) if self.Filter.Zones then self.ZoneTimer = TIMER:New(self._ContinousZoneFilter,self) local timing = self.ZoneTimerInterval or 30 @@ -1570,11 +1593,11 @@ do -- Note: The GROUP object in the SET_GROUP collection will only be removed if the last unit is destroyed of the GROUP. -- @param #SET_GROUP self -- @param Core.Event#EVENTDATA Event - function SET_GROUP:_EventOnDeadOrCrash( Event ) - --self:F( { Event } ) + function SET_GROUP:_EventOnDeadOrCrash(Event) + --self:F({ Event }) if Event.IniDCSUnit then - local ObjectName, Object = self:FindInDatabase( Event ) + local ObjectName, Object = self:FindInDatabase(Event) if ObjectName then local size = 1 if Event.IniDCSGroup then @@ -1588,7 +1611,7 @@ do size = Object:CountAliveUnits() end if size == 1 then -- Only remove if the last unit of the group was destroyed. - self:Remove( ObjectName ) + self:Remove(ObjectName) end end end @@ -1600,13 +1623,13 @@ do -- @param Core.Event#EVENTDATA Event -- @return #string The name of the GROUP -- @return #table The GROUP - function SET_GROUP:AddInDatabase( Event ) - --self:F3( { Event } ) + function SET_GROUP:AddInDatabase(Event) + --self:F3({ Event }) if Event.IniObjectCategory == Object.Category.UNIT then if not self.Database[Event.IniDCSGroupName] then - self.Database[Event.IniDCSGroupName] = GROUP:Register( Event.IniDCSGroupName ) - --self:T(3( self.Database[Event.IniDCSGroupName] ) + self.Database[Event.IniDCSGroupName] = GROUP:Register(Event.IniDCSGroupName) + --self:T(3(self.Database[Event.IniDCSGroupName]) end end @@ -1619,8 +1642,8 @@ do -- @param Core.Event#EVENTDATA Event -- @return #string The name of the GROUP -- @return #table The GROUP - function SET_GROUP:FindInDatabase( Event ) - --self:F3( { Event } ) + function SET_GROUP:FindInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] end @@ -1629,10 +1652,10 @@ do -- @param #SET_GROUP self -- @param #function IteratorFunction The function that will be called for all GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForEachGroup( IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForEachGroup(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -1641,10 +1664,10 @@ do -- @param #SET_GROUP self -- @param #function IteratorFunction The function that will be called for some GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForSomeGroup( IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForSomeGroup(IteratorFunction, ...) + --self:F2(arg) - self:ForSome( IteratorFunction, arg, self:GetSet() ) + self:ForSome(IteratorFunction, arg, self:GetSet()) return self end @@ -1653,10 +1676,10 @@ do -- @param #SET_GROUP self -- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForEachGroupAlive( IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForEachGroupAlive(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetAliveSet() ) + self:ForEach(IteratorFunction, arg, self:GetAliveSet()) return self end @@ -1665,10 +1688,10 @@ do -- @param #SET_GROUP self -- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForSomeGroupAlive( IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForSomeGroupAlive(IteratorFunction, ...) + --self:F2(arg) - self:ForSome( IteratorFunction, arg, self:GetAliveSet() ) + self:ForSome(IteratorFunction, arg, self:GetAliveSet()) return self end @@ -1694,19 +1717,19 @@ do -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForEachGroupCompletelyInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForEachGroupCompletelyInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsCompletelyInZone( ZoneObject ) then + function(ZoneObject, GroupObject) + if GroupObject:IsCompletelyInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -1716,19 +1739,19 @@ do -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForEachGroupPartlyInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForEachGroupPartlyInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsPartlyInZone( ZoneObject ) then + function(ZoneObject, GroupObject) + if GroupObject:IsPartlyInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -1738,19 +1761,19 @@ do -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForEachGroupNotInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsNotInZone( ZoneObject ) then + function(ZoneObject, GroupObject) + if GroupObject:IsNotInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -1769,11 +1792,11 @@ do -- else -- MESSAGE:New("Some or all SET's GROUP are outside zone !", 10):ToAll() -- end - function SET_GROUP:AllCompletelyInZone( Zone ) - --self:F2( Zone ) + function SET_GROUP:AllCompletelyInZone(Zone) + --self:F2(Zone) local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - if not GroupData:IsCompletelyInZone( Zone ) then + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if not GroupData:IsCompletelyInZone(Zone) then return false end end @@ -1785,19 +1808,19 @@ do -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. -- @return #SET_GROUP self - function SET_GROUP:ForEachGroupAnyInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_GROUP:ForEachGroupAnyInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsAnyInZone( ZoneObject ) then + function(ZoneObject, GroupObject) + if GroupObject:IsAnyInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -1816,11 +1839,11 @@ do -- else -- MESSAGE:New("No GROUP is completely in zone !", 10):ToAll() -- end - function SET_GROUP:AnyCompletelyInZone( Zone ) - --self:F2( Zone ) + function SET_GROUP:AnyCompletelyInZone(Zone) + --self:F2(Zone) local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - if GroupData:IsCompletelyInZone( Zone ) then + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsCompletelyInZone(Zone) then return true end end @@ -1841,11 +1864,11 @@ do -- else -- MESSAGE:New("No UNIT of any GROUP is in zone !", 10):ToAll() -- end - function SET_GROUP:AnyInZone( Zone ) - --self:F2( Zone ) + function SET_GROUP:AnyInZone(Zone) + --self:F2(Zone) local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - if GroupData:IsPartlyInZone( Zone ) or GroupData:IsCompletelyInZone( Zone ) then + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsPartlyInZone(Zone) or GroupData:IsCompletelyInZone(Zone) then return true end end @@ -1867,14 +1890,14 @@ do -- else -- MESSAGE:New("No GROUP are in zone, or one (or more) GROUP is completely in it !", 10):ToAll() -- end - function SET_GROUP:AnyPartlyInZone( Zone ) - --self:F2( Zone ) + function SET_GROUP:AnyPartlyInZone(Zone) + --self:F2(Zone) local IsPartlyInZone = false local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - if GroupData:IsCompletelyInZone( Zone ) then + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsCompletelyInZone(Zone) then return false - elseif GroupData:IsPartlyInZone( Zone ) then + elseif GroupData:IsPartlyInZone(Zone) then IsPartlyInZone = true -- at least one GROUP is partly in zone end end @@ -1902,11 +1925,11 @@ do -- else -- MESSAGE:New("No UNIT of any GROUP is in zone !", 10):ToAll() -- end - function SET_GROUP:NoneInZone( Zone ) - --self:F2( Zone ) + function SET_GROUP:NoneInZone(Zone) + --self:F2(Zone) local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - if not GroupData:IsNotInZone( Zone ) then -- If the GROUP is in Zone in any way + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if not GroupData:IsNotInZone(Zone) then -- If the GROUP is in Zone in any way return false end end @@ -1925,12 +1948,12 @@ do -- MySetGroup:AddGroupsByName({"Group1", "Group2"}) -- -- MESSAGE:New("There are " .. MySetGroup:CountInZone(MyZone) .. " GROUPs in the Zone !", 10):ToAll() - function SET_GROUP:CountInZone( Zone ) - --self:F2( Zone ) + function SET_GROUP:CountInZone(Zone) + --self:F2(Zone) local Count = 0 local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - if GroupData:IsCompletelyInZone( Zone ) then + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + if GroupData:IsCompletelyInZone(Zone) then Count = Count + 1 end end @@ -1947,12 +1970,12 @@ do -- MySetGroup:AddGroupsByName({"Group1", "Group2"}) -- -- MESSAGE:New("There are " .. MySetGroup:CountUnitInZone(MyZone) .. " UNITs in the Zone !", 10):ToAll() - function SET_GROUP:CountUnitInZone( Zone ) - --self:F2( Zone ) + function SET_GROUP:CountUnitInZone(Zone) + --self:F2(Zone) local Count = 0 local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - Count = Count + GroupData:CountInZone( Zone ) + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + Count = Count + GroupData:CountInZone(Zone) end return Count end @@ -1967,13 +1990,13 @@ do local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP if GroupData and GroupData:IsAlive() then CountG = CountG + 1 -- Count Units. - for _, _unit in pairs( GroupData:GetUnits() ) do + for _, _unit in pairs(GroupData:GetUnits()) do local unit = _unit -- Wrapper.Unit#UNIT if unit and unit:IsAlive() then CountU = CountU + 1 @@ -1990,10 +2013,10 @@ do -- @param #SET_GROUP self -- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter. ---- @return #SET_GROUP self - -- function SET_GROUP:ForEachPlayer( IteratorFunction, ... ) - -- --self:F2( arg ) + -- function SET_GROUP:ForEachPlayer(IteratorFunction, ...) + -- --self:F2(arg) -- - -- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) + -- self:ForEach(IteratorFunction, arg, self.PlayersAlive) -- -- return self -- end @@ -2003,10 +2026,10 @@ do -- @param #SET_GROUP self -- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter. ---- @return #SET_GROUP self - -- function SET_GROUP:ForEachClient( IteratorFunction, ... ) - -- --self:F2( arg ) + -- function SET_GROUP:ForEachClient(IteratorFunction, ...) + -- --self:F2(arg) -- - -- self:ForEach( IteratorFunction, arg, self.Clients ) + -- self:ForEach(IteratorFunction, arg, self.Clients) -- -- return self -- end @@ -2015,13 +2038,13 @@ do -- @param #SET_GROUP self -- @param Wrapper.Group#GROUP MGroup The group that is checked for inclusion. -- @return #SET_GROUP self - function SET_GROUP:IsIncludeObject( MGroup ) - --self:F2( MGroup ) + function SET_GROUP:IsIncludeObject(MGroup) + --self:F2(MGroup) local MGroupInclude = true if self.Filter.Alive == true then local MGroupAlive = false - --self:F( { Active = self.Filter.Active } ) + --self:F({ Active = self.Filter.Active }) if MGroup and MGroup:IsAlive() then MGroupAlive = true end @@ -2030,7 +2053,7 @@ do if self.Filter.Active ~= nil then local MGroupActive = false - --self:F( { Active = self.Filter.Active } ) + --self:F({ Active = self.Filter.Active }) if self.Filter.Active == false or (self.Filter.Active == true and MGroup:IsActive() == true) then MGroupActive = true end @@ -2039,8 +2062,8 @@ do if self.Filter.Coalitions and MGroupInclude then local MGroupCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - --self:T3( { "Coalition:", MGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do + --self:T3({ "Coalition:", MGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName }) if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MGroup:GetCoalition() then MGroupCoalition = true end @@ -2050,8 +2073,8 @@ do if self.Filter.Categories and MGroupInclude then local MGroupCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - --self:I( { "Category:", MGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName } ) + for CategoryID, CategoryName in pairs(self.Filter.Categories) do + --self:I({ "Category:", MGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MGroup:GetCategory() then MGroupCategory = true end @@ -2062,8 +2085,8 @@ do if self.Filter.Countries and MGroupInclude then local MGroupCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - --self:T3( { "Country:", MGroup:GetCountry(), CountryName } ) + for CountryID, CountryName in pairs(self.Filter.Countries) do + --self:T3({ "Country:", MGroup:GetCountry(), CountryName }) if country.id[CountryName] == MGroup:GetCountry() then MGroupCountry = true end @@ -2073,8 +2096,8 @@ do if self.Filter.GroupPrefixes and MGroupInclude then local MGroupPrefix = false - for GroupPrefixId, GroupPrefix in pairs( self.Filter.GroupPrefixes ) do - --self:I( { "Prefix:", MGroup:GetName(), GroupPrefix } ) + for GroupPrefixId, GroupPrefix in pairs(self.Filter.GroupPrefixes) do + --self:I({ "Prefix:", MGroup:GetName(), GroupPrefix }) if string.find(MGroup:GetName(), string.gsub(GroupPrefix,"-","%%-"),1) then MGroupPrefix = true end @@ -2085,8 +2108,8 @@ do if self.Filter.Zones and MGroupInclude then local MGroupZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T( "Zone:", ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T("Zone:", ZoneName) if MGroup:IsInZone(Zone) then MGroupZone = true end @@ -2100,7 +2123,7 @@ do MGroupInclude = MGroupInclude and MGroupFunc end - --self:I( MGroupInclude ) + --self:I(MGroupInclude) return MGroupInclude end @@ -2117,7 +2140,7 @@ do local dmin=math.huge local gmin=nil - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP local group=GroupData --Wrapper.Group#GROUP if group and group:IsAlive() and (Coalitions==nil or UTILS.IsAnyInTable(Coalitions, group:GetCoalition())) then @@ -2151,8 +2174,8 @@ do -- MySetGroup:SetCargoBayWeightLimit() function SET_GROUP:SetCargoBayWeightLimit() local Set = self:GetSet() - for GroupID, GroupData in pairs( Set ) do -- For each GROUP in SET_GROUP - for UnitName, UnitData in pairs( GroupData:GetUnits() ) do + for GroupID, GroupData in pairs(Set) do -- For each GROUP in SET_GROUP + for UnitName, UnitData in pairs(GroupData:GetUnits()) do -- local UnitData = UnitData -- Wrapper.Unit#UNIT UnitData:SetCargoBayWeightLimit() end @@ -2238,12 +2261,12 @@ do -- SET_UNIT -- -- -- Create the SetCarrier SET_UNIT collection. -- - -- local SetHelicopter = SET_UNIT:New():FilterPrefixes( "Helicopter" ):FilterStart() + -- local SetHelicopter = SET_UNIT:New():FilterPrefixes("Helicopter"):FilterStart() -- -- -- Put a Dead event handler on SetCarrier, to ensure that when a carrier unit is destroyed, that all internal parameters are reset. -- - -- function SetHelicopter:OnAfterDead( From, Event, To, UnitObject ) - -- --self:F( { UnitObject = UnitObject:GetName() } ) + -- function SetHelicopter:OnAfterDead(From, Event, To, UnitObject) + -- --self:F({ UnitObject = UnitObject:GetName() }) -- end -- -- While this is a good example, there is a catch. @@ -2255,15 +2278,15 @@ do -- SET_UNIT -- -- Within that constructor, we want to set an enclosed event handler OnAfterDead for SetHelicopter. -- -- But within the OnAfterDead method, we want to refer to the self variable of the AI_CARGO_DISPATCHER. -- - -- function ACLASS:New( SetCarrier, SetCargo, SetDeployZones ) + -- function ACLASS:New(SetCarrier, SetCargo, SetDeployZones) -- - -- local self = BASE:Inherit( self, FSM:New() ) -- #AI_CARGO_DISPATCHER + -- local self = BASE:Inherit(self, FSM:New()) -- #AI_CARGO_DISPATCHER -- -- -- Put a Dead event handler on SetCarrier, to ensure that when a carrier is destroyed, that all internal parameters are reset. -- -- Note the "." notation, and the explicit declaration of SetHelicopter, which would be using the ":" notation the implicit self variable declaration. -- - -- function SetHelicopter.OnAfterDead( SetHelicopter, From, Event, To, UnitObject ) - -- SetHelicopter:F( { UnitObject = UnitObject:GetName() } ) + -- function SetHelicopter.OnAfterDead(SetHelicopter, From, Event, To, UnitObject) + -- SetHelicopter:F({ UnitObject = UnitObject:GetName() }) -- self.array[UnitObject] = nil -- So here I clear the array table entry of the self object ACLASS. -- end -- @@ -2312,9 +2335,9 @@ do -- SET_UNIT function SET_UNIT:New() -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.UNITS ) ) -- #SET_UNIT + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.UNITS)) -- #SET_UNIT - self:FilterActive( false ) + self:FilterActive(false) --- Count Alive Units -- @function [parent=#SET_UNIT] CountAlive @@ -2328,10 +2351,10 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param Wrapper.Unit#UNIT Unit A single UNIT. -- @return #SET_UNIT self - function SET_UNIT:AddUnit( Unit ) - --self:F2( Unit:GetName() ) + function SET_UNIT:AddUnit(Unit) + --self:F2(Unit:GetName()) - self:Add( Unit:GetName(), Unit ) + self:Add(Unit:GetName(), Unit) if Unit:IsInstanceOf("UNIT") then -- Set the default cargo bay limit each time a new unit is added to the set. @@ -2345,13 +2368,13 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #string AddUnitNames A single name or an array of UNIT names. -- @return #SET_UNIT self - function SET_UNIT:AddUnitsByName( AddUnitNames ) + function SET_UNIT:AddUnitsByName(AddUnitNames) - local AddUnitNamesArray = (type( AddUnitNames ) == "table") and AddUnitNames or { AddUnitNames } + local AddUnitNamesArray = (type(AddUnitNames) == "table") and AddUnitNames or { AddUnitNames } - --self:T( AddUnitNamesArray ) - for AddUnitID, AddUnitName in pairs( AddUnitNamesArray ) do - self:Add( AddUnitName, UNIT:FindByName( AddUnitName ) ) + --self:T(AddUnitNamesArray) + for AddUnitID, AddUnitName in pairs(AddUnitNamesArray) do + self:Add(AddUnitName, UNIT:FindByName(AddUnitName)) end return self @@ -2361,12 +2384,12 @@ do -- SET_UNIT -- @param Core.Set#SET_UNIT self -- @param #table RemoveUnitNames A single name or an array of UNIT names. -- @return Core.Set#SET_UNIT self - function SET_UNIT:RemoveUnitsByName( RemoveUnitNames ) + function SET_UNIT:RemoveUnitsByName(RemoveUnitNames) - local RemoveUnitNamesArray = (type( RemoveUnitNames ) == "table") and RemoveUnitNames or { RemoveUnitNames } + local RemoveUnitNamesArray = (type(RemoveUnitNames) == "table") and RemoveUnitNames or { RemoveUnitNames } - for RemoveUnitID, RemoveUnitName in pairs( RemoveUnitNamesArray ) do - self:Remove( RemoveUnitName ) + for RemoveUnitID, RemoveUnitName in pairs(RemoveUnitNamesArray) do + self:Remove(RemoveUnitName) end return self @@ -2376,44 +2399,32 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #string UnitName -- @return Wrapper.Unit#UNIT The found Unit. - function SET_UNIT:FindUnit( UnitName ) + function SET_UNIT:FindUnit(UnitName) local UnitFound = self.Set[UnitName] return UnitFound end - + --- Builds a set of units of coalitions. -- Possible current coalitions are red, blue and neutral. -- @param #SET_UNIT self -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @return #SET_UNIT self - function SET_UNIT:FilterCoalitions( Coalitions ) - self.Filter.Coalitions = {} - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - - return self - end --- Builds a set of units out of categories. -- Possible current categories are plane, helicopter, ground, ship. -- @param #SET_UNIT self -- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". -- @return #SET_UNIT self - function SET_UNIT:FilterCategories( Categories ) + function SET_UNIT:FilterCategories(Categories) if not self.Filter.Categories then self.Filter.Categories = {} end - if type( Categories ) ~= "table" then + if type(Categories) ~= "table" then Categories = { Categories } end - for CategoryID, Category in pairs( Categories ) do + for CategoryID, Category in pairs(Categories) do self.Filter.Categories[Category] = Category end return self @@ -2424,14 +2435,14 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #string Types Can take those type strings known within DCS world. -- @return #SET_UNIT self - function SET_UNIT:FilterTypes( Types ) + function SET_UNIT:FilterTypes(Types) if not self.Filter.Types then self.Filter.Types = {} end - if type( Types ) ~= "table" then + if type(Types) ~= "table" then Types = { Types } end - for TypeID, Type in pairs( Types ) do + for TypeID, Type in pairs(Types) do self.Filter.Types[Type] = Type end return self @@ -2442,14 +2453,14 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #string Countries Can take those country strings known within DCS world. -- @return #SET_UNIT self - function SET_UNIT:FilterCountries( Countries ) + function SET_UNIT:FilterCountries(Countries) if not self.Filter.Countries then self.Filter.Countries = {} end - if type( Countries ) ~= "table" then + if type(Countries) ~= "table" then Countries = { Countries } end - for CountryID, Country in pairs( Countries ) do + for CountryID, Country in pairs(Countries) do self.Filter.Countries[Country] = Country end return self @@ -2460,14 +2471,14 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #string Prefixes The string pattern(s) that needs to be contained in the unit name. Can also be passed as a `#table` of strings. -- @return #SET_UNIT self - function SET_UNIT:FilterPrefixes( Prefixes ) + function SET_UNIT:FilterPrefixes(Prefixes) if not self.Filter.UnitPrefixes then self.Filter.UnitPrefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.UnitPrefixes[Prefix] = Prefix end return self @@ -2477,20 +2488,20 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #table Zones Table of Core.Zone#ZONE Zone objects, or a Core.Set#SET_ZONE -- @return #SET_UNIT self - function SET_UNIT:FilterZones( Zones ) + function SET_UNIT:FilterZones(Zones) if not self.Filter.Zones then self.Filter.Zones = {} end local zones = {} if Zones.ClassName and Zones.ClassName == "SET_ZONE" then zones = Zones.Set - elseif type( Zones ) ~= "table" or (type( Zones ) == "table" and Zones.ClassName ) then + elseif type(Zones) ~= "table" or (type(Zones) == "table" and Zones.ClassName) then self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") return self else zones = Zones end - for _,Zone in pairs( zones ) do + for _,Zone in pairs(zones) do local zonename = Zone:GetName() self.Filter.Zones[zonename] = Zone end @@ -2509,15 +2520,15 @@ do -- SET_UNIT -- UnitSet = SET_UNIT:New():FilterActive():FilterStart() -- -- -- Include only active units to the set of the blue coalition, and filter one time. - -- UnitSet = SET_UNIT:New():FilterActive():FilterCoalition( "blue" ):FilterOnce() + -- UnitSet = SET_UNIT:New():FilterActive():FilterCoalition("blue"):FilterOnce() -- -- -- Include only active units to the set of the blue coalition, and filter one time. -- -- Later, reset to include back inactive units to the set. - -- UnitSet = SET_UNIT:New():FilterActive():FilterCoalition( "blue" ):FilterOnce() + -- UnitSet = SET_UNIT:New():FilterActive():FilterCoalition("blue"):FilterOnce() -- ... logic ... - -- UnitSet = SET_UNIT:New():FilterActive( false ):FilterCoalition( "blue" ):FilterOnce() + -- UnitSet = SET_UNIT:New():FilterActive(false):FilterCoalition("blue"):FilterOnce() -- - function SET_UNIT:FilterActive( Active ) + function SET_UNIT:FilterActive(Active) Active = Active or not (Active == false) self.Filter.Active = Active return self @@ -2535,7 +2546,7 @@ do -- SET_UNIT return false end end - ) + ) return self end @@ -2564,7 +2575,7 @@ do -- SET_UNIT end return outcome end, Prefixes - ) + ) return self end @@ -2573,13 +2584,13 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #table RadarTypes The radar types. -- @return #SET_UNIT self - function SET_UNIT:FilterHasRadar( RadarTypes ) + function SET_UNIT:FilterHasRadar(RadarTypes) self.Filter.RadarTypes = self.Filter.RadarTypes or {} - if type( RadarTypes ) ~= "table" then + if type(RadarTypes) ~= "table" then RadarTypes = { RadarTypes } end - for RadarTypeID, RadarType in pairs( RadarTypes ) do + for RadarTypeID, RadarType in pairs(RadarTypes) do self.Filter.RadarTypes[RadarType] = RadarType end return self @@ -2602,7 +2613,7 @@ do -- SET_UNIT local Set = self:GetSet() local CountU = 0 - for UnitID, UnitData in pairs( Set ) do -- For each GROUP in SET_GROUP + for UnitID, UnitData in pairs(Set) do -- For each GROUP in SET_GROUP if UnitData and UnitData:IsAlive() then CountU = CountU + 1 end @@ -2637,10 +2648,10 @@ do -- SET_UNIT local Database = _DATABASE.UNITS - for ObjectName, Object in pairs( Database ) do - if self:IsIncludeObject( Object ) and self:IsNotInSet(Object) then - self:Add( ObjectName, Object ) - elseif (not self:IsIncludeObject( Object )) and self:IsInSet(Object) then + for ObjectName, Object in pairs(Database) do + if self:IsIncludeObject(Object) and self:IsNotInSet(Object) then + self:Add(ObjectName, Object) + elseif (not self:IsIncludeObject(Object)) and self:IsInSet(Object) then self:Remove(ObjectName) end end @@ -2686,11 +2697,11 @@ do -- SET_UNIT if _DATABASE then self:_FilterStart() - self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) - self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.RemoveUnit, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.UnitLost, self._EventOnDeadOrCrash ) + self:HandleEvent(EVENTS.Birth, self._EventOnBirth) + self:HandleEvent(EVENTS.Dead, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.Crash, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.RemoveUnit, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.UnitLost, self._EventOnDeadOrCrash) if self.Filter.Zones then self.ZoneTimer = TIMER:New(self._ContinousZoneFilter,self) local timing = self.ZoneTimerInterval or 30 @@ -2716,7 +2727,7 @@ do -- SET_UNIT -- if unit:GetName() == "Exclude Me" then isinclude = false end -- return isinclude -- end - -- ):FilterOnce() + -- ):FilterOnce() -- BASE:I(groundset:Flush()) @@ -2726,13 +2737,13 @@ do -- SET_UNIT -- @param Core.Event#EVENTDATA Event -- @return #string The name of the UNIT -- @return #table The UNIT - function SET_UNIT:AddInDatabase( Event ) - --self:F3( { Event } ) + function SET_UNIT:AddInDatabase(Event) + --self:F3({ Event }) if Event.IniObjectCategory == Object.Category.UNIT then if not self.Database[Event.IniDCSUnitName] then - self.Database[Event.IniDCSUnitName] = UNIT:Register( Event.IniDCSUnitName ) - --self:T3( self.Database[Event.IniDCSUnitName] ) + self.Database[Event.IniDCSUnitName] = UNIT:Register(Event.IniDCSUnitName) + --self:T3(self.Database[Event.IniDCSUnitName]) end end @@ -2745,8 +2756,8 @@ do -- SET_UNIT -- @param Core.Event#EVENTDATA Event -- @return #string The name of the UNIT -- @return #table The UNIT - function SET_UNIT:FindInDatabase( Event ) - --self:F2( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) + function SET_UNIT:FindInDatabase(Event) + --self:F2({ Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event }) return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] end @@ -2757,24 +2768,24 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param Core.Zone#ZONE ZoneTest The Zone to be tested for. -- @return #boolean - function SET_UNIT:IsPartiallyInZone( ZoneTest ) + function SET_UNIT:IsPartiallyInZone(ZoneTest) local IsPartiallyInZone = false - local function EvaluateZone( ZoneUnit ) + local function EvaluateZone(ZoneUnit) local ZoneUnitName = ZoneUnit:GetName() - --self:F( { ZoneUnitName = ZoneUnitName } ) - if self:FindUnit( ZoneUnitName ) then + --self:F({ ZoneUnitName = ZoneUnitName }) + if self:FindUnit(ZoneUnitName) then IsPartiallyInZone = true - --self:F( { Found = true } ) + --self:F({ Found = true }) return false end return true end - ZoneTest:SearchZone( EvaluateZone ) + ZoneTest:SearchZone(EvaluateZone) return IsPartiallyInZone end @@ -2783,14 +2794,14 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param Core.Zone#ZONE Zone The Zone to be tested for. -- @return #boolean - function SET_UNIT:IsNotInZone( Zone ) + function SET_UNIT:IsNotInZone(Zone) local IsNotInZone = true - local function EvaluateZone( ZoneUnit ) + local function EvaluateZone(ZoneUnit) local ZoneUnitName = ZoneUnit:GetName() - if self:FindUnit( ZoneUnitName ) then + if self:FindUnit(ZoneUnitName) then IsNotInZone = false return false end @@ -2798,7 +2809,7 @@ do -- SET_UNIT return true end - Zone:SearchZone( EvaluateZone ) + Zone:SearchZone(EvaluateZone) return IsNotInZone end @@ -2810,10 +2821,10 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. -- @return #SET_UNIT self - function SET_UNIT:ForEachUnit( IteratorFunction, ... ) - --self:F2( arg ) + function SET_UNIT:ForEachUnit(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -2824,20 +2835,20 @@ do -- SET_UNIT -- @param #number FromThreatLevel The TreatLevel to start the evaluation **From** (this must be a value between 0 and 10). -- @param #number ToThreatLevel The TreatLevel to stop the evaluation **To** (this must be a value between 0 and 10). -- @return #SET_UNIT self - function SET_UNIT:GetSetPerThreatLevel( FromThreatLevel, ToThreatLevel ) - --self:F2( arg ) + function SET_UNIT:GetSetPerThreatLevel(FromThreatLevel, ToThreatLevel) + --self:F2(arg) local ThreatLevelSet = {} if self:Count() ~= 0 then - for UnitName, UnitObject in pairs( self.Set ) do + for UnitName, UnitObject in pairs(self.Set) do local Unit = UnitObject -- Wrapper.Unit#UNIT local ThreatLevel = Unit:GetThreatLevel() ThreatLevelSet[ThreatLevel] = ThreatLevelSet[ThreatLevel] or {} ThreatLevelSet[ThreatLevel].Set = ThreatLevelSet[ThreatLevel].Set or {} ThreatLevelSet[ThreatLevel].Set[UnitName] = UnitObject - --self:F( { ThreatLevel = ThreatLevel, ThreatLevelSet = ThreatLevelSet[ThreatLevel].Set } ) + --self:F({ ThreatLevel = ThreatLevel, ThreatLevelSet = ThreatLevelSet[ThreatLevel].Set }) end local OrderedPerThreatLevelSet = {} @@ -2845,11 +2856,11 @@ do -- SET_UNIT local ThreatLevelIncrement = FromThreatLevel <= ToThreatLevel and 1 or -1 for ThreatLevel = FromThreatLevel, ToThreatLevel, ThreatLevelIncrement do - --self:F( { ThreatLevel = ThreatLevel } ) + --self:F({ ThreatLevel = ThreatLevel }) local ThreatLevelItem = ThreatLevelSet[ThreatLevel] if ThreatLevelItem then - for UnitName, UnitObject in pairs( ThreatLevelItem.Set ) do - table.insert( OrderedPerThreatLevelSet, UnitObject ) + for UnitName, UnitObject in pairs(ThreatLevelItem.Set) do + table.insert(OrderedPerThreatLevelSet, UnitObject) end end end @@ -2869,36 +2880,36 @@ do -- SET_UNIT -- @return #SET_UNIT self -- @usage -- - -- UnitSet:ForEachUnitPerThreatLevel( 10, 0, + -- UnitSet:ForEachUnitPerThreatLevel(10, 0, -- -- @param Wrapper.Unit#UNIT UnitObject The UNIT object in the UnitSet, that will be passed to the local function for evaluation. - -- function( UnitObject ) + -- function(UnitObject) -- .. logic .. -- end - -- ) + -- ) -- - function SET_UNIT:ForEachUnitPerThreatLevel( FromThreatLevel, ToThreatLevel, IteratorFunction, ... ) -- R2.1 Threat Level implementation - --self:F2( arg ) + function SET_UNIT:ForEachUnitPerThreatLevel(FromThreatLevel, ToThreatLevel, IteratorFunction, ...) -- R2.1 Threat Level implementation + --self:F2(arg) local ThreatLevelSet = {} if self:Count() ~= 0 then - for UnitName, UnitObject in pairs( self.Set ) do + for UnitName, UnitObject in pairs(self.Set) do local Unit = UnitObject -- Wrapper.Unit#UNIT local ThreatLevel = Unit:GetThreatLevel() ThreatLevelSet[ThreatLevel] = ThreatLevelSet[ThreatLevel] or {} ThreatLevelSet[ThreatLevel].Set = ThreatLevelSet[ThreatLevel].Set or {} ThreatLevelSet[ThreatLevel].Set[UnitName] = UnitObject - --self:F( { ThreatLevel = ThreatLevel, ThreatLevelSet = ThreatLevelSet[ThreatLevel].Set } ) + --self:F({ ThreatLevel = ThreatLevel, ThreatLevelSet = ThreatLevelSet[ThreatLevel].Set }) end local ThreatLevelIncrement = FromThreatLevel <= ToThreatLevel and 1 or -1 for ThreatLevel = FromThreatLevel, ToThreatLevel, ThreatLevelIncrement do - --self:F( { ThreatLevel = ThreatLevel } ) + --self:F({ ThreatLevel = ThreatLevel }) local ThreatLevelItem = ThreatLevelSet[ThreatLevel] if ThreatLevelItem then - self:ForEach( IteratorFunction, arg, ThreatLevelItem.Set ) + self:ForEach(IteratorFunction, arg, ThreatLevelItem.Set) end end end @@ -2911,19 +2922,19 @@ do -- SET_UNIT -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. -- @return #SET_UNIT self - function SET_UNIT:ForEachUnitCompletelyInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_UNIT:ForEachUnitCompletelyInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Unit#UNIT UnitObject - function( ZoneObject, UnitObject ) - if UnitObject:IsInZone( ZoneObject ) then + function(ZoneObject, UnitObject) + if UnitObject:IsInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -2933,19 +2944,19 @@ do -- SET_UNIT -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. -- @return #SET_UNIT self - function SET_UNIT:ForEachUnitNotInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_UNIT:ForEachUnitNotInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Unit#UNIT UnitObject - function( ZoneObject, UnitObject ) - if UnitObject:IsNotInZone( ZoneObject ) then + function(ZoneObject, UnitObject) + if UnitObject:IsNotInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -2959,7 +2970,7 @@ do -- SET_UNIT local MT = {} -- Message Text local UnitTypes = {} - for UnitID, UnitData in pairs( self:GetSet() ) do + for UnitID, UnitData in pairs(self:GetSet()) do local TextUnit = UnitData -- Wrapper.Unit#UNIT if TextUnit:IsAlive() then local UnitType = TextUnit:GetTypeName() @@ -2972,7 +2983,7 @@ do -- SET_UNIT end end - for UnitTypeID, UnitType in pairs( UnitTypes ) do + for UnitTypeID, UnitType in pairs(UnitTypes) do MT[#MT + 1] = UnitType .. " of " .. UnitTypeID end @@ -2988,11 +2999,11 @@ do -- SET_UNIT local MT = {} -- Message Text local UnitTypes = self:GetUnitTypes() - for UnitTypeID, UnitType in pairs( UnitTypes ) do + for UnitTypeID, UnitType in pairs(UnitTypes) do MT[#MT + 1] = UnitType .. " of " .. UnitTypeID end - return table.concat( MT, ", " ) + return table.concat(MT, ", ") end --- Returns map of unit threat levels. @@ -3003,7 +3014,7 @@ do -- SET_UNIT local UnitThreatLevels = {} - for UnitID, UnitData in pairs( self:GetSet() ) do + for UnitID, UnitData in pairs(self:GetSet()) do local ThreatUnit = UnitData -- Wrapper.Unit#UNIT if ThreatUnit:IsAlive() then local UnitThreatLevel, UnitThreatLevelText = ThreatUnit:GetThreatLevel() @@ -3026,7 +3037,7 @@ do -- SET_UNIT local MaxThreatLevelA2G = 0 local MaxThreatText = "" - for UnitName, UnitData in pairs( self:GetSet() ) do + for UnitName, UnitData in pairs(self:GetSet()) do local ThreatUnit = UnitData -- Wrapper.Unit#UNIT local ThreatLevelA2G, ThreatText = ThreatUnit:GetThreatLevel() if ThreatLevelA2G > MaxThreatLevelA2G then @@ -3035,7 +3046,7 @@ do -- SET_UNIT end end - --self:F( { MaxThreatLevelA2G = MaxThreatLevelA2G, MaxThreatText = MaxThreatText } ) + --self:F({ MaxThreatLevelA2G = MaxThreatLevelA2G, MaxThreatText = MaxThreatText }) return MaxThreatLevelA2G, MaxThreatText end @@ -3083,8 +3094,8 @@ do -- SET_UNIT if Coordinate then local heading = self:GetHeading() or 0 local velocity = self:GetVelocity() or 0 - Coordinate:SetHeading( heading ) - Coordinate:SetVelocity( velocity ) + Coordinate:SetHeading(heading) + Coordinate:SetVelocity(velocity) --self:T(UTILS.PrintTableToLog(Coordinate)) end @@ -3100,7 +3111,7 @@ do -- SET_UNIT local MaxVelocity = 0 - for UnitName, UnitData in pairs( self:GetSet() ) do + for UnitName, UnitData in pairs(self:GetSet()) do local Unit = UnitData -- Wrapper.Unit#UNIT local Coordinate = Unit:GetCoordinate() @@ -3111,7 +3122,7 @@ do -- SET_UNIT end end - --self:F( { MaxVelocity = MaxVelocity } ) + --self:F({ MaxVelocity = MaxVelocity }) return MaxVelocity end @@ -3124,7 +3135,7 @@ do -- SET_UNIT local HeadingSet = nil local MovingCount = 0 - for UnitName, UnitData in pairs( self:GetSet() ) do + for UnitName, UnitData in pairs(self:GetSet()) do local Unit = UnitData -- Wrapper.Unit#UNIT local Coordinate = Unit:GetCoordinate() @@ -3136,7 +3147,7 @@ do -- SET_UNIT HeadingSet = Heading else local HeadingDiff = (HeadingSet - Heading + 180 + 360) % 360 - 180 - HeadingDiff = math.abs( HeadingDiff ) + HeadingDiff = math.abs(HeadingDiff) if HeadingDiff > 5 then HeadingSet = nil break @@ -3153,19 +3164,19 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param DCS#Unit.RadarType RadarType -- @return #number The amount of radars in the Set with the given type - function SET_UNIT:HasRadar( RadarType ) - --self:F2( RadarType ) + function SET_UNIT:HasRadar(RadarType) + --self:F2(RadarType) local RadarCount = 0 - for UnitID, UnitData in pairs( self:GetSet() ) do + for UnitID, UnitData in pairs(self:GetSet()) do local UnitSensorTest = UnitData -- Wrapper.Unit#UNIT local HasSensors if RadarType then - HasSensors = UnitSensorTest:HasSensors( Unit.SensorType.RADAR, RadarType ) + HasSensors = UnitSensorTest:HasSensors(Unit.SensorType.RADAR, RadarType) else - HasSensors = UnitSensorTest:HasSensors( Unit.SensorType.RADAR ) + HasSensors = UnitSensorTest:HasSensors(Unit.SensorType.RADAR) end - --self:T3( HasSensors ) + --self:T3(HasSensors) if HasSensors then RadarCount = RadarCount + 1 end @@ -3181,14 +3192,14 @@ do -- SET_UNIT --self:F2() local SEADCount = 0 - for UnitID, UnitData in pairs( self:GetSet() ) do + for UnitID, UnitData in pairs(self:GetSet()) do local UnitSEAD = UnitData -- Wrapper.Unit#UNIT if UnitSEAD:IsAlive() then local UnitSEADAttributes = UnitSEAD:GetDesc().attributes local HasSEAD = UnitSEAD:HasSEAD() - --self:T3( HasSEAD ) + --self:T3(HasSEAD) if HasSEAD then SEADCount = SEADCount + 1 end @@ -3205,7 +3216,7 @@ do -- SET_UNIT --self:F2() local GroundUnitCount = 0 - for UnitID, UnitData in pairs( self:GetSet() ) do + for UnitID, UnitData in pairs(self:GetSet()) do local UnitTest = UnitData -- Wrapper.Unit#UNIT if UnitTest:IsGround() then GroundUnitCount = GroundUnitCount + 1 @@ -3222,7 +3233,7 @@ do -- SET_UNIT --self:F2() local AirUnitCount = 0 - for UnitID, UnitData in pairs( self:GetSet() ) do + for UnitID, UnitData in pairs(self:GetSet()) do local UnitTest = UnitData -- Wrapper.Unit#UNIT if UnitTest:IsAir() then AirUnitCount = AirUnitCount + 1 @@ -3235,13 +3246,13 @@ do -- SET_UNIT --- Returns if the @{Core.Set} has friendly ground units. -- @param #SET_UNIT self -- @return #number The amount of ground targets in the Set. - function SET_UNIT:HasFriendlyUnits( FriendlyCoalition ) + function SET_UNIT:HasFriendlyUnits(FriendlyCoalition) --self:F2() local FriendlyUnitCount = 0 - for UnitID, UnitData in pairs( self:GetSet() ) do + for UnitID, UnitData in pairs(self:GetSet()) do local UnitTest = UnitData -- Wrapper.Unit#UNIT - if UnitTest:IsFriendly( FriendlyCoalition ) then + if UnitTest:IsFriendly(FriendlyCoalition) then FriendlyUnitCount = FriendlyUnitCount + 1 end end @@ -3255,10 +3266,10 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter. ---- @return #SET_UNIT self - -- function SET_UNIT:ForEachPlayer( IteratorFunction, ... ) - -- --self:F2( arg ) + -- function SET_UNIT:ForEachPlayer(IteratorFunction, ...) + -- --self:F2(arg) -- - -- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) + -- self:ForEach(IteratorFunction, arg, self.PlayersAlive) -- -- return self -- end @@ -3268,10 +3279,10 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter. ---- @return #SET_UNIT self - -- function SET_UNIT:ForEachClient( IteratorFunction, ... ) - -- --self:F2( arg ) + -- function SET_UNIT:ForEachClient(IteratorFunction, ...) + -- --self:F2(arg) -- - -- self:ForEach( IteratorFunction, arg, self.Clients ) + -- self:ForEach(IteratorFunction, arg, self.Clients) -- -- return self -- end @@ -3280,8 +3291,8 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param Wrapper.Unit#UNIT MUnit -- @return #SET_UNIT self - function SET_UNIT:IsIncludeObject( MUnit ) - --self:F2( {MUnit} ) + function SET_UNIT:IsIncludeObject(MUnit) + --self:F2({MUnit}) local MUnitInclude = false @@ -3299,8 +3310,8 @@ do -- SET_UNIT if self.Filter.Coalitions and MUnitInclude then local MUnitCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - --self:F( { "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do + --self:F({ "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName }) if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MUnit:GetCoalition() then MUnitCoalition = true end @@ -3310,8 +3321,8 @@ do -- SET_UNIT if self.Filter.Categories and MUnitInclude then local MUnitCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - --self:T3( { "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) + for CategoryID, CategoryName in pairs(self.Filter.Categories) do + --self:T3({ "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MUnit:GetDesc().category then MUnitCategory = true end @@ -3321,8 +3332,8 @@ do -- SET_UNIT if self.Filter.Types and MUnitInclude then local MUnitType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - --self:T3( { "Type:", MUnit:GetTypeName(), TypeName } ) + for TypeID, TypeName in pairs(self.Filter.Types) do + --self:T3({ "Type:", MUnit:GetTypeName(), TypeName }) if TypeName == MUnit:GetTypeName() then MUnitType = true end @@ -3332,8 +3343,8 @@ do -- SET_UNIT if self.Filter.Countries and MUnitInclude then local MUnitCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - --self:T3( { "Country:", MUnit:GetCountry(), CountryName } ) + for CountryID, CountryName in pairs(self.Filter.Countries) do + --self:T3({ "Country:", MUnit:GetCountry(), CountryName }) if country.id[CountryName] == MUnit:GetCountry() then MUnitCountry = true end @@ -3343,9 +3354,9 @@ do -- SET_UNIT if self.Filter.UnitPrefixes and MUnitInclude then local MUnitPrefix = false - for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do - --self:T3( { "Prefix:", string.find( MUnit:GetName(), UnitPrefix, 1 ), UnitPrefix } ) - if string.find( MUnit:GetName(), UnitPrefix, 1 ) then + for UnitPrefixId, UnitPrefix in pairs(self.Filter.UnitPrefixes) do + --self:T3({ "Prefix:", string.find(MUnit:GetName(), UnitPrefix, 1), UnitPrefix }) + if string.find(MUnit:GetName(), UnitPrefix, 1) then MUnitPrefix = true end end @@ -3354,11 +3365,11 @@ do -- SET_UNIT if self.Filter.RadarTypes and MUnitInclude then local MUnitRadar = false - for RadarTypeID, RadarType in pairs( self.Filter.RadarTypes ) do - --self:T3( { "Radar:", RadarType } ) - if MUnit:HasSensors( Unit.SensorType.RADAR, RadarType ) == true then + for RadarTypeID, RadarType in pairs(self.Filter.RadarTypes) do + --self:T3({ "Radar:", RadarType }) + if MUnit:HasSensors(Unit.SensorType.RADAR, RadarType) == true then if MUnit:GetRadar() == true then -- This call is necessary to evaluate the SEAD capability. - --self:T3( "RADAR Found" ) + --self:T3("RADAR Found") end MUnitRadar = true end @@ -3369,7 +3380,7 @@ do -- SET_UNIT if self.Filter.SEAD and MUnitInclude then local MUnitSEAD = false if MUnit:HasSEAD() == true then - --self:T3( "SEAD Found" ) + --self:T3("SEAD Found") MUnitSEAD = true end MUnitInclude = MUnitInclude and MUnitSEAD @@ -3378,8 +3389,8 @@ do -- SET_UNIT if self.Filter.Zones and MUnitInclude then local MGroupZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T3( "Zone:", ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T3("Zone:", ZoneName) if MUnit:IsInZone(Zone) then MGroupZone = true end @@ -3392,7 +3403,7 @@ do -- SET_UNIT MUnitInclude = MUnitInclude and MUnitFunc end - --self:T2( MUnitInclude ) + --self:T2(MUnitInclude) return MUnitInclude end @@ -3400,24 +3411,24 @@ do -- SET_UNIT -- @param #SET_UNIT self -- @param #string Delimiter (Optional) The delimiter, which is default a comma. -- @return #string The types of the @{Wrapper.Unit}s delimited. - function SET_UNIT:GetTypeNames( Delimiter ) + function SET_UNIT:GetTypeNames(Delimiter) Delimiter = Delimiter or ", " local TypeReport = REPORT:New() local Types = {} - for UnitName, UnitData in pairs( self:GetSet() ) do + for UnitName, UnitData in pairs(self:GetSet()) do local Unit = UnitData -- Wrapper.Unit#UNIT local UnitTypeName = Unit:GetTypeName() if not Types[UnitTypeName] then Types[UnitTypeName] = UnitTypeName - TypeReport:Add( UnitTypeName ) + TypeReport:Add(UnitTypeName) end end - return TypeReport:Text( Delimiter ) + return TypeReport:Text(Delimiter) end --- Iterate the SET_UNIT and set for each unit the default cargo bay weight limit. @@ -3428,7 +3439,7 @@ do -- SET_UNIT -- MySetUnit:SetCargoBayWeightLimit() function SET_UNIT:SetCargoBayWeightLimit() local Set = self:GetSet() - for UnitID, UnitData in pairs( Set ) do -- For each UNIT in SET_UNIT + for UnitID, UnitData in pairs(Set) do -- For each UNIT in SET_UNIT -- local UnitData = UnitData -- Wrapper.Unit#UNIT UnitData:SetCargoBayWeightLimit() end @@ -3540,7 +3551,7 @@ do -- SET_STATIC function SET_STATIC:New() -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.STATICS ) ) -- Core.Set#SET_STATIC + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.STATICS)) -- Core.Set#SET_STATIC return self end @@ -3549,10 +3560,10 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param Wrapper.Static#STATIC AddStatic A single STATIC. -- @return #SET_STATIC self - function SET_STATIC:AddStatic( AddStatic ) - --self:F2( AddStatic:GetName() ) + function SET_STATIC:AddStatic(AddStatic) + --self:F2(AddStatic:GetName()) - self:Add( AddStatic:GetName(), AddStatic ) + self:Add(AddStatic:GetName(), AddStatic) return self end @@ -3561,13 +3572,13 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #string AddStaticNames A single name or an array of STATIC names. -- @return #SET_STATIC self - function SET_STATIC:AddStaticsByName( AddStaticNames ) + function SET_STATIC:AddStaticsByName(AddStaticNames) - local AddStaticNamesArray = (type( AddStaticNames ) == "table") and AddStaticNames or { AddStaticNames } + local AddStaticNamesArray = (type(AddStaticNames) == "table") and AddStaticNames or { AddStaticNames } - --self:T(( AddStaticNamesArray ) - for AddStaticID, AddStaticName in pairs( AddStaticNamesArray ) do - self:Add( AddStaticName, STATIC:FindByName( AddStaticName ) ) + --self:T((AddStaticNamesArray) + for AddStaticID, AddStaticName in pairs(AddStaticNamesArray) do + self:Add(AddStaticName, STATIC:FindByName(AddStaticName)) end return self @@ -3577,12 +3588,12 @@ do -- SET_STATIC -- @param Core.Set#SET_STATIC self -- @param Wrapper.Static#STATIC RemoveStaticNames A single name or an array of STATIC names. -- @return self - function SET_STATIC:RemoveStaticsByName( RemoveStaticNames ) + function SET_STATIC:RemoveStaticsByName(RemoveStaticNames) - local RemoveStaticNamesArray = (type( RemoveStaticNames ) == "table") and RemoveStaticNames or { RemoveStaticNames } + local RemoveStaticNamesArray = (type(RemoveStaticNames) == "table") and RemoveStaticNames or { RemoveStaticNames } - for RemoveStaticID, RemoveStaticName in pairs( RemoveStaticNamesArray ) do - self:Remove( RemoveStaticName ) + for RemoveStaticID, RemoveStaticName in pairs(RemoveStaticNamesArray) do + self:Remove(RemoveStaticName) end return self @@ -3592,49 +3603,37 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #string StaticName -- @return Wrapper.Static#STATIC The found Static. - function SET_STATIC:FindStatic( StaticName ) + function SET_STATIC:FindStatic(StaticName) local StaticFound = self.Set[StaticName] return StaticFound end - + --- Builds a set of units of coalitions. -- Possible current coalitions are red, blue and neutral. -- @param #SET_STATIC self -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @return #SET_STATIC self - function SET_STATIC:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self - end - + --- Builds a set of statics in zones. -- @param #SET_STATIC self -- @param #table Zones Table of Core.Zone#ZONE Zone objects, or a Core.Set#SET_ZONE -- @return #SET_STATIC self - function SET_STATIC:FilterZones( Zones ) + function SET_STATIC:FilterZones(Zones) if not self.Filter.Zones then self.Filter.Zones = {} end local zones = {} if Zones.ClassName and Zones.ClassName == "SET_ZONE" then zones = Zones.Set - elseif type( Zones ) ~= "table" or (type( Zones ) == "table" and Zones.ClassName ) then + elseif type(Zones) ~= "table" or (type(Zones) == "table" and Zones.ClassName) then self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") return self else zones = Zones end - for _,Zone in pairs( zones ) do + for _,Zone in pairs(zones) do local zonename = Zone:GetName() self.Filter.Zones[zonename] = Zone end @@ -3646,14 +3645,14 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". -- @return #SET_STATIC self - function SET_STATIC:FilterCategories( Categories ) + function SET_STATIC:FilterCategories(Categories) if not self.Filter.Categories then self.Filter.Categories = {} end - if type( Categories ) ~= "table" then + if type(Categories) ~= "table" then Categories = { Categories } end - for CategoryID, Category in pairs( Categories ) do + for CategoryID, Category in pairs(Categories) do self.Filter.Categories[Category] = Category end return self @@ -3664,14 +3663,14 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #string Types Can take those type strings known within DCS world. -- @return #SET_STATIC self - function SET_STATIC:FilterTypes( Types ) + function SET_STATIC:FilterTypes(Types) if not self.Filter.Types then self.Filter.Types = {} end - if type( Types ) ~= "table" then + if type(Types) ~= "table" then Types = { Types } end - for TypeID, Type in pairs( Types ) do + for TypeID, Type in pairs(Types) do self.Filter.Types[Type] = Type end return self @@ -3692,7 +3691,7 @@ do -- SET_STATIC -- if static:GetName() == "Exclude Me" then isinclude = false end -- return isinclude -- end - -- ):FilterOnce() + -- ):FilterOnce() -- BASE:I(groundset:Flush()) --- Builds a set of units of defined countries. @@ -3700,14 +3699,14 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #string Countries Can take those country strings known within DCS world. -- @return #SET_STATIC self - function SET_STATIC:FilterCountries( Countries ) + function SET_STATIC:FilterCountries(Countries) if not self.Filter.Countries then self.Filter.Countries = {} end - if type( Countries ) ~= "table" then + if type(Countries) ~= "table" then Countries = { Countries } end - for CountryID, Country in pairs( Countries ) do + for CountryID, Country in pairs(Countries) do self.Filter.Countries[Country] = Country end return self @@ -3718,14 +3717,14 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #string Prefixes The string pattern(s) that need to be contained in the static name. Can also be passed as a `#table` of strings. -- @return #SET_STATIC self - function SET_STATIC:FilterPrefixes( Prefixes ) + function SET_STATIC:FilterPrefixes(Prefixes) if not self.Filter.StaticPrefixes then self.Filter.StaticPrefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.StaticPrefixes[Prefix] = Prefix end return self @@ -3738,9 +3737,9 @@ do -- SET_STATIC if _DATABASE then self:_FilterStart() - self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) - self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.UnitLost, self._EventOnDeadOrCrash ) + self:HandleEvent(EVENTS.Birth, self._EventOnBirth) + self:HandleEvent(EVENTS.Dead, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.UnitLost, self._EventOnDeadOrCrash) end return self @@ -3754,7 +3753,7 @@ do -- SET_STATIC local Set = self:GetSet() local CountU = 0 - for UnitID, UnitData in pairs( Set ) do + for UnitID, UnitData in pairs(Set) do if UnitData and UnitData:IsAlive() then CountU = CountU + 1 end @@ -3770,13 +3769,13 @@ do -- SET_STATIC -- @param Core.Event#EVENTDATA Event -- @return #string The name of the STATIC -- @return #table The STATIC - function SET_STATIC:AddInDatabase( Event ) - --self:F3( { Event } ) + function SET_STATIC:AddInDatabase(Event) + --self:F3({ Event }) if Event.IniObjectCategory == Object.Category.STATIC then if not self.Database[Event.IniDCSUnitName] then - self.Database[Event.IniDCSUnitName] = STATIC:Register( Event.IniDCSUnitName ) - --self:T(3( self.Database[Event.IniDCSUnitName] ) + self.Database[Event.IniDCSUnitName] = STATIC:Register(Event.IniDCSUnitName) + --self:T(3(self.Database[Event.IniDCSUnitName]) end end @@ -3789,8 +3788,8 @@ do -- SET_STATIC -- @param Core.Event#EVENTDATA Event -- @return #string The name of the STATIC -- @return #table The STATIC - function SET_STATIC:FindInDatabase( Event ) - --self:F2( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) + function SET_STATIC:FindInDatabase(Event) + --self:F2({ Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event }) return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] end @@ -3801,14 +3800,14 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param Core.Zone#ZONE Zone The Zone to be tested for. -- @return #boolean - function SET_STATIC:IsPartiallyInZone( Zone ) + function SET_STATIC:IsPartiallyInZone(Zone) local IsPartiallyInZone = false - local function EvaluateZone( ZoneStatic ) + local function EvaluateZone(ZoneStatic) local ZoneStaticName = ZoneStatic:GetName() - if self:FindStatic( ZoneStaticName ) then + if self:FindStatic(ZoneStaticName) then IsPartiallyInZone = true return false end @@ -3823,14 +3822,14 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param Core.Zone#ZONE Zone The Zone to be tested for. -- @return #boolean - function SET_STATIC:IsNotInZone( Zone ) + function SET_STATIC:IsNotInZone(Zone) local IsNotInZone = true - local function EvaluateZone( ZoneStatic ) + local function EvaluateZone(ZoneStatic) local ZoneStaticName = ZoneStatic:GetName() - if self:FindStatic( ZoneStaticName ) then + if self:FindStatic(ZoneStaticName) then IsNotInZone = false return false end @@ -3838,7 +3837,7 @@ do -- SET_STATIC return true end - Zone:Search( EvaluateZone ) + Zone:Search(EvaluateZone) return IsNotInZone end @@ -3847,10 +3846,10 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #function IteratorFunction The function that will be called when there is an alive STATIC in the SET_STATIC. The function needs to accept a STATIC parameter. -- @return #SET_STATIC self - function SET_STATIC:ForEachStaticInZone( IteratorFunction, ... ) - --self:F2( arg ) + function SET_STATIC:ForEachStaticInZone(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -3862,10 +3861,10 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #function IteratorFunction The function that will be called when there is an alive STATIC in the SET_STATIC. The function needs to accept a STATIC parameter. -- @return #SET_STATIC self - function SET_STATIC:ForEachStatic( IteratorFunction, ... ) - --self:F2( arg ) + function SET_STATIC:ForEachStatic(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -3875,19 +3874,19 @@ do -- SET_STATIC -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive STATIC in the SET_STATIC. The function needs to accept a STATIC parameter. -- @return #SET_STATIC self - function SET_STATIC:ForEachStaticCompletelyInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_STATIC:ForEachStaticCompletelyInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Static#STATIC StaticObject - function( ZoneObject, StaticObject ) - if StaticObject:IsInZone( ZoneObject ) then + function(ZoneObject, StaticObject) + if StaticObject:IsInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -3897,19 +3896,19 @@ do -- SET_STATIC -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive STATIC in the SET_STATIC. The function needs to accept a STATIC parameter. -- @return #SET_STATIC self - function SET_STATIC:ForEachStaticNotInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_STATIC:ForEachStaticNotInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Static#STATIC StaticObject - function( ZoneObject, StaticObject ) - if StaticObject:IsNotInZone( ZoneObject ) then + function(ZoneObject, StaticObject) + if StaticObject:IsNotInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -3923,7 +3922,7 @@ do -- SET_STATIC local MT = {} -- Message Text local StaticTypes = {} - for StaticID, StaticData in pairs( self:GetSet() ) do + for StaticID, StaticData in pairs(self:GetSet()) do local TextStatic = StaticData -- Wrapper.Static#STATIC if TextStatic:IsAlive() then local StaticType = TextStatic:GetTypeName() @@ -3936,7 +3935,7 @@ do -- SET_STATIC end end - for StaticTypeID, StaticType in pairs( StaticTypes ) do + for StaticTypeID, StaticType in pairs(StaticTypes) do MT[#MT + 1] = StaticType .. " of " .. StaticTypeID end @@ -3952,11 +3951,11 @@ do -- SET_STATIC local MT = {} -- Message Text local StaticTypes = self:GetStaticTypes() - for StaticTypeID, StaticType in pairs( StaticTypes ) do + for StaticTypeID, StaticType in pairs(StaticTypes) do MT[#MT + 1] = StaticType .. " of " .. StaticTypeID end - return table.concat( MT, ", " ) + return table.concat(MT, ", ") end --- Get the center coordinate of the SET_STATIC. @@ -3976,7 +3975,7 @@ do -- SET_STATIC local AvgHeading = nil local MovingCount = 0 - for StaticName, StaticData in pairs( self:GetSet() ) do + for StaticName, StaticData in pairs(self:GetSet()) do local Static = StaticData -- Wrapper.Static#STATIC local Coordinate = Static:GetCoordinate() @@ -4002,10 +4001,10 @@ do -- SET_STATIC Coordinate.x = (x2 - x1) / 2 + x1 Coordinate.y = (y2 - y1) / 2 + y1 Coordinate.z = (z2 - z1) / 2 + z1 - Coordinate:SetHeading( AvgHeading ) - Coordinate:SetVelocity( MaxVelocity ) + Coordinate:SetHeading(AvgHeading) + Coordinate:SetVelocity(MaxVelocity) - --self:F( { Coordinate = Coordinate } ) + --self:F({ Coordinate = Coordinate }) return Coordinate end @@ -4027,7 +4026,7 @@ do -- SET_STATIC local HeadingSet = nil local MovingCount = 0 - for StaticName, StaticData in pairs( self:GetSet() ) do + for StaticName, StaticData in pairs(self:GetSet()) do local Static = StaticData -- Wrapper.Static#STATIC local Coordinate = Static:GetCoordinate() @@ -4039,7 +4038,7 @@ do -- SET_STATIC HeadingSet = Heading else local HeadingDiff = (HeadingSet - Heading + 180 + 360) % 360 - 180 - HeadingDiff = math.abs( HeadingDiff ) + HeadingDiff = math.abs(HeadingDiff) if HeadingDiff > 5 then HeadingSet = nil break @@ -4059,7 +4058,7 @@ do -- SET_STATIC local MaxThreatLevelA2G = 0 local MaxThreatText = "" - for StaticName, StaticData in pairs( self:GetSet() ) do + for StaticName, StaticData in pairs(self:GetSet()) do local ThreatStatic = StaticData -- Wrapper.Static#STATIC local ThreatLevelA2G, ThreatText = ThreatStatic:GetThreatLevel() if ThreatLevelA2G > MaxThreatLevelA2G then @@ -4068,7 +4067,7 @@ do -- SET_STATIC end end - --self:F( { MaxThreatLevelA2G = MaxThreatLevelA2G, MaxThreatText = MaxThreatText } ) + --self:F({ MaxThreatLevelA2G = MaxThreatLevelA2G, MaxThreatText = MaxThreatText }) return MaxThreatLevelA2G, MaxThreatText end @@ -4077,14 +4076,14 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param Wrapper.Static#STATIC MStatic -- @return #SET_STATIC self - function SET_STATIC:IsIncludeObject( MStatic ) - --self:F2( MStatic ) + function SET_STATIC:IsIncludeObject(MStatic) + --self:F2(MStatic) local MStaticInclude = true if self.Filter.Coalitions then local MStaticCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - --self:T(3( { "Coalition:", MStatic:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do + --self:T(3({ "Coalition:", MStatic:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName }) if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MStatic:GetCoalition() then MStaticCoalition = true end @@ -4094,8 +4093,8 @@ do -- SET_STATIC if self.Filter.Categories then local MStaticCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - --self:T(3( { "Category:", MStatic:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) + for CategoryID, CategoryName in pairs(self.Filter.Categories) do + --self:T(3({ "Category:", MStatic:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MStatic:GetDesc().category then MStaticCategory = true end @@ -4105,8 +4104,8 @@ do -- SET_STATIC if self.Filter.Types then local MStaticType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - --self:T(3( { "Type:", MStatic:GetTypeName(), TypeName } ) + for TypeID, TypeName in pairs(self.Filter.Types) do + --self:T(3({ "Type:", MStatic:GetTypeName(), TypeName }) if TypeName == MStatic:GetTypeName() then MStaticType = true end @@ -4116,8 +4115,8 @@ do -- SET_STATIC if self.Filter.Countries then local MStaticCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - --self:T(3( { "Country:", MStatic:GetCountry(), CountryName } ) + for CountryID, CountryName in pairs(self.Filter.Countries) do + --self:T(3({ "Country:", MStatic:GetCountry(), CountryName }) if country.id[CountryName] == MStatic:GetCountry() then MStaticCountry = true end @@ -4127,9 +4126,9 @@ do -- SET_STATIC if self.Filter.StaticPrefixes then local MStaticPrefix = false - for StaticPrefixId, StaticPrefix in pairs( self.Filter.StaticPrefixes ) do - --self:T(3( { "Prefix:", string.find( MStatic:GetName(), StaticPrefix, 1 ), StaticPrefix } ) - if string.find( MStatic:GetName(), StaticPrefix, 1 ) then + for StaticPrefixId, StaticPrefix in pairs(self.Filter.StaticPrefixes) do + --self:T(3({ "Prefix:", string.find(MStatic:GetName(), StaticPrefix, 1), StaticPrefix }) + if string.find(MStatic:GetName(), StaticPrefix, 1) then MStaticPrefix = true end end @@ -4138,8 +4137,8 @@ do -- SET_STATIC if self.Filter.Zones then local MStaticZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T(3( "Zone:", ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T(3("Zone:", ZoneName) if MStatic and MStatic:IsInZone(Zone) then MStaticZone = true end @@ -4152,7 +4151,7 @@ do -- SET_STATIC MStaticInclude = MStaticInclude and MClientFunc end - --self:T(2( MStaticInclude ) + --self:T(2(MStaticInclude) return MStaticInclude end @@ -4160,24 +4159,24 @@ do -- SET_STATIC -- @param #SET_STATIC self -- @param #string Delimiter (Optional) The delimiter, which is default a comma. -- @return #string The types of the @{Wrapper.Static}s delimited. - function SET_STATIC:GetTypeNames( Delimiter ) + function SET_STATIC:GetTypeNames(Delimiter) Delimiter = Delimiter or ", " local TypeReport = REPORT:New() local Types = {} - for StaticName, StaticData in pairs( self:GetSet() ) do + for StaticName, StaticData in pairs(self:GetSet()) do local Static = StaticData -- Wrapper.Static#STATIC local StaticTypeName = Static:GetTypeName() if not Types[StaticTypeName] then Types[StaticTypeName] = StaticTypeName - TypeReport:Add( StaticTypeName ) + TypeReport:Add(StaticTypeName) end end - return TypeReport:Text( Delimiter ) + return TypeReport:Text(Delimiter) end --- Get the closest static of the set with respect to a given reference coordinate. Optionally, only statics of given coalitions are considered in the search. @@ -4192,7 +4191,7 @@ do -- SET_STATIC local dmin=math.huge local gmin=nil - for GroupID, GroupData in pairs( Set ) do -- For each STATIC in SET_STATIC + for GroupID, GroupData in pairs(Set) do -- For each STATIC in SET_STATIC local group=GroupData --Wrapper.Static#STATIC if group and group:IsAlive() and (Coalitions==nil or UTILS.IsAnyInTable(Coalitions, group:GetCoalition())) then @@ -4310,9 +4309,9 @@ do -- SET_CLIENT -- DBObject = SET_CLIENT:New() function SET_CLIENT:New() -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) -- #SET_CLIENT + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.CLIENTS)) -- #SET_CLIENT - self:FilterActive( false ) + self:FilterActive(false) return self end @@ -4321,12 +4320,12 @@ do -- SET_CLIENT -- @param Core.Set#SET_CLIENT self -- @param #string AddClientNames A single name or an array of CLIENT names. -- @return self - function SET_CLIENT:AddClientsByName( AddClientNames ) + function SET_CLIENT:AddClientsByName(AddClientNames) - local AddClientNamesArray = (type( AddClientNames ) == "table") and AddClientNames or { AddClientNames } + local AddClientNamesArray = (type(AddClientNames) == "table") and AddClientNames or { AddClientNames } - for AddClientID, AddClientName in pairs( AddClientNamesArray ) do - self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) + for AddClientID, AddClientName in pairs(AddClientNamesArray) do + self:Add(AddClientName, CLIENT:FindByName(AddClientName)) end return self @@ -4336,12 +4335,12 @@ do -- SET_CLIENT -- @param Core.Set#SET_CLIENT self -- @param Wrapper.Client#CLIENT RemoveClientNames A single object or an array of CLIENT objects. -- @return self - function SET_CLIENT:RemoveClientsByName( RemoveClientNames ) + function SET_CLIENT:RemoveClientsByName(RemoveClientNames) - local RemoveClientNamesArray = (type( RemoveClientNames ) == "table") and RemoveClientNames or { RemoveClientNames } + local RemoveClientNamesArray = (type(RemoveClientNames) == "table") and RemoveClientNames or { RemoveClientNames } - for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do - self:Remove( RemoveClientName.ClientName ) + for RemoveClientID, RemoveClientName in pairs(RemoveClientNamesArray) do + self:Remove(RemoveClientName.ClientName) end return self @@ -4351,7 +4350,7 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #string ClientName -- @return Wrapper.Client#CLIENT The found Client. - function SET_CLIENT:FindClient( ClientName ) + function SET_CLIENT:FindClient(ClientName) local ClientFound = self.Set[ClientName] return ClientFound @@ -4361,14 +4360,14 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #string Callsigns Can be a single string e.g. "Ford", or a table of strings e.g. {"Uzi","Enfield","Chevy"}. Refers to the callsigns as they can be set in the mission editor. -- @return #SET_CLIENT self - function SET_CLIENT:FilterCallsigns( Callsigns ) + function SET_CLIENT:FilterCallsigns(Callsigns) if not self.Filter.Callsigns then self.Filter.Callsigns = {} end - if type( Callsigns ) ~= "table" then + if type(Callsigns) ~= "table" then Callsigns = { Callsigns } end - for callsignID, callsign in pairs( Callsigns ) do + for callsignID, callsign in pairs(Callsigns) do self.Filter.Callsigns[callsign] = callsign end return self @@ -4378,50 +4377,38 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #string Playernames Can be a single string e.g. "Apple", or a table of strings e.g. {"Walter","Hermann","Gonzo"}. Useful if you have e.g. a common squadron prefix. -- @return #SET_CLIENT self - function SET_CLIENT:FilterPlayernames( Playernames ) + function SET_CLIENT:FilterPlayernames(Playernames) if not self.Filter.Playernames then self.Filter.Playernames = {} end - if type( Playernames ) ~= "table" then + if type(Playernames) ~= "table" then Playernames = { Playernames } end - for PlayernameID, playername in pairs( Playernames ) do + for PlayernameID, playername in pairs(Playernames) do self.Filter.Playernames[playername] = playername end return self end - + --- Builds a set of clients of coalitions. -- Possible current coalitions are red, blue and neutral. -- @param #SET_CLIENT self -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @return #SET_CLIENT self - function SET_CLIENT:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self - end - + --- Builds a set of clients out of categories. -- Possible current categories are plane, helicopter, ground, ship. -- @param #SET_CLIENT self -- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". -- @return #SET_CLIENT self - function SET_CLIENT:FilterCategories( Categories ) + function SET_CLIENT:FilterCategories(Categories) if not self.Filter.Categories then self.Filter.Categories = {} end - if type( Categories ) ~= "table" then + if type(Categories) ~= "table" then Categories = { Categories } end - for CategoryID, Category in pairs( Categories ) do + for CategoryID, Category in pairs(Categories) do self.Filter.Categories[Category] = Category end return self @@ -4432,14 +4419,14 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #string Types Can take those type strings known within DCS world. -- @return #SET_CLIENT self - function SET_CLIENT:FilterTypes( Types ) + function SET_CLIENT:FilterTypes(Types) if not self.Filter.Types then self.Filter.Types = {} end - if type( Types ) ~= "table" then + if type(Types) ~= "table" then Types = { Types } end - for TypeID, Type in pairs( Types ) do + for TypeID, Type in pairs(Types) do self.Filter.Types[Type] = Type end return self @@ -4450,14 +4437,14 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #string Countries Can take those country strings known within DCS world. -- @return #SET_CLIENT self - function SET_CLIENT:FilterCountries( Countries ) + function SET_CLIENT:FilterCountries(Countries) if not self.Filter.Countries then self.Filter.Countries = {} end - if type( Countries ) ~= "table" then + if type(Countries) ~= "table" then Countries = { Countries } end - for CountryID, Country in pairs( Countries ) do + for CountryID, Country in pairs(Countries) do self.Filter.Countries[Country] = Country end return self @@ -4468,14 +4455,14 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #string Prefixes The string pattern(s) that needs to be contained in the unit/pilot name. Can also be passed as a `#table` of strings. -- @return #SET_CLIENT self - function SET_CLIENT:FilterPrefixes( Prefixes ) + function SET_CLIENT:FilterPrefixes(Prefixes) if not self.Filter.ClientPrefixes then self.Filter.ClientPrefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.ClientPrefixes[Prefix] = Prefix end return self @@ -4506,7 +4493,7 @@ do -- SET_CLIENT end return outcome end, Prefixes - ) + ) return self end @@ -4522,15 +4509,15 @@ do -- SET_CLIENT -- ClientSet = SET_CLIENT:New():FilterActive():FilterStart() -- -- -- Include only active clients to the set of the blue coalition, and filter one time. - -- ClientSet = SET_CLIENT:New():FilterActive():FilterCoalition( "blue" ):FilterOnce() + -- ClientSet = SET_CLIENT:New():FilterActive():FilterCoalition("blue"):FilterOnce() -- -- -- Include only active clients to the set of the blue coalition, and filter one time. -- -- Later, reset to include back inactive clients to the set. - -- ClientSet = SET_CLIENT:New():FilterActive():FilterCoalition( "blue" ):FilterOnce() + -- ClientSet = SET_CLIENT:New():FilterActive():FilterCoalition("blue"):FilterOnce() -- ... logic ... - -- ClientSet = SET_CLIENT:New():FilterActive( false ):FilterCoalition( "blue" ):FilterOnce() + -- ClientSet = SET_CLIENT:New():FilterActive(false):FilterCoalition("blue"):FilterOnce() -- - function SET_CLIENT:FilterActive( Active ) + function SET_CLIENT:FilterActive(Active) Active = Active or not (Active == false) self.Filter.Active = Active return self @@ -4548,7 +4535,7 @@ do -- SET_CLIENT return false end end - ) + ) return self end @@ -4557,20 +4544,20 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #table Zones Table of Core.Zone#ZONE Zone objects, or a Core.Set#SET_ZONE -- @return #SET_CLIENT self - function SET_CLIENT:FilterZones( Zones ) + function SET_CLIENT:FilterZones(Zones) if not self.Filter.Zones then self.Filter.Zones = {} end local zones = {} if Zones.ClassName and Zones.ClassName == "SET_ZONE" then zones = Zones.Set - elseif type( Zones ) ~= "table" or (type( Zones ) == "table" and Zones.ClassName ) then + elseif type(Zones) ~= "table" or (type(Zones) == "table" and Zones.ClassName) then self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") return self else zones = Zones end - for _,Zone in pairs( zones ) do + for _,Zone in pairs(zones) do local zonename = Zone:GetName() self.Filter.Zones[zonename] = Zone end @@ -4584,10 +4571,10 @@ do -- SET_CLIENT local Database = _DATABASE.CLIENTS - for ObjectName, Object in pairs( Database ) do - if self:IsIncludeObject( Object ) and self:IsNotInSet(Object) then - self:Add( ObjectName, Object ) - elseif (not self:IsIncludeObject( Object )) and self:IsInSet(Object) then + for ObjectName, Object in pairs(Database) do + if self:IsIncludeObject(Object) and self:IsNotInSet(Object) then + self:Add(ObjectName, Object) + elseif (not self:IsIncludeObject(Object)) and self:IsInSet(Object) then self:Remove(ObjectName) end end @@ -4633,11 +4620,11 @@ do -- SET_CLIENT function SET_CLIENT:FilterStart() if _DATABASE then - self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) - self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) - --self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventPlayerEnterUnit) - self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventPlayerLeaveUnit) + self:HandleEvent(EVENTS.Birth, self._EventOnBirth) + self:HandleEvent(EVENTS.Dead, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.Crash, self._EventOnDeadOrCrash) + --self:HandleEvent(EVENTS.PlayerEnterUnit, self._EventPlayerEnterUnit) + self:HandleEvent(EVENTS.PlayerLeaveUnit, self._EventPlayerLeaveUnit) --self:SetEventPriority(1) if self.Filter.Zones then self.ZoneTimer = TIMER:New(self._ContinousZoneFilter,self) @@ -4655,14 +4642,14 @@ do -- SET_CLIENT -- @param Core.Event#EVENTDATA Event -- @return #SET_CLIENT self function SET_CLIENT:_EventPlayerEnterUnit(Event) - --self:I( "_EventPlayerEnterUnit" ) + --self:I("_EventPlayerEnterUnit") if Event.IniDCSUnit then if Event.IniObjectCategory == Object.Category.UNIT and Event.IniGroup and Event.IniGroup:IsGround() then -- CA Slot entered - local ObjectName, Object = self:AddInDatabase( Event ) - --self:T(( ObjectName, UTILS.PrintTableToLog(Object) ) - if Object and self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) + local ObjectName, Object = self:AddInDatabase(Event) + --self:T((ObjectName, UTILS.PrintTableToLog(Object)) + if Object and self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) end end end @@ -4674,13 +4661,13 @@ do -- SET_CLIENT -- @param Core.Event#EVENTDATA Event -- @return #SET_CLIENT self function SET_CLIENT:_EventPlayerLeaveUnit(Event) - --self:I( "_EventPlayerLeaveUnit" ) + --self:I("_EventPlayerLeaveUnit") if Event.IniDCSUnit then if Event.IniObjectCategory == Object.Category.UNIT and Event.IniGroup then --and Event.IniGroup:IsGround() then -- CA Slot left - local ObjectName, Object = self:FindInDatabase( Event ) + local ObjectName, Object = self:FindInDatabase(Event) if ObjectName then - self:Remove( ObjectName ) + self:Remove(ObjectName) end end end @@ -4691,8 +4678,8 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @return #SET_CLIENT self function SET_CLIENT:HandleCASlots() - self:HandleEvent(EVENTS.PlayerEnterUnit,SET_CLIENT._EventPlayerEnterUnit) - self:HandleEvent(EVENTS.PlayerLeaveUnit,SET_CLIENT._EventPlayerLeaveUnit) + self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventPlayerEnterUnit) + --self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventPlayerLeaveUnit) -- Already set in :FilterStart() self:FilterFunction(function(client) if client and client:IsAlive() and client:IsGround() then return true else return false end end) return self end @@ -4703,8 +4690,8 @@ do -- SET_CLIENT -- @param Core.Event#EVENTDATA Event -- @return #string The name of the CLIENT -- @return #table The CLIENT - function SET_CLIENT:AddInDatabase( Event ) - --self:F3( { Event } ) + function SET_CLIENT:AddInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -4715,8 +4702,8 @@ do -- SET_CLIENT -- @param Core.Event#EVENTDATA Event -- @return #string The name of the CLIENT -- @return #table The CLIENT - function SET_CLIENT:FindInDatabase( Event ) - --self:F3( { Event } ) + function SET_CLIENT:FindInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -4725,10 +4712,10 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. -- @return #SET_CLIENT self - function SET_CLIENT:ForEachClient( IteratorFunction, ... ) - --self:F2( arg ) + function SET_CLIENT:ForEachClient(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -4738,19 +4725,19 @@ do -- SET_CLIENT -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. -- @return #SET_CLIENT self - function SET_CLIENT:ForEachClientInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_CLIENT:ForEachClientInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsInZone( ZoneObject ) then + function(ZoneObject, ClientObject) + if ClientObject:IsInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -4760,19 +4747,19 @@ do -- SET_CLIENT -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. -- @return #SET_CLIENT self - function SET_CLIENT:ForEachClientNotInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_CLIENT:ForEachClientNotInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsNotInZone( ZoneObject ) then + function(ZoneObject, ClientObject) + if ClientObject:IsNotInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -4785,7 +4772,7 @@ do -- SET_CLIENT local Set = self:GetSet() local CountU = 0 - for UnitID, UnitData in pairs( Set ) do -- For each GROUP in SET_GROUP + for UnitID, UnitData in pairs(Set) do -- For each GROUP in SET_GROUP if UnitData and UnitData:IsAlive() then CountU = CountU + 1 end @@ -4828,7 +4815,7 @@ do -- SET_CLIENT -- if client:GetPlayerName() == "Exclude Me" then isinclude = false end -- return isinclude -- end - -- ):FilterOnce() + -- ):FilterOnce() -- BASE:I(groundset:Flush()) @@ -4836,8 +4823,8 @@ do -- SET_CLIENT -- @param #SET_CLIENT self -- @param Wrapper.Client#CLIENT MClient -- @return #SET_CLIENT self - function SET_CLIENT:IsIncludeObject( MClient ) - --self:F2( MClient ) + function SET_CLIENT:IsIncludeObject(MClient) + --self:F2(MClient) local MClientInclude = true @@ -4849,94 +4836,94 @@ do -- SET_CLIENT if self.Filter.Active == false or (self.Filter.Active == true and MClient:IsActive() == true and MClient:IsAlive() == true) then MClientActive = true end - --self:T( { "Evaluated Active", MClientActive } ) + --self:T({ "Evaluated Active", MClientActive }) MClientInclude = MClientInclude and MClientActive end if self.Filter.Coalitions and MClientInclude then local MClientCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName ) + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do + 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 ClientCoalitionID and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then MClientCoalition = true end end - --self:T( { "Evaluated Coalition", MClientCoalition } ) + --self:T({ "Evaluated Coalition", MClientCoalition }) MClientInclude = MClientInclude and MClientCoalition end if self.Filter.Categories and MClientInclude then local MClientCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName ) + for CategoryID, CategoryName in pairs(self.Filter.Categories) do + local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate(MClientName) local UnitCategory = 0 if ClientCategoryID==nil and MClient:IsExist() then ClientCategoryID,UnitCategory=MClient:GetCategory() --self:T3("Applying Category Workaround .. Outcome: Obj is "..tostring(ClientCategoryID).." Unit is "..tostring(UnitCategory)) - --self:T(3( { "Category:", UnitCategory, self.FilterMeta.Categories[CategoryName], CategoryName } ) + --self:T(3({ "Category:", UnitCategory, self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and UnitCategory and self.FilterMeta.Categories[CategoryName] == UnitCategory then MClientCategory = true end --self:T3("Filter Outcome is "..tostring(MClientCategory)) else - --self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + --self:T3({ "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and ClientCategoryID and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then MClientCategory = true end end end - --self:T( { "Evaluated Category", MClientCategory } ) + --self:T({ "Evaluated Category", MClientCategory }) MClientInclude = MClientInclude and MClientCategory end if self.Filter.Types and MClientInclude then local MClientType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - --self:T3( { "Type:", MClient:GetTypeName(), TypeName } ) + for TypeID, TypeName in pairs(self.Filter.Types) do + --self:T3({ "Type:", MClient:GetTypeName(), TypeName }) if TypeName == MClient:GetTypeName() then MClientType = true end end - --self:T(( { "Evaluated Type", MClientType } ) + --self:T(({ "Evaluated Type", MClientType }) MClientInclude = MClientInclude and MClientType end if self.Filter.Countries and MClientInclude then local MClientCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - local ClientCountryID = _DATABASE:GetCountryFromClientTemplate( MClientName ) + for CountryID, CountryName in pairs(self.Filter.Countries) do + local ClientCountryID = _DATABASE:GetCountryFromClientTemplate(MClientName) if ClientCountryID==nil and MClient:IsAlive()~=nil then ClientCountryID=MClient:GetCountry() end - --self:T(3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } ) + --self:T(3({ "Country:", ClientCountryID, country.id[CountryName], CountryName }) if country.id[CountryName] and ClientCountryID and country.id[CountryName] == ClientCountryID then MClientCountry = true end end - --self:T(( { "Evaluated Country", MClientCountry } ) + --self:T(({ "Evaluated Country", MClientCountry }) MClientInclude = MClientInclude and MClientCountry end if self.Filter.ClientPrefixes and MClientInclude then local MClientPrefix = false - for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do - --self:T3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) - if string.find( MClient.UnitName, ClientPrefix, 1 ) then + for ClientPrefixId, ClientPrefix in pairs(self.Filter.ClientPrefixes) do + --self:T3({ "Prefix:", string.find(MClient.UnitName, ClientPrefix, 1), ClientPrefix }) + if string.find(MClient.UnitName, ClientPrefix, 1) then MClientPrefix = true end end - --self:T( { "Evaluated Prefix", MClientPrefix } ) + --self:T({ "Evaluated Prefix", MClientPrefix }) MClientInclude = MClientInclude and MClientPrefix end if self.Filter.Zones and MClientInclude then local MClientZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T3( "Zone:", ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T3("Zone:", ZoneName) local unit = MClient:GetClientGroupUnit() if unit and unit:IsInZone(Zone) then MClientZone = true @@ -4954,7 +4941,7 @@ do -- SET_CLIENT MClientPlayername = true end end - --self:T( { "Evaluated Playername", MClientPlayername } ) + --self:T({ "Evaluated Playername", MClientPlayername }) MClientInclude = MClientInclude and MClientPlayername end @@ -4967,7 +4954,7 @@ do -- SET_CLIENT MClientCallsigns = true end end - --self:T( { "Evaluated Callsign", MClientCallsigns } ) + --self:T({ "Evaluated Callsign", MClientCallsigns }) MClientInclude = MClientInclude and MClientCallsigns end @@ -4977,7 +4964,7 @@ do -- SET_CLIENT end end - --self:T2( MClientInclude ) + --self:T2(MClientInclude) return MClientInclude end @@ -5062,7 +5049,7 @@ do -- SET_PLAYER -- DBObject = SET_PLAYER:New() function SET_PLAYER:New() -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.PLAYERS ) ) + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.PLAYERS)) return self end @@ -5071,12 +5058,12 @@ do -- SET_PLAYER -- @param Core.Set#SET_PLAYER self -- @param #string AddClientNames A single name or an array of CLIENT names. -- @return self - function SET_PLAYER:AddClientsByName( AddClientNames ) + function SET_PLAYER:AddClientsByName(AddClientNames) - local AddClientNamesArray = (type( AddClientNames ) == "table") and AddClientNames or { AddClientNames } + local AddClientNamesArray = (type(AddClientNames) == "table") and AddClientNames or { AddClientNames } - for AddClientID, AddClientName in pairs( AddClientNamesArray ) do - self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) + for AddClientID, AddClientName in pairs(AddClientNamesArray) do + self:Add(AddClientName, CLIENT:FindByName(AddClientName)) end return self @@ -5086,12 +5073,12 @@ do -- SET_PLAYER -- @param Core.Set#SET_PLAYER self -- @param Wrapper.Client#CLIENT RemoveClientNames A single name or an array of CLIENT names. -- @return self - function SET_PLAYER:RemoveClientsByName( RemoveClientNames ) + function SET_PLAYER:RemoveClientsByName(RemoveClientNames) - local RemoveClientNamesArray = (type( RemoveClientNames ) == "table") and RemoveClientNames or { RemoveClientNames } + local RemoveClientNamesArray = (type(RemoveClientNames) == "table") and RemoveClientNames or { RemoveClientNames } - for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do - self:Remove( RemoveClientName.ClientName ) + for RemoveClientID, RemoveClientName in pairs(RemoveClientNamesArray) do + self:Remove(RemoveClientName.ClientName) end return self @@ -5101,48 +5088,36 @@ do -- SET_PLAYER -- @param #SET_PLAYER self -- @param #string PlayerName -- @return Wrapper.Client#CLIENT The found Client. - function SET_PLAYER:FindClient( PlayerName ) + function SET_PLAYER:FindClient(PlayerName) local ClientFound = self.Set[PlayerName] return ClientFound end - + --- Builds a set of clients of coalitions joined by specific players. -- Possible current coalitions are red, blue and neutral. -- @param #SET_PLAYER self -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @return #SET_PLAYER self - function SET_PLAYER:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self - end --- Builds a set of players in zones. -- @param #SET_PLAYER self -- @param #table Zones Table of Core.Zone#ZONE Zone objects, or a Core.Set#SET_ZONE -- @return #SET_PLAYER self - function SET_PLAYER:FilterZones( Zones ) + function SET_PLAYER:FilterZones(Zones) if not self.Filter.Zones then self.Filter.Zones = {} end local zones = {} if Zones.ClassName and Zones.ClassName == "SET_ZONE" then zones = Zones.Set - elseif type( Zones ) ~= "table" or (type( Zones ) == "table" and Zones.ClassName ) then + elseif type(Zones) ~= "table" or (type(Zones) == "table" and Zones.ClassName) then self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") return self else zones = Zones end - for _,Zone in pairs( zones ) do + for _,Zone in pairs(zones) do local zonename = Zone:GetName() self.Filter.Zones[zonename] = Zone end @@ -5155,14 +5130,14 @@ do -- SET_PLAYER -- @param #SET_PLAYER self -- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". -- @return #SET_PLAYER self - function SET_PLAYER:FilterCategories( Categories ) + function SET_PLAYER:FilterCategories(Categories) if not self.Filter.Categories then self.Filter.Categories = {} end - if type( Categories ) ~= "table" then + if type(Categories) ~= "table" then Categories = { Categories } end - for CategoryID, Category in pairs( Categories ) do + for CategoryID, Category in pairs(Categories) do self.Filter.Categories[Category] = Category end return self @@ -5173,14 +5148,14 @@ do -- SET_PLAYER -- @param #SET_PLAYER self -- @param #string Types Can take those type strings known within DCS world. -- @return #SET_PLAYER self - function SET_PLAYER:FilterTypes( Types ) + function SET_PLAYER:FilterTypes(Types) if not self.Filter.Types then self.Filter.Types = {} end - if type( Types ) ~= "table" then + if type(Types) ~= "table" then Types = { Types } end - for TypeID, Type in pairs( Types ) do + for TypeID, Type in pairs(Types) do self.Filter.Types[Type] = Type end return self @@ -5191,14 +5166,14 @@ do -- SET_PLAYER -- @param #SET_PLAYER self -- @param #string Countries Can take those country strings known within DCS world. -- @return #SET_PLAYER self - function SET_PLAYER:FilterCountries( Countries ) + function SET_PLAYER:FilterCountries(Countries) if not self.Filter.Countries then self.Filter.Countries = {} end - if type( Countries ) ~= "table" then + if type(Countries) ~= "table" then Countries = { Countries } end - for CountryID, Country in pairs( Countries ) do + for CountryID, Country in pairs(Countries) do self.Filter.Countries[Country] = Country end return self @@ -5209,14 +5184,14 @@ do -- SET_PLAYER -- @param #SET_PLAYER self -- @param #string Prefixes The string pattern(s) that needs to be contained in the unit/pilot name. Can also be passed as a `#table` of strings. -- @return #SET_PLAYER self - function SET_PLAYER:FilterPrefixes( Prefixes ) + function SET_PLAYER:FilterPrefixes(Prefixes) if not self.Filter.ClientPrefixes then self.Filter.ClientPrefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.ClientPrefixes[Prefix] = Prefix end return self @@ -5229,10 +5204,10 @@ do -- SET_PLAYER if _DATABASE then self:_FilterStart() - self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) - self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) - self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnDeadOrCrash ) + self:HandleEvent(EVENTS.Birth, self._EventOnBirth) + self:HandleEvent(EVENTS.Dead, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.Crash, self._EventOnDeadOrCrash) + self:HandleEvent(EVENTS.PlayerLeaveUnit, self._EventOnDeadOrCrash) end return self @@ -5244,8 +5219,8 @@ do -- SET_PLAYER -- @param Core.Event#EVENTDATA Event -- @return #string The name of the CLIENT -- @return #table The CLIENT - function SET_PLAYER:AddInDatabase( Event ) - --self:F3( { Event } ) + function SET_PLAYER:AddInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -5256,8 +5231,8 @@ do -- SET_PLAYER -- @param Core.Event#EVENTDATA Event -- @return #string The name of the CLIENT -- @return #table The CLIENT - function SET_PLAYER:FindInDatabase( Event ) - --self:F3( { Event } ) + function SET_PLAYER:FindInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -5266,10 +5241,10 @@ do -- SET_PLAYER -- @param #SET_PLAYER self -- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_PLAYER. The function needs to accept a CLIENT parameter. -- @return #SET_PLAYER self - function SET_PLAYER:ForEachPlayer( IteratorFunction, ... ) - --self:F2( arg ) + function SET_PLAYER:ForEachPlayer(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -5279,19 +5254,19 @@ do -- SET_PLAYER -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_PLAYER. The function needs to accept a CLIENT parameter. -- @return #SET_PLAYER self - function SET_PLAYER:ForEachPlayerInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_PLAYER:ForEachPlayerInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsInZone( ZoneObject ) then + function(ZoneObject, ClientObject) + if ClientObject:IsInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -5301,19 +5276,19 @@ do -- SET_PLAYER -- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. -- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_PLAYER. The function needs to accept a CLIENT parameter. -- @return #SET_PLAYER self - function SET_PLAYER:ForEachPlayerNotInZone( ZoneObject, IteratorFunction, ... ) - --self:F2( arg ) + function SET_PLAYER:ForEachPlayerNotInZone(ZoneObject, IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet(), + self:ForEach(IteratorFunction, arg, self:GetSet(), -- @param Core.Zone#ZONE_BASE ZoneObject -- @param Wrapper.Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsNotInZone( ZoneObject ) then + function(ZoneObject, ClientObject) + if ClientObject:IsNotInZone(ZoneObject) then return true else return false end - end, { ZoneObject } ) + end, { ZoneObject }) return self end @@ -5322,8 +5297,8 @@ do -- SET_PLAYER -- @param #SET_PLAYER self -- @param Wrapper.Client#CLIENT MClient -- @return #SET_PLAYER self - function SET_PLAYER:IsIncludeObject( MClient ) - --self:F2( MClient ) + function SET_PLAYER:IsIncludeObject(MClient) + --self:F2(MClient) local MClientInclude = true @@ -5332,84 +5307,84 @@ do -- SET_PLAYER if self.Filter.Coalitions and MClientInclude then local MClientCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName ) + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do + local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate(MClientName) if ClientCoalitionID==nil and MClient:IsAlive()~=nil then ClientCoalitionID=MClient:GetCoalition() end - --self:T(3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + --self:T(3({ "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName }) if self.FilterMeta.Coalitions[CoalitionName] and ClientCoalitionID and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then MClientCoalition = true end end - --self:T(( { "Evaluated Coalition", MClientCoalition } ) + --self:T(({ "Evaluated Coalition", MClientCoalition }) MClientInclude = MClientInclude and MClientCoalition end if self.Filter.Categories and MClientInclude then local MClientCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName ) + for CategoryID, CategoryName in pairs(self.Filter.Categories) do + local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate(MClientName) local UnitCategory = 0 if ClientCategoryID==nil and MClient:IsExist() then ClientCategoryID,UnitCategory=MClient:GetCategory() - --self:T(3( { "Category:", UnitCategory, self.FilterMeta.Categories[CategoryName], CategoryName } ) + --self:T(3({ "Category:", UnitCategory, self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and UnitCategory and self.FilterMeta.Categories[CategoryName] == UnitCategory then MClientCategory = true end else - --self:T(3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + --self:T(3({ "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and ClientCategoryID and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then MClientCategory = true end end end - --self:T(( { "Evaluated Category", MClientCategory } ) + --self:T(({ "Evaluated Category", MClientCategory }) MClientInclude = MClientInclude and MClientCategory end if self.Filter.Types then local MClientType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - --self:T(3( { "Type:", MClient:GetTypeName(), TypeName } ) + for TypeID, TypeName in pairs(self.Filter.Types) do + --self:T(3({ "Type:", MClient:GetTypeName(), TypeName }) if TypeName == MClient:GetTypeName() then MClientType = true end end - --self:T(( { "Evaluated Type", MClientType } ) + --self:T(({ "Evaluated Type", MClientType }) MClientInclude = MClientInclude and MClientType end if self.Filter.Countries then local MClientCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - local ClientCountryID = _DATABASE:GetCountryFromClientTemplate( MClientName ) - --self:T(3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } ) + for CountryID, CountryName in pairs(self.Filter.Countries) do + local ClientCountryID = _DATABASE:GetCountryFromClientTemplate(MClientName) + --self:T(3({ "Country:", ClientCountryID, country.id[CountryName], CountryName }) if country.id[CountryName] and country.id[CountryName] == ClientCountryID then MClientCountry = true end end - --self:T(( { "Evaluated Country", MClientCountry } ) + --self:T(({ "Evaluated Country", MClientCountry }) MClientInclude = MClientInclude and MClientCountry end if self.Filter.ClientPrefixes then local MClientPrefix = false - for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do - --self:T(3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) - if string.find( MClient.UnitName, ClientPrefix, 1 ) then + for ClientPrefixId, ClientPrefix in pairs(self.Filter.ClientPrefixes) do + --self:T(3({ "Prefix:", string.find(MClient.UnitName, ClientPrefix, 1), ClientPrefix }) + if string.find(MClient.UnitName, ClientPrefix, 1) then MClientPrefix = true end end - --self:T(( { "Evaluated Prefix", MClientPrefix } ) + --self:T(({ "Evaluated Prefix", MClientPrefix }) MClientInclude = MClientInclude and MClientPrefix end end if self.Filter.Zones then local MClientZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T(3( "Zone:", ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T(3("Zone:", ZoneName) local unit = MClient:GetClientGroupUnit() if unit and unit:IsInZone(Zone) then MClientZone = true @@ -5423,7 +5398,7 @@ do -- SET_PLAYER MClientInclude = MClientInclude and MClientFunc end - --self:T(2( MClientInclude ) + --self:T(2(MClientInclude) return MClientInclude end @@ -5500,7 +5475,7 @@ do -- SET_AIRBASE -- DatabaseSet = SET_AIRBASE:New() function SET_AIRBASE:New() -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.AIRBASES ) ) + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.AIRBASES)) return self end @@ -5509,9 +5484,9 @@ do -- SET_AIRBASE -- @param Core.Set#SET_AIRBASE self -- @param Wrapper.Airbase#AIRBASE airbase Airbase that should be added to the set. -- @return self - function SET_AIRBASE:AddAirbase( airbase ) + function SET_AIRBASE:AddAirbase(airbase) - self:Add( airbase:GetName(), airbase ) + self:Add(airbase:GetName(), airbase) return self end @@ -5520,12 +5495,12 @@ do -- SET_AIRBASE -- @param Core.Set#SET_AIRBASE self -- @param #string AddAirbaseNames A single name or an array of AIRBASE names. -- @return self - function SET_AIRBASE:AddAirbasesByName( AddAirbaseNames ) + function SET_AIRBASE:AddAirbasesByName(AddAirbaseNames) - local AddAirbaseNamesArray = (type( AddAirbaseNames ) == "table") and AddAirbaseNames or { AddAirbaseNames } + local AddAirbaseNamesArray = (type(AddAirbaseNames) == "table") and AddAirbaseNames or { AddAirbaseNames } - for AddAirbaseID, AddAirbaseName in pairs( AddAirbaseNamesArray ) do - self:Add( AddAirbaseName, AIRBASE:FindByName( AddAirbaseName ) ) + for AddAirbaseID, AddAirbaseName in pairs(AddAirbaseNamesArray) do + self:Add(AddAirbaseName, AIRBASE:FindByName(AddAirbaseName)) end return self @@ -5535,12 +5510,12 @@ do -- SET_AIRBASE -- @param Core.Set#SET_AIRBASE self -- @param Wrapper.Airbase#AIRBASE RemoveAirbaseNames A single name or an array of AIRBASE names. -- @return self - function SET_AIRBASE:RemoveAirbasesByName( RemoveAirbaseNames ) + function SET_AIRBASE:RemoveAirbasesByName(RemoveAirbaseNames) - local RemoveAirbaseNamesArray = (type( RemoveAirbaseNames ) == "table") and RemoveAirbaseNames or { RemoveAirbaseNames } + local RemoveAirbaseNamesArray = (type(RemoveAirbaseNames) == "table") and RemoveAirbaseNames or { RemoveAirbaseNames } - for RemoveAirbaseID, RemoveAirbaseName in pairs( RemoveAirbaseNamesArray ) do - self:Remove( RemoveAirbaseName ) + for RemoveAirbaseID, RemoveAirbaseName in pairs(RemoveAirbaseNamesArray) do + self:Remove(RemoveAirbaseName) end return self @@ -5550,7 +5525,7 @@ do -- SET_AIRBASE -- @param #SET_AIRBASE self -- @param #string AirbaseName -- @return Wrapper.Airbase#AIRBASE The found Airbase. - function SET_AIRBASE:FindAirbase( AirbaseName ) + function SET_AIRBASE:FindAirbase(AirbaseName) local AirbaseFound = self.Set[AirbaseName] return AirbaseFound @@ -5561,16 +5536,16 @@ do -- SET_AIRBASE -- @param Core.Point#COORDINATE Coordinate -- @param #number Range -- @return Wrapper.Airbase#AIRBASE The found Airbase. - function SET_AIRBASE:FindAirbaseInRange( Coordinate, Range ) + function SET_AIRBASE:FindAirbaseInRange(Coordinate, Range) local AirbaseFound = nil - for AirbaseName, AirbaseObject in pairs( self.Set ) do + for AirbaseName, AirbaseObject in pairs(self.Set) do local AirbaseCoordinate = AirbaseObject:GetCoordinate() - local Distance = Coordinate:Get2DDistance( AirbaseCoordinate ) + local Distance = Coordinate:Get2DDistance(AirbaseCoordinate) - --self:F( { Distance = Distance } ) + --self:F({ Distance = Distance }) if Distance <= Range then AirbaseFound = AirbaseObject @@ -5588,42 +5563,30 @@ do -- SET_AIRBASE function SET_AIRBASE:GetRandomAirbase() local RandomAirbase = self:GetRandom() - --self:F( { RandomAirbase = RandomAirbase:GetName() } ) + --self:F({ RandomAirbase = RandomAirbase:GetName() }) return RandomAirbase end - + --- Builds a set of airbases of coalitions. -- Possible current coalitions are red, blue and neutral. -- @param #SET_AIRBASE self -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @return #SET_AIRBASE self - function SET_AIRBASE:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self - end --- Builds a set of airbases out of categories. -- Possible current categories are plane, helicopter, ground, ship. -- @param #SET_AIRBASE self -- @param #string Categories Can take the following values: "airdrome", "helipad", "ship". -- @return #SET_AIRBASE self - function SET_AIRBASE:FilterCategories( Categories ) + function SET_AIRBASE:FilterCategories(Categories) if not self.Filter.Categories then self.Filter.Categories = {} end - if type( Categories ) ~= "table" then + if type(Categories) ~= "table" then Categories = { Categories } end - for CategoryID, Category in pairs( Categories ) do + for CategoryID, Category in pairs(Categories) do self.Filter.Categories[Category] = Category end return self @@ -5633,20 +5596,20 @@ do -- SET_AIRBASE -- @param #SET_AIRBASE self -- @param #table Zones Table of Core.Zone#ZONE Zone objects, or a Core.Set#SET_ZONE -- @return #SET_AIRBASE self - function SET_AIRBASE:FilterZones( Zones ) + function SET_AIRBASE:FilterZones(Zones) if not self.Filter.Zones then self.Filter.Zones = {} end local zones = {} if Zones.ClassName and Zones.ClassName == "SET_ZONE" then zones = Zones.Set - elseif type( Zones ) ~= "table" or (type( Zones ) == "table" and Zones.ClassName ) then + elseif type(Zones) ~= "table" or (type(Zones) == "table" and Zones.ClassName) then self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") return self else zones = Zones end - for _,Zone in pairs( zones ) do + for _,Zone in pairs(zones) do local zonename = Zone:GetName() --self:T((zonename) self.Filter.Zones[zonename] = Zone @@ -5662,15 +5625,15 @@ do -- SET_AIRBASE if _DATABASE then -- We use the BaseCaptured event, which is generated by DCS when a base got captured. - self:HandleEvent( EVENTS.BaseCaptured ) - self:HandleEvent( EVENTS.Dead ) + self:HandleEvent(EVENTS.BaseCaptured) + self:HandleEvent(EVENTS.Dead) -- We initialize the first set. - for ObjectName, Object in pairs( self.Database ) do - if self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) + for ObjectName, Object in pairs(self.Database) do + if self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) else - self:RemoveAirbasesByName( ObjectName ) + self:RemoveAirbasesByName(ObjectName) end end end @@ -5681,16 +5644,16 @@ do -- SET_AIRBASE --- Base capturing event. -- @param #SET_AIRBASE self -- @param Core.Event#EVENT EventData - function SET_AIRBASE:OnEventBaseCaptured( EventData ) + function SET_AIRBASE:OnEventBaseCaptured(EventData) -- When a base got captured, we reevaluate the set. - for ObjectName, Object in pairs( self.Database ) do - if self:IsIncludeObject( Object ) then + for ObjectName, Object in pairs(self.Database) do + if self:IsIncludeObject(Object) then -- We add captured bases on yet in the set. - self:Add( ObjectName, Object ) + self:Add(ObjectName, Object) else -- We remove captured bases that are not anymore part of the set. - self:RemoveAirbasesByName( ObjectName ) + self:RemoveAirbasesByName(ObjectName) end end @@ -5699,12 +5662,12 @@ do -- SET_AIRBASE --- Dead event. -- @param #SET_AIRBASE self -- @param Core.Event#EVENT EventData - function SET_AIRBASE:OnEventDead( EventData ) + function SET_AIRBASE:OnEventDead(EventData) - local airbaseName, airbase = self:FindInDatabase( EventData ) + local airbaseName, airbase = self:FindInDatabase(EventData) if airbase and (airbase:IsShip() or airbase:IsHelipad()) then - self:RemoveAirbasesByName( airbaseName ) + self:RemoveAirbasesByName(airbaseName) end end @@ -5715,7 +5678,7 @@ do -- SET_AIRBASE -- @param Core.Event#EVENTDATA Event Event data. -- @return #string The name of the AIRBASE. -- @return Wrapper.Airbase#AIRBASE The AIRBASE object. - function SET_AIRBASE:AddInDatabase( Event ) + function SET_AIRBASE:AddInDatabase(Event) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -5725,8 +5688,8 @@ do -- SET_AIRBASE -- @param Core.Event#EVENTDATA Event Event data. -- @return #string The name of the AIRBASE. -- @return Wrapper.Airbase#AIRBASE The AIRBASE object. - function SET_AIRBASE:FindInDatabase( Event ) - --self:F3( { Event } ) + function SET_AIRBASE:FindInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -5735,10 +5698,10 @@ do -- SET_AIRBASE -- @param #SET_AIRBASE self -- @param #function IteratorFunction The function that will be called when there is an alive AIRBASE in the SET_AIRBASE. The function needs to accept a AIRBASE parameter. -- @return #SET_AIRBASE self - function SET_AIRBASE:ForEachAirbase( IteratorFunction, ... ) - --self:F2( arg ) + function SET_AIRBASE:ForEachAirbase(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -5747,10 +5710,10 @@ do -- SET_AIRBASE -- @param #SET_AIRBASE self -- @param Core.Point#COORDINATE Coordinate A @{Core.Point#COORDINATE} object from where to evaluate the closest @{Wrapper.Airbase#AIRBASE}. -- @return Wrapper.Airbase#AIRBASE The closest @{Wrapper.Airbase#AIRBASE}. - function SET_AIRBASE:FindNearestAirbaseFromPointVec2( Coordinate ) - --self:F2( Coordinate ) + function SET_AIRBASE:FindNearestAirbaseFromPointVec2(Coordinate) + --self:F2(Coordinate) - local NearestAirbase = self:FindNearestObjectFromPointVec2( Coordinate ) + local NearestAirbase = self:FindNearestObjectFromPointVec2(Coordinate) return NearestAirbase end @@ -5758,8 +5721,8 @@ do -- SET_AIRBASE -- @param #SET_AIRBASE self -- @param Wrapper.Airbase#AIRBASE MAirbase -- @return #SET_AIRBASE self - function SET_AIRBASE:IsIncludeObject( MAirbase ) - --self:F2( MAirbase ) + function SET_AIRBASE:IsIncludeObject(MAirbase) + --self:F2(MAirbase) local MAirbaseInclude = true @@ -5768,39 +5731,39 @@ do -- SET_AIRBASE if self.Filter.Coalitions then local MAirbaseCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - local AirbaseCoalitionID = _DATABASE:GetCoalitionFromAirbase( MAirbaseName ) - --self:T(3( { "Coalition:", AirbaseCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do + local AirbaseCoalitionID = _DATABASE:GetCoalitionFromAirbase(MAirbaseName) + --self:T(3({ "Coalition:", AirbaseCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName }) if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == AirbaseCoalitionID then MAirbaseCoalition = true end end - --self:T(( { "Evaluated Coalition", MAirbaseCoalition } ) + --self:T(({ "Evaluated Coalition", MAirbaseCoalition }) MAirbaseInclude = MAirbaseInclude and MAirbaseCoalition end if self.Filter.Categories and MAirbaseInclude then local MAirbaseCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - local AirbaseCategoryID = _DATABASE:GetCategoryFromAirbase( MAirbaseName ) - --self:T(3( { "Category:", AirbaseCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + for CategoryID, CategoryName in pairs(self.Filter.Categories) do + local AirbaseCategoryID = _DATABASE:GetCategoryFromAirbase(MAirbaseName) + --self:T(3({ "Category:", AirbaseCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName }) if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == AirbaseCategoryID then MAirbaseCategory = true end end - --self:T(( { "Evaluated Category", MAirbaseCategory } ) + --self:T(({ "Evaluated Category", MAirbaseCategory }) MAirbaseInclude = MAirbaseInclude and MAirbaseCategory end if self.Filter.Zones and MAirbaseInclude then local MAirbaseZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T(( "Zone:", ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T(("Zone:", ZoneName) local coord = MAirbase:GetCoordinate() if coord and Zone:IsCoordinateInZone(coord) then MAirbaseZone = true end - --self:T(( { "Evaluated Zone", MSceneryZone } ) + --self:T(({ "Evaluated Zone", MSceneryZone }) end MAirbaseInclude = MAirbaseInclude and MAirbaseZone end @@ -5812,7 +5775,7 @@ do -- SET_AIRBASE MAirbaseInclude = MAirbaseInclude and MClientFunc end - --self:T(2( MAirbaseInclude ) + --self:T(2(MAirbaseInclude) return MAirbaseInclude end @@ -5891,111 +5854,99 @@ do -- SET_CARGO -- DatabaseSet = SET_CARGO:New() function SET_CARGO:New() -- R2.1 -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CARGOS ) ) -- #SET_CARGO + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.CARGOS)) -- #SET_CARGO return self end - --- (R2.1) Add CARGO to SET_CARGO. + --- Add CARGO to SET_CARGO. -- @param Core.Set#SET_CARGO self -- @param Cargo.Cargo#CARGO Cargo A single cargo. -- @return Core.Set#SET_CARGO self - function SET_CARGO:AddCargo( Cargo ) -- R2.4 + function SET_CARGO:AddCargo(Cargo) -- R2.4 - self:Add( Cargo:GetName(), Cargo ) + self:Add(Cargo:GetName(), Cargo) return self end - --- (R2.1) Add CARGOs to SET_CARGO. + --- Add CARGOs to SET_CARGO. -- @param Core.Set#SET_CARGO self -- @param #string AddCargoNames A single name or an array of CARGO names. -- @return Core.Set#SET_CARGO self - function SET_CARGO:AddCargosByName( AddCargoNames ) -- R2.1 + function SET_CARGO:AddCargosByName(AddCargoNames) -- R2.1 - local AddCargoNamesArray = (type( AddCargoNames ) == "table") and AddCargoNames or { AddCargoNames } + local AddCargoNamesArray = (type(AddCargoNames) == "table") and AddCargoNames or { AddCargoNames } - for AddCargoID, AddCargoName in pairs( AddCargoNamesArray ) do - self:Add( AddCargoName, CARGO:FindByName( AddCargoName ) ) + for AddCargoID, AddCargoName in pairs(AddCargoNamesArray) do + self:Add(AddCargoName, CARGO:FindByName(AddCargoName)) end return self end - --- (R2.1) Remove CARGOs from SET_CARGO. + --- Remove CARGOs from SET_CARGO. -- @param Core.Set#SET_CARGO self -- @param Cargo.Cargo#CARGO RemoveCargoNames A single name or an array of CARGO names. -- @return Core.Set#SET_CARGO self - function SET_CARGO:RemoveCargosByName( RemoveCargoNames ) -- R2.1 + function SET_CARGO:RemoveCargosByName(RemoveCargoNames) -- R2.1 - local RemoveCargoNamesArray = (type( RemoveCargoNames ) == "table") and RemoveCargoNames or { RemoveCargoNames } + local RemoveCargoNamesArray = (type(RemoveCargoNames) == "table") and RemoveCargoNames or { RemoveCargoNames } - for RemoveCargoID, RemoveCargoName in pairs( RemoveCargoNamesArray ) do - self:Remove( RemoveCargoName.CargoName ) + for RemoveCargoID, RemoveCargoName in pairs(RemoveCargoNamesArray) do + self:Remove(RemoveCargoName.CargoName) end return self end - --- (R2.1) Finds a Cargo based on the Cargo Name. + --- Finds a Cargo based on the Cargo Name. -- @param #SET_CARGO self -- @param #string CargoName -- @return Cargo.Cargo#CARGO The found Cargo. - function SET_CARGO:FindCargo( CargoName ) -- R2.1 + function SET_CARGO:FindCargo(CargoName) -- R2.1 local CargoFound = self.Set[CargoName] return CargoFound end - - --- (R2.1) Builds a set of cargos of coalitions. + + --- Builds a set of cargos of coalitions. -- Possible current coalitions are red, blue and neutral. -- @param #SET_CARGO self -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @return #SET_CARGO self - function SET_CARGO:FilterCoalitions( Coalitions ) -- R2.1 - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self - end - - --- (R2.1) Builds a set of cargos of defined cargo types. + + --- Builds a set of cargos of defined cargo types. -- Possible current types are those types known within DCS world. -- @param #SET_CARGO self -- @param #string Types Can take those type strings known within DCS world. -- @return #SET_CARGO self - function SET_CARGO:FilterTypes( Types ) -- R2.1 + function SET_CARGO:FilterTypes(Types) -- R2.1 if not self.Filter.Types then self.Filter.Types = {} end - if type( Types ) ~= "table" then + if type(Types) ~= "table" then Types = { Types } end - for TypeID, Type in pairs( Types ) do + for TypeID, Type in pairs(Types) do self.Filter.Types[Type] = Type end return self end - --- (R2.1) Builds a set of cargos of defined countries. + --- Builds a set of cargos of defined countries. -- Possible current countries are those known within DCS world. -- @param #SET_CARGO self -- @param #string Countries Can take those country strings known within DCS world. -- @return #SET_CARGO self - function SET_CARGO:FilterCountries( Countries ) -- R2.1 + function SET_CARGO:FilterCountries(Countries) -- R2.1 if not self.Filter.Countries then self.Filter.Countries = {} end - if type( Countries ) ~= "table" then + if type(Countries) ~= "table" then Countries = { Countries } end - for CountryID, Country in pairs( Countries ) do + for CountryID, Country in pairs(Countries) do self.Filter.Countries[Country] = Country end return self @@ -6006,28 +5957,28 @@ do -- SET_CARGO -- @param #SET_CARGO self -- @param #string Prefixes The string pattern(s) that need to be in the cargo name. Can also be passed as a `#table` of strings. -- @return #SET_CARGO self - function SET_CARGO:FilterPrefixes( Prefixes ) -- R2.1 + function SET_CARGO:FilterPrefixes(Prefixes) -- R2.1 if not self.Filter.CargoPrefixes then self.Filter.CargoPrefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.CargoPrefixes[Prefix] = Prefix end return self end - --- (R2.1) Starts the filtering. + --- Starts the filtering. -- @param #SET_CARGO self -- @return #SET_CARGO self function SET_CARGO:FilterStart() -- R2.1 if _DATABASE then self:_FilterStart() - self:HandleEvent( EVENTS.NewCargo ) - self:HandleEvent( EVENTS.DeleteCargo ) + self:HandleEvent(EVENTS.NewCargo) + self:HandleEvent(EVENTS.DeleteCargo) end return self @@ -6038,67 +5989,67 @@ do -- SET_CARGO -- @return #SET_CARGO self function SET_CARGO:FilterStop() - self:UnHandleEvent( EVENTS.NewCargo ) - self:UnHandleEvent( EVENTS.DeleteCargo ) + self:UnHandleEvent(EVENTS.NewCargo) + self:UnHandleEvent(EVENTS.DeleteCargo) return self end - --- (R2.1) Handles the Database to check on an event (birth) that the Object was added in the Database. + --- Handles the Database to check on an event (birth) that the Object was added in the Database. -- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! -- @param #SET_CARGO self -- @param Core.Event#EVENTDATA Event -- @return #string The name of the CARGO -- @return #table The CARGO - function SET_CARGO:AddInDatabase( Event ) -- R2.1 - --self:F3( { Event } ) + function SET_CARGO:AddInDatabase(Event) -- R2.1 + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end - --- (R2.1) Handles the Database to check on any event that Object exists in the Database. + --- Handles the Database to check on any event that Object exists in the Database. -- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! -- @param #SET_CARGO self -- @param Core.Event#EVENTDATA Event -- @return #string The name of the CARGO -- @return #table The CARGO - function SET_CARGO:FindInDatabase( Event ) -- R2.1 - --self:F3( { Event } ) + function SET_CARGO:FindInDatabase(Event) -- R2.1 + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end - --- (R2.1) Iterate the SET_CARGO and call an iterator function for each CARGO, providing the CARGO and optional parameters. + --- Iterate the SET_CARGO and call an iterator function for each CARGO, providing the CARGO and optional parameters. -- @param #SET_CARGO self -- @param #function IteratorFunction The function that will be called when there is an alive CARGO in the SET_CARGO. The function needs to accept a CARGO parameter. -- @return #SET_CARGO self - function SET_CARGO:ForEachCargo( IteratorFunction, ... ) -- R2.1 - --self:F2( arg ) + function SET_CARGO:ForEachCargo(IteratorFunction, ...) -- R2.1 + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end - --- (R2.1) Iterate the SET_CARGO while identifying the nearest @{Cargo.Cargo#CARGO} from a @{Core.Point#COORDINATE}. + --- Iterate the SET_CARGO while identifying the nearest @{Cargo.Cargo#CARGO} from a @{Core.Point#COORDINATE}. -- @param #SET_CARGO self -- @param Core.Point#COORDINATE Coordinate A @{Core.Point#COORDINATE} object from where to evaluate the closest @{Cargo.Cargo#CARGO}. -- @return Cargo.Cargo#CARGO The closest @{Cargo.Cargo#CARGO}. - function SET_CARGO:FindNearestCargoFromPointVec2( Coordinate ) -- R2.1 - --self:F2( Coordinate ) + function SET_CARGO:FindNearestCargoFromPointVec2(Coordinate) -- R2.1 + --self:F2(Coordinate) - local NearestCargo = self:FindNearestObjectFromPointVec2( Coordinate ) + local NearestCargo = self:FindNearestObjectFromPointVec2(Coordinate) return NearestCargo end --- -- @param #SET_CARGO self - function SET_CARGO:FirstCargoWithState( State ) + function SET_CARGO:FirstCargoWithState(State) local FirstCargo = nil - for CargoName, Cargo in pairs( self.Set ) do - if Cargo:Is( State ) then + for CargoName, Cargo in pairs(self.Set) do + if Cargo:Is(State) then FirstCargo = Cargo break end @@ -6109,12 +6060,12 @@ do -- SET_CARGO --- -- @param #SET_CARGO self - function SET_CARGO:FirstCargoWithStateAndNotDeployed( State ) + function SET_CARGO:FirstCargoWithStateAndNotDeployed(State) local FirstCargo = nil - for CargoName, Cargo in pairs( self.Set ) do - if Cargo:Is( State ) and not Cargo:IsDeployed() then + for CargoName, Cargo in pairs(self.Set) do + if Cargo:Is(State) and not Cargo:IsDeployed() then FirstCargo = Cargo break end @@ -6127,7 +6078,7 @@ do -- SET_CARGO -- @param #SET_CARGO self -- @return Cargo.Cargo#CARGO The first @{Cargo.Cargo#CARGO}. function SET_CARGO:FirstCargoUnLoaded() - local FirstCargo = self:FirstCargoWithState( "UnLoaded" ) + local FirstCargo = self:FirstCargoWithState("UnLoaded") return FirstCargo end @@ -6135,7 +6086,7 @@ do -- SET_CARGO -- @param #SET_CARGO self -- @return Cargo.Cargo#CARGO The first @{Cargo.Cargo#CARGO}. function SET_CARGO:FirstCargoUnLoadedAndNotDeployed() - local FirstCargo = self:FirstCargoWithStateAndNotDeployed( "UnLoaded" ) + local FirstCargo = self:FirstCargoWithStateAndNotDeployed("UnLoaded") return FirstCargo end @@ -6143,7 +6094,7 @@ do -- SET_CARGO -- @param #SET_CARGO self -- @return Cargo.Cargo#CARGO The first @{Cargo.Cargo#CARGO}. function SET_CARGO:FirstCargoLoaded() - local FirstCargo = self:FirstCargoWithState( "Loaded" ) + local FirstCargo = self:FirstCargoWithState("Loaded") return FirstCargo end @@ -6151,16 +6102,16 @@ do -- SET_CARGO -- @param #SET_CARGO self -- @return Cargo.Cargo#CARGO The first @{Cargo.Cargo#CARGO}. function SET_CARGO:FirstCargoDeployed() - local FirstCargo = self:FirstCargoWithState( "Deployed" ) + local FirstCargo = self:FirstCargoWithState("Deployed") return FirstCargo end - --- (R2.1) + --- -- @param #SET_CARGO self -- @param AI.AI_Cargo#AI_CARGO MCargo -- @return #SET_CARGO self - function SET_CARGO:IsIncludeObject( MCargo ) -- R2.1 - --self:F2( MCargo ) + function SET_CARGO:IsIncludeObject(MCargo) -- R2.1 + --self:F2(MCargo) local MCargoInclude = true @@ -6169,38 +6120,38 @@ do -- SET_CARGO if self.Filter.Coalitions then local MCargoCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do local CargoCoalitionID = MCargo:GetCoalition() - --self:T(3( { "Coalition:", CargoCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + --self:T(3({ "Coalition:", CargoCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName }) if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == CargoCoalitionID then MCargoCoalition = true end end - --self:F( { "Evaluated Coalition", MCargoCoalition } ) + --self:F({ "Evaluated Coalition", MCargoCoalition }) MCargoInclude = MCargoInclude and MCargoCoalition end if self.Filter.Types then local MCargoType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - --self:T(3( { "Type:", MCargo:GetType(), TypeName } ) + for TypeID, TypeName in pairs(self.Filter.Types) do + --self:T(3({ "Type:", MCargo:GetType(), TypeName }) if TypeName == MCargo:GetType() then MCargoType = true end end - --self:F( { "Evaluated Type", MCargoType } ) + --self:F({ "Evaluated Type", MCargoType }) MCargoInclude = MCargoInclude and MCargoType end if self.Filter.CargoPrefixes then local MCargoPrefix = false - for CargoPrefixId, CargoPrefix in pairs( self.Filter.CargoPrefixes ) do - --self:T(3( { "Prefix:", string.find( MCargo.Name, CargoPrefix, 1 ), CargoPrefix } ) - if string.find( MCargo.Name, CargoPrefix, 1 ) then + for CargoPrefixId, CargoPrefix in pairs(self.Filter.CargoPrefixes) do + --self:T(3({ "Prefix:", string.find(MCargo.Name, CargoPrefix, 1), CargoPrefix }) + if string.find(MCargo.Name, CargoPrefix, 1) then MCargoPrefix = true end end - --self:F( { "Evaluated Prefix", MCargoPrefix } ) + --self:F({ "Evaluated Prefix", MCargoPrefix }) MCargoInclude = MCargoInclude and MCargoPrefix end end @@ -6210,32 +6161,32 @@ do -- SET_CARGO MCargoInclude = MCargoInclude and MClientFunc end - --self:T(2( MCargoInclude ) + --self:T(2(MCargoInclude) return MCargoInclude end - --- (R2.1) Handles the OnEventNewCargo event for the Set. + --- Handles the OnEventNewCargo event for the Set. -- @param #SET_CARGO self -- @param Core.Event#EVENTDATA EventData - function SET_CARGO:OnEventNewCargo( EventData ) -- R2.1 + function SET_CARGO:OnEventNewCargo(EventData) -- R2.1 - --self:F( { "New Cargo", EventData } ) + --self:F({ "New Cargo", EventData }) if EventData.Cargo then - if EventData.Cargo and self:IsIncludeObject( EventData.Cargo ) then - self:Add( EventData.Cargo.Name, EventData.Cargo ) + if EventData.Cargo and self:IsIncludeObject(EventData.Cargo) then + self:Add(EventData.Cargo.Name, EventData.Cargo) end end end - --- (R2.1) Handles the OnDead or OnCrash event for alive units set. + --- Handles the OnDead or OnCrash event for alive units set. -- @param #SET_CARGO self -- @param Core.Event#EVENTDATA EventData - function SET_CARGO:OnEventDeleteCargo( EventData ) -- R2.1 - --self:F3( { EventData } ) + function SET_CARGO:OnEventDeleteCargo(EventData) -- R2.1 + --self:F3({ EventData }) if EventData.Cargo then - local Cargo = _DATABASE:FindCargo( EventData.Cargo.Name ) + local Cargo = _DATABASE:FindCargo(EventData.Cargo.Name) if Cargo and Cargo.Name then -- When cargo was deleted, it may probably be because of an S_EVENT_DEAD. @@ -6244,10 +6195,10 @@ do -- SET_CARGO -- To prevent this from happening, the Cargo object has a flag NoDestroy. -- When true, the SET_CARGO won't Remove the Cargo object from the set. -- This flag is switched off after the event handlers have been called in the EVENT class. - --self:F( { CargoNoDestroy = Cargo.NoDestroy } ) + --self:F({ CargoNoDestroy = Cargo.NoDestroy }) if Cargo.NoDestroy then else - self:Remove( Cargo.Name ) + self:Remove(Cargo.Name) end end end @@ -6315,7 +6266,7 @@ do -- SET_ZONE -- DatabaseSet = SET_ZONE:New() function SET_ZONE:New() -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.ZONES ) ) + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.ZONES)) return self end @@ -6324,12 +6275,12 @@ do -- SET_ZONE -- @param Core.Set#SET_ZONE self -- @param #string AddZoneNames A single name or an array of ZONE_BASE names. -- @return self - function SET_ZONE:AddZonesByName( AddZoneNames ) + function SET_ZONE:AddZonesByName(AddZoneNames) - local AddZoneNamesArray = (type( AddZoneNames ) == "table") and AddZoneNames or { AddZoneNames } + local AddZoneNamesArray = (type(AddZoneNames) == "table") and AddZoneNames or { AddZoneNames } - for AddAirbaseID, AddZoneName in pairs( AddZoneNamesArray ) do - self:Add( AddZoneName, ZONE:FindByName( AddZoneName ) ) + for AddAirbaseID, AddZoneName in pairs(AddZoneNamesArray) do + self:Add(AddZoneName, ZONE:FindByName(AddZoneName)) end return self @@ -6339,9 +6290,9 @@ do -- SET_ZONE -- @param Core.Set#SET_ZONE self -- @param Core.Zone#ZONE_BASE Zone A ZONE_BASE object. -- @return self - function SET_ZONE:AddZone( Zone ) + function SET_ZONE:AddZone(Zone) - self:Add( Zone:GetName(), Zone ) + self:Add(Zone:GetName(), Zone) return self end @@ -6350,12 +6301,12 @@ do -- SET_ZONE -- @param Core.Set#SET_ZONE self -- @param Core.Zone#ZONE_BASE RemoveZoneNames A single name or an array of ZONE_BASE names. -- @return self - function SET_ZONE:RemoveZonesByName( RemoveZoneNames ) + function SET_ZONE:RemoveZonesByName(RemoveZoneNames) - local RemoveZoneNamesArray = (type( RemoveZoneNames ) == "table") and RemoveZoneNames or { RemoveZoneNames } + local RemoveZoneNamesArray = (type(RemoveZoneNames) == "table") and RemoveZoneNames or { RemoveZoneNames } - for RemoveZoneID, RemoveZoneName in pairs( RemoveZoneNamesArray ) do - self:Remove( RemoveZoneName ) + for RemoveZoneID, RemoveZoneName in pairs(RemoveZoneNamesArray) do + self:Remove(RemoveZoneName) end return self @@ -6365,7 +6316,7 @@ do -- SET_ZONE -- @param #SET_ZONE self -- @param #string ZoneName -- @return Core.Zone#ZONE_BASE The found Zone. - function SET_ZONE:FindZone( ZoneName ) + function SET_ZONE:FindZone(ZoneName) local ZoneFound = self.Set[ZoneName] return ZoneFound @@ -6376,7 +6327,7 @@ do -- SET_ZONE -- @param #number margin Number of tries to find a zone -- @return Core.Zone#ZONE_BASE The random Zone. -- @return #nil if no zone in the collection. - function SET_ZONE:GetRandomZone( margin ) + function SET_ZONE:GetRandomZone(margin) local margin = margin or 100 if self:Count() ~= 0 then @@ -6389,7 +6340,7 @@ do -- SET_ZONE -- If the zone is not selected, then nil is returned by :GetZoneMaybe() and the loop continues! local counter = 0 while (not ZoneFound) or (counter < margin) do - local ZoneRandom = math.random( 1, #Index ) + local ZoneRandom = math.random(1, #Index) ZoneFound = self.Set[Index[ZoneRandom]]:GetZoneMaybe() counter = counter + 1 end @@ -6403,9 +6354,9 @@ do -- SET_ZONE --- Set a zone probability. -- @param #SET_ZONE self -- @param #string ZoneName The name of the zone. - function SET_ZONE:SetZoneProbability( ZoneName, ZoneProbability ) - local Zone = self:FindZone( ZoneName ) - Zone:SetZoneProbability( ZoneProbability ) + function SET_ZONE:SetZoneProbability(ZoneName, ZoneProbability) + local Zone = self:FindZone(ZoneName) + Zone:SetZoneProbability(ZoneProbability) end --- Builds a set of ZONEs that contain the given string in their name. @@ -6413,14 +6364,14 @@ do -- SET_ZONE -- @param #SET_ZONE self -- @param #string Prefixes The string pattern(s) that need to be contained in the zone name. Can also be passed as a `#table` of strings. -- @return #SET_ZONE self - function SET_ZONE:FilterPrefixes( Prefixes ) + function SET_ZONE:FilterPrefixes(Prefixes) if not self.Filter.Prefixes then self.Filter.Prefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.Prefixes[Prefix] = Prefix end return self @@ -6434,17 +6385,17 @@ do -- SET_ZONE if _DATABASE then -- We initialize the first set. - for ObjectName, Object in pairs( self.Database ) do - if self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) + for ObjectName, Object in pairs(self.Database) do + if self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) else - self:RemoveZonesByName( ObjectName ) + self:RemoveZonesByName(ObjectName) end end end - self:HandleEvent( EVENTS.NewZone ) - self:HandleEvent( EVENTS.DeleteZone ) + self:HandleEvent(EVENTS.NewZone) + self:HandleEvent(EVENTS.DeleteZone) return self end @@ -6454,8 +6405,8 @@ do -- SET_ZONE -- @return #SET_ZONE self function SET_ZONE:FilterStop() - self:UnHandleEvent( EVENTS.NewZone ) - self:UnHandleEvent( EVENTS.DeleteZone ) + self:UnHandleEvent(EVENTS.NewZone) + self:UnHandleEvent(EVENTS.DeleteZone) return self end @@ -6466,8 +6417,8 @@ do -- SET_ZONE -- @param Core.Event#EVENTDATA Event -- @return #string The name of the AIRBASE -- @return #table The AIRBASE - function SET_ZONE:AddInDatabase( Event ) - --self:F3( { Event } ) + function SET_ZONE:AddInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -6478,8 +6429,8 @@ do -- SET_ZONE -- @param Core.Event#EVENTDATA Event -- @return #string The name of the AIRBASE -- @return #table The AIRBASE - function SET_ZONE:FindInDatabase( Event ) - --self:F3( { Event } ) + function SET_ZONE:FindInDatabase(Event) + --self:F3({ Event }) return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] end @@ -6488,10 +6439,10 @@ do -- SET_ZONE -- @param #SET_ZONE self -- @param #function IteratorFunction The function that will be called when there is an alive ZONE in the SET_ZONE. The function needs to accept a AIRBASE parameter. -- @return #SET_ZONE self - function SET_ZONE:ForEachZone( IteratorFunction, ... ) - --self:F2( arg ) + function SET_ZONE:ForEachZone(IteratorFunction, ...) + --self:F2(arg) - self:ForEach( IteratorFunction, arg, self:GetSet() ) + self:ForEach(IteratorFunction, arg, self:GetSet()) return self end @@ -6543,8 +6494,8 @@ do -- SET_ZONE -- @param #SET_ZONE self -- @param Core.Zone#ZONE_BASE MZone -- @return #SET_ZONE self - function SET_ZONE:IsIncludeObject( MZone ) - --self:F2( MZone ) + function SET_ZONE:IsIncludeObject(MZone) + --self:F2(MZone) local MZoneInclude = true @@ -6553,13 +6504,13 @@ do -- SET_ZONE if self.Filter.Prefixes then local MZonePrefix = false - for ZonePrefixId, ZonePrefix in pairs( self.Filter.Prefixes ) do - --self:T(2( { "Prefix:", string.find( MZoneName, ZonePrefix, 1 ), ZonePrefix } ) - if string.find( MZoneName, ZonePrefix, 1 ) then + for ZonePrefixId, ZonePrefix in pairs(self.Filter.Prefixes) do + --self:T(2({ "Prefix:", string.find(MZoneName, ZonePrefix, 1), ZonePrefix }) + if string.find(MZoneName, ZonePrefix, 1) then MZonePrefix = true end end - --self:T(( { "Evaluated Prefix", MZonePrefix } ) + --self:T(({ "Evaluated Prefix", MZonePrefix }) MZoneInclude = MZoneInclude and MZonePrefix end end @@ -6569,20 +6520,20 @@ do -- SET_ZONE MZoneInclude = MZoneInclude and MClientFunc end - --self:T(2( MZoneInclude ) + --self:T(2(MZoneInclude) return MZoneInclude end --- Handles the OnEventNewZone event for the Set. -- @param #SET_ZONE self -- @param Core.Event#EVENTDATA EventData - function SET_ZONE:OnEventNewZone( EventData ) -- R2.1 + function SET_ZONE:OnEventNewZone(EventData) -- R2.1 - --self:F( { "New Zone", EventData } ) + --self:F({ "New Zone", EventData }) if EventData.Zone then - if EventData.Zone and self:IsIncludeObject( EventData.Zone ) then - self:Add( EventData.Zone.ZoneName, EventData.Zone ) + if EventData.Zone and self:IsIncludeObject(EventData.Zone) then + self:Add(EventData.Zone.ZoneName, EventData.Zone) end end end @@ -6590,11 +6541,11 @@ do -- SET_ZONE --- Handles the OnDead or OnCrash event for alive units set. -- @param #SET_ZONE self -- @param Core.Event#EVENTDATA EventData - function SET_ZONE:OnEventDeleteZone( EventData ) -- R2.1 - --self:F3( { EventData } ) + function SET_ZONE:OnEventDeleteZone(EventData) -- R2.1 + --self:F3({ EventData }) if EventData.Zone then - local Zone = _DATABASE:FindZone( EventData.Zone.ZoneName ) + local Zone = _DATABASE:FindZone(EventData.Zone.ZoneName) if Zone and Zone.ZoneName then -- When cargo was deleted, it may probably be because of an S_EVENT_DEAD. @@ -6603,10 +6554,10 @@ do -- SET_ZONE -- To prevent this from happening, the Zone object has a flag NoDestroy. -- When true, the SET_ZONE won't Remove the Zone object from the set. -- This flag is switched off after the event handlers have been called in the EVENT class. - --self:F( { ZoneNoDestroy = Zone.NoDestroy } ) + --self:F({ ZoneNoDestroy = Zone.NoDestroy }) if Zone.NoDestroy then else - self:Remove( Zone.ZoneName ) + self:Remove(Zone.ZoneName) end end end @@ -6618,11 +6569,11 @@ do -- SET_ZONE -- @param #SET_ZONE self -- @param Core.Point#COORDINATE Coordinate The coordinate to be searched. -- @return Core.Zone#ZONE_BASE The zone (if any) that validates the coordinate location. - function SET_ZONE:IsCoordinateInZone( Coordinate ) + function SET_ZONE:IsCoordinateInZone(Coordinate) - for _, Zone in pairs( self:GetSet() ) do + for _, Zone in pairs(self:GetSet()) do local Zone = Zone -- Core.Zone#ZONE_BASE - if Zone:IsCoordinateInZone( Coordinate ) then + if Zone:IsCoordinateInZone(Coordinate) then return Zone end end @@ -6635,11 +6586,11 @@ do -- SET_ZONE -- @param Core.Point#COORDINATE Coordinate The reference coordinate from which the closest zone is determined. -- @return Core.Zone#ZONE_BASE The closest zone (if any). -- @return #number Distance to ref coordinate in meters. - function SET_ZONE:GetClosestZone( Coordinate ) + function SET_ZONE:GetClosestZone(Coordinate) local dmin=math.huge local zmin=nil - for _, Zone in pairs( self:GetSet() ) do + for _, Zone in pairs(self:GetSet()) do local Zone = Zone -- Core.Zone#ZONE_BASE local d=Zone:Get2DDistance(Coordinate) if d x2 ) and Coordinate.x or x2 - y1 = ( Coordinate.y < y1 ) and Coordinate.y or y1 - y2 = ( Coordinate.y > y2 ) and Coordinate.y or y2 - z1 = ( Coordinate.y < z1 ) and Coordinate.z or z1 - z2 = ( Coordinate.y > z2 ) and Coordinate.z or z2 + x1 = (Coordinate.x < x1) and Coordinate.x or x1 + x2 = (Coordinate.x > x2) and Coordinate.x or x2 + y1 = (Coordinate.y < y1) and Coordinate.y or y1 + y2 = (Coordinate.y > y2) and Coordinate.y or y2 + z1 = (Coordinate.y < z1) and Coordinate.z or z1 + z2 = (Coordinate.y > z2) and Coordinate.z or z2 end - Coordinate.x = ( x2 - x1 ) / 2 + x1 - Coordinate.y = ( y2 - y1 ) / 2 + y1 - Coordinate.z = ( z2 - z1 ) / 2 + z1 + Coordinate.x = (x2 - x1) / 2 + x1 + Coordinate.y = (y2 - y1) / 2 + y1 + Coordinate.z = (z2 - z1) / 2 + z1 - --self:F( { Coordinate = Coordinate } ) + --self:F({ Coordinate = Coordinate }) return Coordinate end @@ -8609,8 +8523,8 @@ do -- SET_SCENERY -- @param #SET_SCENERY self -- @param Wrapper.Scenery#SCENERY MScenery -- @return #SET_SCENERY self - function SET_SCENERY:IsIncludeObject( MScenery ) - --self:T(( MScenery.SceneryName ) + function SET_SCENERY:IsIncludeObject(MScenery) + --self:T((MScenery.SceneryName) local MSceneryInclude = true @@ -8620,25 +8534,25 @@ do -- SET_SCENERY -- Filter Prefixes if self.Filter.Prefixes then local MSceneryPrefix = false - for ZonePrefixId, ZonePrefix in pairs( self.Filter.Prefixes ) do - --self:T(( { "Prefix:", string.find( MSceneryName, ZonePrefix, 1 ), ZonePrefix } ) - if string.find( MSceneryName, ZonePrefix, 1 ) then + for ZonePrefixId, ZonePrefix in pairs(self.Filter.Prefixes) do + --self:T(({ "Prefix:", string.find(MSceneryName, ZonePrefix, 1), ZonePrefix }) + if string.find(MSceneryName, ZonePrefix, 1) then MSceneryPrefix = true end end - --self:T(( { "Evaluated Prefix", MSceneryPrefix } ) + --self:T(({ "Evaluated Prefix", MSceneryPrefix }) MSceneryInclude = MSceneryInclude and MSceneryPrefix end if self.Filter.Zones then local MSceneryZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T(( "Zone:", ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T(("Zone:", ZoneName) local coord = MScenery:GetCoordinate() if coord and Zone:IsCoordinateInZone(coord) then MSceneryZone = true end - --self:T(( { "Evaluated Zone", MSceneryZone } ) + --self:T(({ "Evaluated Zone", MSceneryZone }) end MSceneryInclude = MSceneryInclude and MSceneryZone end @@ -8647,13 +8561,13 @@ do -- SET_SCENERY if self.Filter.SceneryRoles then local MSceneryRole = false local Role = MScenery:GetProperty("ROLE") or "none" - for ZoneRoleId, ZoneRole in pairs( self.Filter.SceneryRoles ) do - --self:T(( { "Role:", ZoneRole, Role } ) + for ZoneRoleId, ZoneRole in pairs(self.Filter.SceneryRoles) do + --self:T(({ "Role:", ZoneRole, Role }) if ZoneRole == Role then MSceneryRole = true end end - --self:T(( { "Evaluated Role ", MSceneryRole } ) + --self:T(({ "Evaluated Role ", MSceneryRole }) MSceneryInclude = MSceneryInclude and MSceneryRole end end @@ -8663,7 +8577,7 @@ do -- SET_SCENERY MSceneryInclude = MSceneryInclude and MClientFunc end - --self:T(2( MSceneryInclude ) + --self:T(2(MSceneryInclude) return MSceneryInclude end @@ -8672,10 +8586,10 @@ do -- SET_SCENERY -- @return #SET_SCENERY self function SET_SCENERY:FilterOnce() - for ObjectName, Object in pairs( self:GetSet() ) do + for ObjectName, Object in pairs(self:GetSet()) do --self:T((ObjectName) - if self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) + if self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) else self:Remove(ObjectName, true) end @@ -8695,7 +8609,7 @@ do -- SET_SCENERY local Obj = obj -- Wrapper.Scenery#SCENERY life0 = life0 + Obj:GetLife0() end - ) + ) return life0 end @@ -8709,7 +8623,7 @@ do -- SET_SCENERY local Obj = obj -- Wrapper.Scenery#SCENERY life = life + Obj:GetLife() end - ) + ) return life end @@ -8845,7 +8759,7 @@ do -- SET_DYNAMICCARGO function SET_DYNAMICCARGO:New() --- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.DYNAMICCARGO ) ) -- Core.Set#SET_DYNAMICCARGO + local self = BASE:Inherit(self, SET_BASE:New(_DATABASE.DYNAMICCARGO)) -- Core.Set#SET_DYNAMICCARGO return self end @@ -8854,14 +8768,14 @@ do -- SET_DYNAMICCARGO -- @param #SET_DYNAMICCARGO self -- @param Wrapper.DynamicCargo#DYNAMICCARGO DCargo -- @return #SET_DYNAMICCARGO self - function SET_DYNAMICCARGO:IsIncludeObject( DCargo ) - --self:F2( DCargo ) + function SET_DYNAMICCARGO:IsIncludeObject(DCargo) + --self:F2(DCargo) local DCargoInclude = true if self.Filter.Coalitions then local DCargoCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - --self:T2( { "Coalition:", DCargo:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + for CoalitionID, CoalitionName in pairs(self.Filter.Coalitions) do + --self:T2({ "Coalition:", DCargo:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName }) if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == DCargo:GetCoalition() then DCargoCoalition = true end @@ -8871,8 +8785,8 @@ do -- SET_DYNAMICCARGO if self.Filter.Types then local DCargoType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - --self:T2( { "Type:", DCargo:GetTypeName(), TypeName } ) + for TypeID, TypeName in pairs(self.Filter.Types) do + --self:T2({ "Type:", DCargo:GetTypeName(), TypeName }) if TypeName == DCargo:GetTypeName() then DCargoType = true end @@ -8882,8 +8796,8 @@ do -- SET_DYNAMICCARGO if self.Filter.Countries then local DCargoCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - --self:T2( { "Country:", DCargo:GetCountry(), CountryName } ) + for CountryID, CountryName in pairs(self.Filter.Countries) do + --self:T2({ "Country:", DCargo:GetCountry(), CountryName }) if country.id[CountryName] == DCargo:GetCountry() then DCargoCountry = true end @@ -8893,9 +8807,9 @@ do -- SET_DYNAMICCARGO if self.Filter.StaticPrefixes then local DCargoPrefix = false - for StaticPrefixId, StaticPrefix in pairs( self.Filter.StaticPrefixes ) do - --self:T2( { "Prefix:", string.find( DCargo:GetName(), StaticPrefix, 1 ), StaticPrefix } ) - if string.find( DCargo:GetName(), StaticPrefix, 1 ) then + for StaticPrefixId, StaticPrefix in pairs(self.Filter.StaticPrefixes) do + --self:T2({ "Prefix:", string.find(DCargo:GetName(), StaticPrefix, 1), StaticPrefix }) + if string.find(DCargo:GetName(), StaticPrefix, 1) then DCargoPrefix = true end end @@ -8904,8 +8818,8 @@ do -- SET_DYNAMICCARGO if self.Filter.Zones then local DCargoZone = false - for ZoneName, Zone in pairs( self.Filter.Zones ) do - --self:T2( "In zone: "..ZoneName ) + for ZoneName, Zone in pairs(self.Filter.Zones) do + --self:T2("In zone: "..ZoneName) if DCargo and DCargo:IsInZone(Zone) then DCargoZone = true end @@ -8918,40 +8832,28 @@ do -- SET_DYNAMICCARGO DCargoInclude = DCargoInclude and MClientFunc end - --self:T2( DCargoInclude ) + --self:T2(DCargoInclude) return DCargoInclude end - + --- Builds a set of dynamic cargo of defined coalitions. -- Possible current coalitions are red, blue and neutral. -- @param #SET_DYNAMICCARGO self -- @param #string Coalitions Can take the following values: "red", "blue", "neutral". -- @return #SET_DYNAMICCARGO self - function SET_DYNAMICCARGO:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self - end --- Builds a set of dynamic cargo of defined dynamic cargo type names. -- @param #SET_DYNAMICCARGO self -- @param #string Types Can take those type name strings known within DCS world. -- @return #SET_DYNAMICCARGO self - function SET_DYNAMICCARGO:FilterTypes( Types ) + function SET_DYNAMICCARGO:FilterTypes(Types) if not self.Filter.Types then self.Filter.Types = {} end - if type( Types ) ~= "table" then + if type(Types) ~= "table" then Types = { Types } end - for TypeID, Type in pairs( Types ) do + for TypeID, Type in pairs(Types) do self.Filter.Types[Type] = Type end return self @@ -8972,7 +8874,7 @@ do -- SET_DYNAMICCARGO -- if dynamiccargo:GetName() == "Exclude Me" then isinclude = false end -- return isinclude -- end - -- ):FilterOnce() + -- ):FilterOnce() -- BASE:I(cargoset:Flush()) --- Builds a set of dynamic cargo of defined countries. @@ -8980,14 +8882,14 @@ do -- SET_DYNAMICCARGO -- @param #SET_DYNAMICCARGO self -- @param #string Countries Can take those country strings known within DCS world. -- @return #SET_DYNAMICCARGO self - function SET_DYNAMICCARGO:FilterCountries( Countries ) + function SET_DYNAMICCARGO:FilterCountries(Countries) if not self.Filter.Countries then self.Filter.Countries = {} end - if type( Countries ) ~= "table" then + if type(Countries) ~= "table" then Countries = { Countries } end - for CountryID, Country in pairs( Countries ) do + for CountryID, Country in pairs(Countries) do self.Filter.Countries[Country] = Country end return self @@ -8998,14 +8900,14 @@ do -- SET_DYNAMICCARGO -- @param #SET_DYNAMICCARGO self -- @param #string Prefixes The string pattern(s) that need to be contained in the dynamic cargo name. Can also be passed as a `#table` of strings. -- @return #SET_DYNAMICCARGO self - function SET_DYNAMICCARGO:FilterPrefixes( Prefixes ) + function SET_DYNAMICCARGO:FilterPrefixes(Prefixes) if not self.Filter.StaticPrefixes then self.Filter.StaticPrefixes = {} end - if type( Prefixes ) ~= "table" then + if type(Prefixes) ~= "table" then Prefixes = { Prefixes } end - for PrefixID, Prefix in pairs( Prefixes ) do + for PrefixID, Prefix in pairs(Prefixes) do self.Filter.StaticPrefixes[Prefix] = Prefix end return self @@ -9016,7 +8918,7 @@ do -- SET_DYNAMICCARGO -- @param #SET_DYNAMICCARGO self -- @param #string Patterns The string pattern(s) that need to be contained in the dynamic cargo name. Can also be passed as a `#table` of strings. -- @return #SET_DYNAMICCARGO self - function SET_DYNAMICCARGO:FilterNamePattern( Patterns ) + function SET_DYNAMICCARGO:FilterNamePattern(Patterns) return self:FilterPrefixes(Patterns) end @@ -9032,7 +8934,7 @@ do -- SET_DYNAMICCARGO return false end end - ) + ) return self end @@ -9048,7 +8950,7 @@ do -- SET_DYNAMICCARGO return false end end - ) + ) return self end @@ -9064,7 +8966,7 @@ do -- SET_DYNAMICCARGO return false end end - ) + ) return self end @@ -9081,7 +8983,7 @@ do -- SET_DYNAMICCARGO return false end end - ) + ) return self end @@ -9089,20 +8991,20 @@ do -- SET_DYNAMICCARGO -- @param #SET_DYNAMICCARGO self -- @param #table Zones Table of Core.Zone#ZONE Zone objects, or a Core.Set#SET_ZONE -- @return #SET_DYNAMICCARGO self - function SET_DYNAMICCARGO:FilterZones( Zones ) + function SET_DYNAMICCARGO:FilterZones(Zones) if not self.Filter.Zones then self.Filter.Zones = {} end local zones = {} if Zones.ClassName and Zones.ClassName == "SET_ZONE" then zones = Zones.Set - elseif type( Zones ) ~= "table" or (type( Zones ) == "table" and Zones.ClassName ) then + elseif type(Zones) ~= "table" or (type(Zones) == "table" and Zones.ClassName) then self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") return self else zones = Zones end - for _,Zone in pairs( zones ) do + for _,Zone in pairs(zones) do local zonename = Zone:GetName() self.Filter.Zones[zonename] = Zone end @@ -9114,8 +9016,8 @@ do -- SET_DYNAMICCARGO -- @return #SET_DYNAMICCARGO self function SET_DYNAMICCARGO:FilterStart() if _DATABASE then - self:HandleEvent( EVENTS.NewDynamicCargo, self._EventHandlerDCAdd ) - self:HandleEvent( EVENTS.DynamicCargoRemoved, self._EventHandlerDCRemove ) + self:HandleEvent(EVENTS.NewDynamicCargo, self._EventHandlerDCAdd) + self:HandleEvent(EVENTS.DynamicCargoRemoved, self._EventHandlerDCRemove) if self.Filter.Zones then self.ZoneTimer = TIMER:New(self._ContinousZoneFilter,self) local timing = self.ZoneTimerInterval or 30 @@ -9132,8 +9034,8 @@ do -- SET_DYNAMICCARGO -- @return #SET_DYNAMICCARGO self function SET_DYNAMICCARGO:FilterStop() if _DATABASE then - self:UnHandleEvent( EVENTS.NewDynamicCargo) - self:UnHandleEvent( EVENTS.DynamicCargoRemoved ) + self:UnHandleEvent(EVENTS.NewDynamicCargo) + self:UnHandleEvent(EVENTS.DynamicCargoRemoved) if self.ZoneTimer and self.ZoneTimer:IsRunning() then self.ZoneTimer:Stop() end @@ -9147,10 +9049,10 @@ do -- SET_DYNAMICCARGO -- @return #SET_DYNAMICCARGO self function SET_DYNAMICCARGO:_ContinousZoneFilter() local Database = _DATABASE.DYNAMICCARGO - for ObjectName, Object in pairs( Database ) do - if self:IsIncludeObject( Object ) and self:IsNotInSet(Object) then - self:Add( ObjectName, Object ) - elseif (not self:IsIncludeObject( Object )) and self:IsInSet(Object) then + for ObjectName, Object in pairs(Database) do + if self:IsIncludeObject(Object) and self:IsNotInSet(Object) then + self:Add(ObjectName, Object) + elseif (not self:IsIncludeObject(Object)) and self:IsInSet(Object) then self:Remove(ObjectName) end end @@ -9161,14 +9063,14 @@ do -- SET_DYNAMICCARGO --- Handles the events for the Set. -- @param #SET_DYNAMICCARGO self -- @param Core.Event#EVENTDATA Event - function SET_DYNAMICCARGO:_EventHandlerDCAdd( Event ) + function SET_DYNAMICCARGO:_EventHandlerDCAdd(Event) if Event.IniDynamicCargo and Event.IniDynamicCargoName then if not _DATABASE.DYNAMICCARGO[Event.IniDynamicCargoName] then - _DATABASE:AddDynamicCargo( Event.IniDynamicCargoName ) + _DATABASE:AddDynamicCargo(Event.IniDynamicCargoName) end - local ObjectName, Object = self:FindInDatabase( Event ) - if Object and self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) + local ObjectName, Object = self:FindInDatabase(Event) + if Object and self:IsIncludeObject(Object) then + self:Add(ObjectName, Object) end end @@ -9178,11 +9080,11 @@ do -- SET_DYNAMICCARGO --- Handles the remove event for dynamic cargo set. -- @param #SET_DYNAMICCARGO self -- @param Core.Event#EVENTDATA Event - function SET_DYNAMICCARGO:_EventHandlerDCRemove( Event ) + function SET_DYNAMICCARGO:_EventHandlerDCRemove(Event) if Event.IniDCSUnitName then - local ObjectName, Object = self:FindInDatabase( Event ) + local ObjectName, Object = self:FindInDatabase(Event) if ObjectName then - self:Remove( ObjectName ) + self:Remove(ObjectName) end end @@ -9195,7 +9097,7 @@ do -- SET_DYNAMICCARGO -- @param Core.Event#EVENTDATA Event -- @return #string The name of the DYNAMICCARGO -- @return Wrapper.DynamicCargo#DYNAMICCARGO The DYNAMICCARGO object - function SET_DYNAMICCARGO:FindInDatabase( Event ) + function SET_DYNAMICCARGO:FindInDatabase(Event) return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] end @@ -9234,7 +9136,7 @@ do -- SET_DYNAMICCARGO table.insert(owners, cargo.Owner, cargo.Owner) end end - ) + ) return owners end @@ -9249,7 +9151,7 @@ do -- SET_DYNAMICCARGO table.insert(owners, cargo.StaticName, cargo.warehouse) end end - ) + ) return owners end @@ -9267,7 +9169,7 @@ do -- SET_DYNAMICCARGO end end end - ) + ) return owners end diff --git a/Moose Development/Moose/Functional/Scoring.lua b/Moose Development/Moose/Functional/Scoring.lua index 2c49243f8..d9427d279 100644 --- a/Moose Development/Moose/Functional/Scoring.lua +++ b/Moose Development/Moose/Functional/Scoring.lua @@ -320,8 +320,8 @@ function SCORING:New( GameName, SavePath, AutoSave ) -- Create the CSV file. self.AutoSavePath = SavePath - self.AutoSave = AutoSave or true - if self.AutoSave == true then + self.AutoSave = (AutoSave == nil or AutoSave == true) and true or false + if self.AutoSavePath and self.AutoSave == true then self:OpenCSV( GameName ) end diff --git a/Moose Development/Moose/Ops/Airboss.lua b/Moose Development/Moose/Ops/Airboss.lua index 8b8644165..5e83f1427 100644 --- a/Moose Development/Moose/Ops/Airboss.lua +++ b/Moose Development/Moose/Ops/Airboss.lua @@ -5498,15 +5498,15 @@ function AIRBOSS:_GetAircraftAoA( playerData ) aoa.OnSpeedMin = self:_AoAUnit2Deg( playerData, 14.0 ) -- 14.17 --14.5 units -- VNAO Edit - Original value 14.5 aoa.Fast = self:_AoAUnit2Deg( playerData, 13.5 ) -- 13.33 --14.0 units -- VNAO Edit - Original value 14 aoa.FAST = self:_AoAUnit2Deg( playerData, 12.5 ) -- 11.67 --13.0 units -- VNAO Edit - Original value 13 - elseif goshawk then + elseif goshawk then --These parameters edited by CIRCUIT to support new VNAO flight model -- T-45C Goshawk parameters. - aoa.SLOW = 8.00 -- 19 - aoa.Slow = 7.75 -- 18 - aoa.OnSpeedMax = 7.25 -- 17.5 - aoa.OnSpeed = 7.00 -- 17 - aoa.OnSpeedMin = 6.75 -- 16.5 - aoa.Fast = 6.25 -- 16 - aoa.FAST = 6.00 -- 15 + aoa.SLOW = 9.5 -- 8.00 -- 19 + aoa.Slow = 9.25 -- 7.75 -- 18 + aoa.OnSpeedMax = 9.0 --7.25 -- 17.5 + aoa.OnSpeed = 8.5 -- 7.00 -- 17 + aoa.OnSpeedMin = 8.25 -- 6.75 -- 16.5 + aoa.Fast = 7.75 -- 6.25 -- 16 + aoa.FAST = 5.5 -- 6.00 -- 15 elseif skyhawk then -- A-4E-C Skyhawk parameters from https://forums.eagle.ru/showpost.php?p=3703467&postcount=390 -- Note that these are arbitrary UNITS and not degrees. We need a conversion formula! @@ -8161,8 +8161,14 @@ function AIRBOSS:_CheckPlayerStatus() -- TODO: This might cause problems if the CCA is set to be very small! if unit:IsInZone( self.zoneCCA ) then - -- VNAO Edit - Added wrapped up call to LSO grading - if playerData.step==AIRBOSS.PatternStep.WAKE then-- VNAO Edit - Added + local hornet = playerData.actype == AIRBOSS.AircraftCarrier.HORNET + or playerData.actype == AIRBOSS.AircraftCarrier.RHINOE + or playerData.actype == AIRBOSS.AircraftCarrier.RHINOF + or playerData.actype == AIRBOSS.AircraftCarrier.GROWLER + local tomcat = playerData.actype == AIRBOSS.AircraftCarrier.F14A or playerData.actype == AIRBOSS.AircraftCarrier.F14B + + -- VNAO Edit - Added wrapped up call to LSO grading Hornet + if playerData.step==AIRBOSS.PatternStep.WAKE and hornet then-- VNAO Edit - Added if math.abs(playerData.unit:GetRoll())>35 and math.abs(playerData.unit:GetRoll())<=40 then-- VNAO Edit - Added playerData.wrappedUpAtWakeLittle = true -- VNAO Edit - Added elseif math.abs(playerData.unit:GetRoll()) >40 and math.abs(playerData.unit:GetRoll())<=45 then-- VNAO Edit - Added @@ -8186,6 +8192,30 @@ function AIRBOSS:_CheckPlayerStatus() end -- VNAO Edit - Added end-- VNAO Edit - Added + -- VNAO Edit - Added wrapped up call to LSO grading Tomcat + if playerData.step==AIRBOSS.PatternStep.WAKE and tomcat then-- VNAO Edit - Added + if math.abs(playerData.unit:GetRoll())>35 and math.abs(playerData.unit:GetRoll())<=40 then-- VNAO Edit - Added + playerData.wrappedUpAtWakeLittle = true -- VNAO Edit - Added + elseif math.abs(playerData.unit:GetRoll()) >40 and math.abs(playerData.unit:GetRoll())<=45 then-- VNAO Edit - Added + playerData.wrappedUpAtWakeFull = true-- VNAO Edit - Added + elseif math.abs(playerData.unit:GetRoll()) >45 then-- VNAO Edit - Added + playerData.wrappedUpAtWakeUnderline = true -- VNAO Edit - Added + elseif math.abs(playerData.unit:GetRoll()) <12 and math.abs(playerData.unit:GetRoll()) >=5 then -- VNAO Edit - Added a new AA comment based on discussion with Lipps today, and going to replace the AA at the X with the original LUL comments + playerData.AAatWakeLittle = true -- VNAO Edit - Added + elseif math.abs(playerData.unit:GetRoll()) <5 and math.abs(playerData.unit:GetRoll()) >=2 then -- VNAO Edit - Added a new AA comment based on discussion with Lipps today, and going to replace the AA at the X with the original LUL comments + playerData.AAatWakeFull = true -- VNAO Edit - Added + elseif math.abs(playerData.unit:GetRoll()) <2 then -- VNAO Edit - Added a new AA comment based on discussion with Lipps today, and going to replace the AA at the X with the original LUL comments + playerData.AAatWakeUnderline = true -- VNAO Edit - Added + else -- VNAO Edit - Added + end -- VNAO Edit - Added + + if math.abs(playerData.unit:GetAoA())>= 15 then -- VNAO Edit - Added + playerData.AFU = true -- VNAO Edit - Added + elseif math.abs(playerData.unit:GetAoA())<= 5 then -- VNAO Edit - Added + playerData.AFU = true -- VNAO Edit - Added + else -- VNAO Edit - Added + end -- VNAO Edit - Added + end-- VNAO Edit - Added -- Display aircraft attitude and other parameters as message text. if playerData.attitudemonitor then @@ -12229,8 +12259,8 @@ function AIRBOSS:GetHeadingIntoWind_new( vdeck, magnetic, coord ) local magvar= magnetic and self.magvar or 0 -- Ship heading so cross wind is min for the given wind. - -- local intowind = (540 + (windto - magvar + math.deg(theta) )) % 360 -- VNAO Edit: Using old heading into wind algorithm - local intowind = self:GetHeadingIntoWind_old(vdeck,magnetic) -- VNAO Edit: Using old heading into wind algorithm + local intowind = (540 + (windto - magvar + math.deg(theta) )) % 360 + return intowind, v end @@ -12682,7 +12712,8 @@ function AIRBOSS:_LSOgrade( playerData ) local nL=count(G, '_')/2 local nS=count(G, '%(') local nN=N-nS-nL - + + if TIG=="_OK_" then nL = nL -1 end --Circuit added to prevent grade deduction for perfect groove -- Groove time 15-18.99 sec for a unicorn. Or 60-65 for V/STOL unicorn. local Tgroove=playerData.Tgroove @@ -12712,7 +12743,6 @@ function AIRBOSS:_LSOgrade( playerData ) else if vtol then - -- Add AV-8B Harrier devation allowances due to lower groundspeed and 3x conventional groove time, this allows to maintain LSO tolerances while respecting the deviations are not unsafe.--Pene testing -- Large devaitions still result in a No Grade, A Unicorn still requires a clean pass with no deviation. diff --git a/Moose Development/Moose/Ops/CTLD.lua b/Moose Development/Moose/Ops/CTLD.lua index 87d394e01..42e8d4e03 100644 --- a/Moose Development/Moose/Ops/CTLD.lua +++ b/Moose Development/Moose/Ops/CTLD.lua @@ -871,6 +871,7 @@ do -- my_ctld.onestepmenu = false -- When set to true, the menu will create Drop and build, Get and load, Pack and remove, Pack and load, Pack. it will be a 1 step solution. -- my_ctld.VehicleMoveFormation = AI.Task.VehicleFormation.VEE -- When a group moves to a MOVE zone, then it takes this formation. Can be a table of formations, which are then randomly chosen. Defaults to "Vee". -- my_ctld.validateAndRepositionUnits = false -- Uses Disposition and other logic to find better ground positions for ground units avoiding trees, water, roads, runways, map scenery, statics and other units in the area. (Default is false) +-- my_ctld.loadSavedCrates = true -- Load back crates (STATIC) from the save file. Useful for mission restart cleanup. (Default is true) -- -- ## 2.1 CH-47 Chinook support -- @@ -912,7 +913,7 @@ do -- -- Make a Gazelle into a heavy truck, this type can load both crates and troops and eight of each type, up to 4000 kgs: -- my_ctld:SetUnitCapabilities("SA342L", true, true, 8, 8, 12, 4000) -- --- -- Default unit type capabilities are: +-- -- Default unit type capabilities are e.g. (list might be incomplete) -- ["SA342Mistral"] = {type="SA342Mistral", crates=false, troops=true, cratelimit = 0, trooplimit = 4, length = 12, cargoweightlimit = 400}, -- ["SA342L"] = {type="SA342L", crates=false, troops=true, cratelimit = 0, trooplimit = 2, length = 12, cargoweightlimit = 400}, -- ["SA342M"] = {type="SA342M", crates=false, troops=true, cratelimit = 0, trooplimit = 4, length = 12, cargoweightlimit = 400}, @@ -1395,7 +1396,8 @@ CTLD.UnitTypeCapabilities = { ["Ka-50_3"] = {type="Ka-50_3", crates=false, troops=false, cratelimit = 0, trooplimit = 0, length = 15, cargoweightlimit = 0}, ["Mi-24P"] = {type="Mi-24P", crates=true, troops=true, cratelimit = 2, trooplimit = 8, length = 18, cargoweightlimit = 700}, ["Mi-24V"] = {type="Mi-24V", crates=true, troops=true, cratelimit = 2, trooplimit = 8, length = 18, cargoweightlimit = 700}, - ["Hercules"] = {type="Hercules", crates=true, troops=true, cratelimit = 7, trooplimit = 64, length = 25, cargoweightlimit = 19000}, -- 19t cargo, 64 paratroopers. + ["Hercules"] = {type="Hercules", crates=true, troops=true, cratelimit = 7, trooplimit = 64, length = 25, cargoweightlimit = 19000}, -- 19t cargo, 64 paratroopers. + ["C-130J-30"] = {type="C-130J-30", crates=true, troops=true, cratelimit = 7, trooplimit = 64, length = 35, cargoweightlimit = 21500}, -- 19t cargo, 64 paratroopers. --Actually it's longer, but the center coord is off-center of the model. ["UH-60L"] = {type="UH-60L", crates=true, troops=true, cratelimit = 2, trooplimit = 20, length = 16, cargoweightlimit = 3500}, -- 4t cargo, 20 (unsec) seats ["UH-60L_DAP"] = {type="UH-60L_DAP", crates=false, troops=true, cratelimit = 0, trooplimit = 2, length = 16, cargoweightlimit = 500}, -- UH-60L DAP is an attack helo but can do limited CSAR and CTLD @@ -1416,11 +1418,12 @@ CTLD.FixedWingTypes = { ["Hercules"] = "Hercules", ["Bronco"] = "Bronco", ["Mosquito"] = "Mosquito", + ["C-130J-30"] = "C-130J-30", } --- CTLD class version. -- @field #string version -CTLD.version="1.3.38" +CTLD.version="1.3.39" --- Instantiate a new CTLD. -- @param #CTLD self @@ -1560,7 +1563,8 @@ function CTLD:New(Coalition, Prefixes, Alias) self.movetroopsdistance = 5000 self.returntroopstobase = true -- if set to false, troops would stay after deployment inside a load zone. self.troopdropzoneradius = 100 - + self.buildPairSeparation = 25 + self.loadSavedCrates = true self.VehicleMoveFormation = AI.Task.VehicleFormation.VEE -- added support Hercules Mod @@ -1605,6 +1609,7 @@ function CTLD:New(Coalition, Prefixes, Alias) self.subcats = {} self.subcatsTroop = {} self.showstockinmenuitems = false + self.maxCrateMenuQuantity = 5 self.onestepmenu = false -- disallow building in loadzones @@ -2161,6 +2166,7 @@ function CTLD:_EventHandler(EventData) local Group = client:GetGroup() self:_SendMessage(string.format("Crate %s loaded by ground crew!",event.IniDynamicCargoName), 10, false, Group) self:__CratesPickedUp(1, Group, client, dcargo) + self:_RefreshCrateQuantityMenus(Group, client, nil) end --------------- -- End new dynamic cargo system Handling @@ -2206,6 +2212,7 @@ function CTLD:_EventHandler(EventData) local Group = client:GetGroup() self:_SendMessage(string.format("Crate %s unloaded by ground crew!",event.IniDynamicCargoName), 10, false, Group) self:__CratesDropped(1,Group,client,{dcargo}) + self:_RefreshCrateQuantityMenus(Group, client, nil) end --------------- -- End new dynamic cargo system Handling @@ -2469,6 +2476,7 @@ function CTLD:_LoadTroops(Group, Unit, Cargotype, Inject) self:__TroopsPickedUp(1,Group, Unit, Cargotype) self:_UpdateUnitCargoMass(Unit) Cargotype:RemoveStock() + self:_RefreshTroopQuantityMenus(Group, Unit, Cargotype) end return self end @@ -2744,7 +2752,204 @@ end self:CleanDroppedTroops() return self end - + +--- (Internal) Function to load multiple troop sets at once. +-- @param #CTLD self +-- @param Wrapper.Group#GROUP Group +-- @param Wrapper.Unit#UNIT Unit +-- @param #CTLD_CARGO Cargo +-- @param #number quantity Number of troop sets to load. +-- @return #CTLD self +function CTLD:_LoadTroopsQuantity(Group, Unit, Cargo, quantity) + local n = math.max(1, tonumber(quantity) or 1) + local prevSuppress = self.suppressmessages + self.suppressmessages = true + for i = 1, n do + timer.scheduleFunction(function() self:_LoadTroops(Group, Unit, Cargo, true) end, {}, timer.getTime() + 0.2 * i) + end + timer.scheduleFunction(function() + self.suppressmessages = prevSuppress + local dname = Cargo:GetName() + self:_SendMessage(string.format("Loaded %d %s.", n, dname), 10, false, Group) + end, {}, timer.getTime() + 0.2 * n + 0.05) + return self +end + +--- (Internal) Function to add quantity submenu entries for troops. +-- @param #CTLD self +-- @param Wrapper.Group#GROUP Group +-- @param Wrapper.Unit#UNIT Unit +-- @param Core.Menu#MENU_GROUP parentMenu +-- @param #CTLD_CARGO cargoObj +-- @return #CTLD self +function CTLD:_AddTroopQuantityMenus(Group, Unit, parentMenu, cargoObj) + local stock = cargoObj:GetStock() + local maxQuantity = self.maxCrateMenuQuantity or 1 + if type(stock) == "number" and stock >= 0 and stock < maxQuantity then maxQuantity = stock end + maxQuantity = math.floor(maxQuantity) + if maxQuantity < 1 then maxQuantity = 1 end + local caps = self:_GetUnitCapabilities(Unit) + local trooplimit = caps and caps.trooplimit or 0 + local troopsize = cargoObj:GetCratesNeeded() or 1 + if troopsize < 1 then troopsize = 1 end + local ld = self.Loaded_Cargo and self.Loaded_Cargo[Unit:GetName()] or nil + local onboard = (ld and type(ld.Troopsloaded) == "number") and ld.Troopsloaded or 0 + if trooplimit > 0 then + local space = trooplimit - onboard + if space < troopsize then + local msg = "Troop limit reached" + if type(stock) == "number" and stock == 0 then msg = "Out of stock" end + MENU_GROUP_COMMAND:New(Group, msg, parentMenu, function() end) + return self + end + local capacitySets = math.floor(space / troopsize) + if capacitySets < maxQuantity then maxQuantity = capacitySets end + end + for quantity = 1, maxQuantity do + local m = MENU_GROUP:New(Group, tostring(quantity), parentMenu) + if quantity == 1 then + MENU_GROUP_COMMAND:New(Group, "Load", m, self._LoadTroops, self, Group, Unit, cargoObj) + else + MENU_GROUP_COMMAND:New(Group, "Load", m, self._LoadTroopsQuantity, self, Group, Unit, cargoObj, quantity) + end + end + return self +end + +--- (Internal) Function to request N*crates for a cargo type. +-- @param #CTLD self +-- @param Wrapper.Group#GROUP Group +-- @param Wrapper.Unit#UNIT Unit +-- @param #CTLD_CARGO cargoObj +-- @param #number quantity Number of cargo sets to request. +-- @return #CTLD self +function CTLD:_GetCrateQuantity(Group, Unit, cargoObj, quantity) + local needed = cargoObj and cargoObj:GetCratesNeeded() or 1 + local count = math.max(1, tonumber(quantity) or 1) + local total = needed * count + self:_GetCrates(Group, Unit, cargoObj, total, false, false, true) + return self +end + +--- (Internal) Function to add quantity submenu entries for crates. +-- @param #CTLD self +-- @param Wrapper.Group#GROUP Group +-- @param Wrapper.Unit#UNIT Unit +-- @param Core.Menu#MENU_GROUP parentMenu +-- @param #CTLD_CARGO cargoObj +-- @param #table stockSummary Optional pooled stock summary. +-- @return #CTLD self +function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSummary) + local needed = cargoObj:GetCratesNeeded() or 1 + local stockEntry = self:_GetCrateStockEntry(cargoObj, stockSummary) + local stock = nil + if stockEntry and type(stockEntry.Stock) == "number" then + stock = stockEntry.Stock + else + stock = cargoObj:GetStock() + end + local maxQuantity = self.maxCrateMenuQuantity or 1 + local availableSets = nil + if type(stock) == "number" and stock >= 0 then + availableSets = math.floor(stock) + if availableSets <= 0 then + MENU_GROUP_COMMAND:New(Group, "Out of stock", parentMenu, function() end) + return self + end + if availableSets < maxQuantity then + maxQuantity = availableSets + end + end + maxQuantity = math.floor(maxQuantity) + if maxQuantity < 1 then + return self + end + local capacitySets = nil + if Unit then + local capabilities = self:_GetUnitCapabilities(Unit) + local capacity = capabilities and capabilities.cratelimit or 0 + if capacity > 0 then + local loadedData = nil + if self.Loaded_Cargo then + loadedData = self.Loaded_Cargo[Unit:GetName()] + end + local loadedCount = 0 + if loadedData and type(loadedData.Cratesloaded) == "number" then + loadedCount = loadedData.Cratesloaded + end + local space = capacity - loadedCount + if space < 0 then + space = 0 + end + local perSet = needed > 0 and needed or 1 + capacitySets = math.floor(space / perSet) + end + end + local allowLoad = true + if type(capacitySets) == "number" then + if capacitySets >= 1 then + if capacitySets < maxQuantity then + maxQuantity = capacitySets + end + else + allowLoad = false + maxQuantity = 1 + end + end + local maxMassSets = nil + if Unit then + local maxload = self:_GetMaxLoadableMass(Unit) + local perCrateMass = (cargoObj.GetMass and cargoObj:GetMass()) or cargoObj.PerCrateMass or 0 + local setMass = perCrateMass * (needed > 0 and needed or 1) + if type(maxload) == "number" and maxload > 0 and setMass > 0 then + maxMassSets = math.floor(maxload / setMass) + if maxMassSets < 1 then + maxQuantity = 1 + allowLoad = false + elseif maxMassSets < maxQuantity then + maxQuantity = maxMassSets + end + end + end + if maxQuantity < 1 then + return self + end + if maxQuantity == 1 then + MENU_GROUP_COMMAND:New(Group, "Get", parentMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, 1) + local canLoad = (allowLoad and (not capacitySets or capacitySets >= 1) and (not maxMassSets or maxMassSets >= 1)) + if canLoad then + MENU_GROUP_COMMAND:New(Group, "Get and Load", parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1) + else + local msg + if maxMassSets and (not capacitySets or capacitySets >= 1) and maxMassSets < 1 then + msg = "Weight limit reached" + else + msg = "Crate limit reached" + end + MENU_GROUP_COMMAND:New(Group, msg, parentMenu, self._SendMessage, self, msg, 10, false, Group) + end + return self + end + for quantity = 1, maxQuantity do + local label = tostring(quantity) + local qMenu = MENU_GROUP:New(Group, label, parentMenu) + MENU_GROUP_COMMAND:New(Group, "Get", qMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, quantity) + local canLoad = (allowLoad and (not capacitySets or capacitySets >= quantity) and (not maxMassSets or maxMassSets >= quantity)) + if canLoad then + MENU_GROUP_COMMAND:New(Group, "Get and Load", qMenu, self._GetAndLoad, self, Group, Unit, cargoObj, quantity) + else + local msg + if maxMassSets and (not capacitySets or capacitySets >= quantity) and maxMassSets < quantity then + msg = "Weight limit reached" + else + msg = "Crate limit reached" + end + MENU_GROUP_COMMAND:New(Group, msg, qMenu, self._SendMessage, self, msg, 10, false, Group) + end + end + return self +end + --- (Internal) Function to spawn crates in front of the heli. -- @param #CTLD self -- @param Wrapper.Group#GROUP Group @@ -2753,18 +2958,31 @@ end -- @param #number number Number of crates to generate (for dropping) -- @param #boolean drop If true we\'re dropping from heli rather than loading. -- @param #boolean pack If true we\'re packing crates from a template rather than loading or dropping -function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) +function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet) self:T(self.lid .. " _GetCrates") + + -- check if we have stock + local perSet = Cargo:GetCratesNeeded() or 1 + if perSet < 1 then perSet = 1 end + local requestNumber = tonumber(number) + if requestNumber then + requestNumber = math.floor(requestNumber) + if requestNumber < 1 then requestNumber = perSet end + else + requestNumber = perSet + end + local requestedSets = math.floor((requestNumber + perSet - 1) / perSet) + if requestedSets < 1 then requestedSets = 1 end if not drop and not pack then local cgoname = Cargo:GetName() - -- check if we have stock local instock = Cargo:GetStock() if type(instock) == "number" and tonumber(instock) <= 0 and tonumber(instock) ~= -1 then -- nothing left over self:_SendMessage(string.format("Sorry, we ran out of %s", cgoname), 10, false, Group) - return self + return false end end + -- check if we are in LOAD zone local inzone = false local drop = drop or false @@ -2795,7 +3013,6 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) -- Check cargo location if available local location = Cargo:GetLocation() - if location then local unitcoord = Unit:GetCoordinate() or Group:GetCoordinate() if unitcoord then @@ -2814,14 +3031,15 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) local nearcrates, numbernearby = self:_FindCratesNearby(Group,Unit,loaddist,true,true) if numbernearby >= canloadcratesno and not drop then self:_SendMessage("There are enough crates nearby already! Take care of those first!", 10, false, Group) - return self + return false end + -- spawn crates in front of helicopter local IsHerc = self:IsFixedWing(Unit) -- Herc, Bronco and Hook load from behind local IsHook = self:IsHook(Unit) -- Herc, Bronco and Hook load from behind local IsTruck = Unit:IsGround() local cargotype = Cargo -- Ops.CTLD#CTLD_CARGO - local number = number or cargotype:GetCratesNeeded() --#number + local number = requestNumber --#number local cratesneeded = cargotype:GetCratesNeeded() --#number local cratename = cargotype:GetName() local cratetemplate = "Container"-- #string @@ -2832,6 +3050,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) cratetemplate = cargotype:GetTemplates() isstatic = true end + -- get position and heading of heli local position = Unit:GetCoordinate() local heading = Unit:GetHeading() + 1 @@ -2853,6 +3072,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) if self.placeCratesAhead == true then cratedistance = initialdist end + -- loop crates needed local cratecoord = nil -- Core.Point#COORDINATE for i=1,number do @@ -2862,11 +3082,11 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) if cratedistance > self.CrateDistance then cratedistance = self.CrateDistance end -- altered heading logic -- DONE: right standard deviation? - if self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) then - rheading = math.random(20,60) - else - rheading = UTILS.RandomGaussian(0, 30, -90, 90, 100) - end + if self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) then + rheading = math.random(20,60) + else + rheading = UTILS.RandomGaussian(0, 30, -90, 90, 100) + end rheading=math.fmod((heading+rheading),360) cratecoord = position:Translate(cratedistance,rheading) else @@ -2933,8 +3153,8 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) realcargo = CTLD_CARGO:New(self.CargoCounter,cratename,templ,sorte,true,false,cratesneeded,self.Spawned_Crates[self.CrateCounter],true,cargotype.PerCrateMass,nil,subcat) -- #CTLD_CARGO local map=cargotype:GetStaticResourceMap() realcargo:SetStaticResourceMap(map) - local CCat, CType, CShape = cargotype:GetStaticTypeAndShape() - realcargo:SetStaticTypeAndShape(CCat,CType,CShape) + local CCat3, CType3, CShape3 = cargotype:GetStaticTypeAndShape() + realcargo:SetStaticTypeAndShape(CCat3,CType3,CShape3) if cargotype.TypeNames then realcargo.TypeNames = UTILS.DeepCopy(cargotype.TypeNames) end @@ -2947,24 +3167,29 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack) realcargo.TypeNames = UTILS.DeepCopy(cargotype.TypeNames) end end - local CCat, CType, CShape = cargotype:GetStaticTypeAndShape() - realcargo:SetStaticTypeAndShape(CCat,CType,CShape) + local CCat4, CType4, CShape4 = cargotype:GetStaticTypeAndShape() + realcargo:SetStaticTypeAndShape(CCat4,CType4,CShape4) table.insert(self.Spawned_Cargo, realcargo) end + if not (drop or pack) then - Cargo:RemoveStock() + Cargo:RemoveStock(requestedSets) + self:_RefreshCrateQuantityMenus(Group, Unit, Cargo) end local text = string.format("Crates for %s have been positioned near you!",cratename) if drop then text = string.format("Crates for %s have been dropped!",cratename) self:__CratesDropped(1, Group, Unit, droppedcargo) else - self:_SendMessage(text, 10, false, Group) + if not quiet then + self:_SendMessage(text, 10, false, Group) + end end self:_RefreshLoadCratesMenu(Group, Unit) - return self + return true end + --- (Internal) Inject crates and static cargo objects. -- @param #CTLD self -- @param Core.Zone#ZONE Zone Zone to spawn in. @@ -3111,7 +3336,15 @@ function CTLD:_RemoveCratesNearby(_group, _unit) end text:Add("------------------------------------------------------------") self:_SendMessage(text:Text(),30,true,_group) - self:_CleanupTrackedCrates(removedIDs) + local done = {} + for _, e in pairs(crates) do + local n = e:GetName() or "none" + if not done[n] then + local object = self:_FindCratesCargoObject(n) + if object then self:_RefreshCrateQuantityMenus(_group, _unit, object) end + done[n] = true + end + end self:_RefreshLoadCratesMenu(_group,_unit) else self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group) @@ -3332,7 +3565,8 @@ function CTLD:_LoadCratesNearby(Group, Unit) self:_RefreshLoadCratesMenu(Group, Unit) -- clean up real world crates self:_CleanupTrackedCrates(crateidsloaded) - self:__CratesPickedUp(1, Group, Unit, loaded.Cargo) + self:__CratesPickedUp(1, Group, Unit, loaded.Cargo) + self:_RefreshCrateQuantityMenus(Group, Unit, nil) end end return self @@ -3788,7 +4022,10 @@ function CTLD:_UnloadTroops(Group, Unit) if _troop.Name == name then local stock = _troop:GetStock() -- avoid making unlimited stock limited - if stock and tonumber(stock) >= 0 then _troop:AddStock() end + if stock and tonumber(stock) >= 0 then + _troop:AddStock() + self:_RefreshTroopQuantityMenus(Group, Unit, _troop) + end end end end @@ -3798,6 +4035,7 @@ function CTLD:_UnloadTroops(Group, Unit) self.Loaded_Cargo[unitname] = loaded self:_RefreshDropTroopsMenu(Group,Unit) self:_UpdateUnitCargoMass(Unit) + self:_RefreshTroopQuantityMenus(Group, Unit, nil) else if IsHerc then self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group) @@ -3893,6 +4131,7 @@ function CTLD:_UnloadCrates(Group, Unit) self:_UpdateUnitCargoMass(Unit) self:_RefreshDropCratesMenu(Group,Unit) + self:_RefreshCrateQuantityMenus(Group, Unit, nil) else if IsHerc then self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group) @@ -3997,23 +4236,62 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop) end -- let\'s get going if canbuild then + local notified=false -- loop again for _,_build in pairs(buildables) do local build = _build -- #CTLD.Buildable if build.CanBuild then - self:_CleanUpCrates(crates,build,number) - if self.buildtime and self.buildtime > 0 then + local required = build.Required or 1 + if required < 1 then required = 1 end + local full = math.floor((build.Found or 0)/required) + if full < 1 then full = 1 end + + local sep = self.buildPairSeparation or 25 + local hdg = (Unit:GetHeading()+180)%360 + local lat = (hdg+90)%360 + local base = Unit:GetCoordinate():Translate(20,hdg) + + if full == 1 then + local cratesNow, numberNow = self:_FindCratesNearby(Group,Unit, finddist,true,true) + self:_CleanUpCrates(cratesNow,build,numberNow) + self:_RefreshLoadCratesMenu(Group,Unit) + if self.buildtime and self.buildtime > 0 then local buildtimer = TIMER:New(self._BuildObjectFromCrates,self,Group,Unit,build,false,Group:GetCoordinate(),MultiDrop) buildtimer:Start(self.buildtime) - self:_SendMessage(string.format("Build started, ready in %d seconds!",self.buildtime),15,false,Group) - self:__CratesBuildStarted(1,Group,Unit,build.Name) - self:_RefreshDropTroopsMenu(Group,Unit) + if not notified then + self:_SendMessage(string.format("Build started, ready in %d seconds!",self.buildtime),15,false,Group) + notified=true + end + self:__CratesBuildStarted(1,Group,Unit,build.Name) + else + self:_BuildObjectFromCrates(Group,Unit,build,false,nil,MultiDrop) + end else - self:_BuildObjectFromCrates(Group,Unit,build,false,nil,MultiDrop) + local start = -((full-1)*sep)/2 + for n=1,full do + local cratesNow, numberNow = self:_FindCratesNearby(Group,Unit, finddist,true,true) + self:_CleanUpCrates(cratesNow,build,numberNow) + self:_RefreshLoadCratesMenu(Group,Unit) + local off = start + (n-1)*sep + local coord = base:Translate(off,lat):GetVec2() + local b = { Name=build.Name, Required=build.Required, Template=build.Template, CanBuild=true, Type=build.Type, Coord=coord } + if self.buildtime and self.buildtime > 0 then + local buildtimer = TIMER:New(self._BuildObjectFromCrates,self,Group,Unit,b,false,Group:GetCoordinate(),MultiDrop) + buildtimer:Start(self.buildtime) + if not notified then + self:_SendMessage(string.format("Build started, ready in %d seconds!",self.buildtime),15,false,Group) + notified=true + end + self:__CratesBuildStarted(1,Group,Unit,build.Name) + else + self:_BuildObjectFromCrates(Group,Unit,b,false,nil,MultiDrop) + end + end end end end end + else if not Engineering then self:_SendMessage(string.format("No crates within %d meters!",finddist), 10, false, Group) end end -- number > 0 @@ -4035,28 +4313,37 @@ function CTLD:_PackCratesNearby(Group, Unit) -- get nearby vehicles local location = Group:GetCoordinate() -- get coordinate of group using function - local nearestGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({ZONE_RADIUS:New("TempZone", location:GetVec2(), self.PackDistance, false)}):FilterOnce() -- get all groups withing PackDistance from group using function - -- get template name of all vehicles in zone + local nearestGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({ZONE_RADIUS:New("TempZone", location:GetVec2(), self.PackDistance, false)}):FilterOnce() + + local packedAny = false -- determine if group is packable for _, _Group in pairs(nearestGroups.Set) do -- convert #SET_GROUP to a list of Wrapper.Group#GROUP + local didPackThisGroup = false for _, _Template in pairs(_DATABASE.Templates.Groups) do -- iterate through the database of templates - if (string.match(_Group:GetName(), _Template.GroupName)) then -- check if the Wrapper.Group#GROUP near the player is in the list of templates by name - -- generate crates and destroy group + if string.match(_Group:GetName(), _Template.GroupName) then -- check if the Wrapper.Group#GROUP near the player is in the list of templates by name for _, _entry in pairs(self.Cargo_Crates) do -- iterate through #CTLD_CARGO - if (_entry.Templates[1] == _Template.GroupName) then -- check if the #CTLD_CARGO matches the template name - _Group:Destroy() -- if a match is found destroy the Wrapper.Group#GROUP near the player + if _entry.Templates[1] == _Template.GroupName then -- check if the #CTLD_CARGO matches the template name + _Group:Destroy() self:_GetCrates(Group, Unit, _entry, nil, false, true) -- spawn the appropriate crates near the player self:_RefreshLoadCratesMenu(Group,Unit) -- call the refresher to show the crates in the menu self:__CratesPacked(1,Group,Unit,_entry) - return true + packedAny = true + didPackThisGroup = true + break end end end + if didPackThisGroup then break end end end + + if not packedAny then self:_SendMessage("Nothing to pack at this distance pilot!",10,false,Group) return false + end + + return true end --- (Internal) Function to repair nearby vehicles / FOBs @@ -4275,7 +4562,8 @@ function CTLD:_CleanUpCrates(Crates,Build,Number) if name == nametype then -- matching crate type table.insert(destIDs,thisID) found = found + 1 - nowcrate:GetPositionable():Destroy(false) + local pos = nowcrate:GetPositionable() + if pos then pos:Destroy(false) end nowcrate.Positionable = nil nowcrate.HasBeenDropped = false end @@ -4344,14 +4632,42 @@ end --- (Internal) Helper - get and load in one step -- @param Wrapper.Group#GROUP Group The calling group -- @param Wrapper.Unit#UNIT Unit The calling unit -function CTLD:_GetAndLoad(Group,Unit,cargoObj) - if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then - self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) - return self +-- @param #CTLD_CARGO cargoObj +-- @param #number quantity +function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity) + if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then + self:_SendMessage("You need to open the door(s) to load cargo!", 10, false, Group) + return self + end + local needed = cargoObj and cargoObj:GetCratesNeeded() or 1 + local count = math.max(1, tonumber(quantity) or 1) + local capacitySets = nil + local cap = self:_GetUnitCapabilities(Unit) + local limit = cap and cap.cratelimit or 0 + if limit > 0 then + local ld = self.Loaded_Cargo and self.Loaded_Cargo[Unit:GetName()] or nil + local loaded = (ld and type(ld.Cratesloaded) == "number") and ld.Cratesloaded or 0 + local space = limit - loaded + if space < 0 then space = 0 end + local perSet = needed > 0 and needed or 1 + capacitySets = math.floor(space / perSet) + if capacitySets < 1 then + self:_SendMessage("No capacity to load more now!", 10, false, Group) + return self end - self:_GetCrates(Group,Unit,cargoObj) - - timer.scheduleFunction(function() self:_LoadSingleCrateSet(Group,Unit,cargoObj.Name) end,{},timer.getTime()+1) + if count > capacitySets then count = capacitySets end + end + local total = needed * count + local ok = self:_GetCrates(Group, Unit, cargoObj, total, false, false, true) + if ok then + local uname = Unit:GetName() + self._batchCrateLoad = self._batchCrateLoad or {} + self._batchCrateLoad[uname] = { remaining = count, group = Group, cname = cargoObj.Name, loaded = 0, partials = 0 } + for i = 1, count do + timer.scheduleFunction(function() self:_LoadSingleCrateSet(Group, Unit, cargoObj.Name) end, {}, timer.getTime() + 0.2 * i) + end + end + return self end -- @param Wrapper.Group#GROUP Group The player’s group that triggered the action @@ -4364,13 +4680,278 @@ function CTLD:_GetAllAndLoad(Group,Unit) timer.scheduleFunction(function() self:_LoadCratesNearby(Group,Unit) end,{},timer.getTime()+1) end +--- (Internal) Function to get crate stock table entry. +-- @param #CTLD self +-- @param #CTLD_CARGO cargoObj Cargo object. +-- @param #table stockSummary Stock summary table. +-- @return #table Stock entry or nil. +function CTLD:_GetCrateStockEntry(cargoObj, stockSummary) + if not cargoObj or not stockSummary then + return nil + end + local name = cargoObj:GetName() + if not name then + return nil + end + return stockSummary[name] +end +--- (Internal) Function to format crate stock suffix for menu text. +-- @param #CTLD self +-- @param #CTLD_CARGO cargoObj Cargo object. +-- @param #table stockSummary Stock summary table. +-- @return #string Formatted suffix like "[3]" or "[3/10]" or nil. +function CTLD:_FormatCrateStockSuffix(cargoObj, stockSummary) + if not cargoObj then + return nil + end + local stockEntry = self:_GetCrateStockEntry(cargoObj, stockSummary) + local available = nil + if stockEntry and type(stockEntry.Stock) == "number" then + available = stockEntry.Stock + end + if type(available) ~= "number" then + local direct = cargoObj:GetStock() + if type(direct) == "number" then + available = direct + end + end + if type(available) ~= "number" or available < 0 then + return nil + end + local rounded = math.floor(available + 0.5) + local total = nil + if stockEntry and type(stockEntry.Stock0) == "number" and stockEntry.Stock0 >= 0 then + total = math.floor(stockEntry.Stock0 + 0.5) + elseif stockEntry and type(stockEntry.Sum) == "number" and stockEntry.Sum >= 0 then + total = math.floor(stockEntry.Sum + 0.5) + end + if type(total) ~= "number" then + local baseTotal = cargoObj.GetStock0 and cargoObj:GetStock0() or nil + if type(baseTotal) == "number" and baseTotal >= 0 then + total = math.floor(baseTotal + 0.5) + end + end + if type(total) == "number" and total > 0 and total ~= rounded then + return string.format("[%d/%d]", rounded, total) + else + return string.format("[%d]", rounded) + end +end + +--- (Internal) Function to refresh quantity submenus for crates for a single player group. +-- @param #CTLD self +-- @param Wrapper.Group#GROUP Group +-- @param Wrapper.Unit#UNIT Unit +-- @param #CTLD_CARGO CargoObj Optional; if given and stock < maxCrateMenuQuantity, do global rebuild. +-- @return #CTLD self +function CTLD:_RefreshCrateQuantityMenus(Group, Unit, CargoObj) + if not Group and Unit then Group = Unit:GetGroup() end + if Group and Unit then + local uname = Unit:GetName() or "none" + self._qtySnap = self._qtySnap or {} + self._qtySnap[uname] = self._qtySnap[uname] or {} + if Group.CTLD_CrateMenus then + local present = {} + for item,_ in pairs(Group.CTLD_CrateMenus) do present["C:"..tostring(item)] = true end + for key,_ in pairs(self._qtySnap[uname]) do + if string.sub(key,1,2)=="C:" and not present[key] then + self._qtySnap[uname][key] = nil + end + end + local stockSummary = self.showstockinmenuitems and self:_CountStockPlusInHeloPlusAliveGroups(false) or nil + for item, menu in pairs(Group.CTLD_CrateMenus) do + menu:RemoveSubMenus() + local obj = self:_FindCratesCargoObject(item) + if obj then self:_AddCrateQuantityMenus(Group, Unit, menu, obj, stockSummary) end + end + end + end + if CargoObj and Group and Unit then + local uname = Unit:GetName() or "none" + local cap = (self:_GetUnitCapabilities(Unit).cratelimit or 0) + local loaded = (self.Loaded_Cargo[uname] and self.Loaded_Cargo[uname].Cratesloaded) or 0 + local avail = math.max(0, cap - loaded) + local per = CargoObj:GetCratesNeeded() or 1 + if per < 1 then per = 1 end + local unitAvail = math.max(0, math.min(self.maxCrateMenuQuantity or 1, math.floor(avail/per))) + local s = CargoObj:GetStock() + self._qtySnap = self._qtySnap or {} + self._qtySnap[uname] = self._qtySnap[uname] or {} + local k = "C:"..(CargoObj:GetName() or "none") + local snap = tostring(type(s)=="number" and s or -1)..":"..tostring(unitAvail) + if self._qtySnap[uname][k] ~= snap then + self._qtySnap[uname][k] = snap + if type(s)=="number" and s>=0 and s=0 and s=0 and s=0 and s= 0) and (self.showstockinmenuitems == true) then menutext = menutext.." ["..stock.."]" end - MENU_GROUP_COMMAND:New(_group, menutext, subcatmenus[cargoObj.Subcategory], self._LoadTroops, self, _group, _unit, cargoObj) + local parent = subcatmenus[cargoObj.Subcategory] or troopsmenu + local mSet = MENU_GROUP:New(_group, menutext, parent) + _group.CTLD_TroopMenus[cargoObj.Name] = mSet + self:_AddTroopQuantityMenus(_group,_unit,mSet,cargoObj) end end else for _, cargoObj in pairs(self.Cargo_Troops) do if not cargoObj.DontShowInMenu then - local stock = cargoObj:GetStock() local menutext = cargoObj.Name - if (stock >= 0) and (self.showstockinmenuitems == true) then menutext = menutext.." ["..stock.."]" end - MENU_GROUP_COMMAND:New(_group, menutext, troopsmenu, self._LoadTroops, self, _group, _unit, cargoObj) + local mSet = MENU_GROUP:New(_group, menutext, troopsmenu) + _group.CTLD_TroopMenus[cargoObj.Name] = mSet + self:_AddTroopQuantityMenus(_group,_unit,mSet,cargoObj) end end end @@ -4509,60 +5093,46 @@ function CTLD:_RefreshF10Menus() local cratesmenu = MENU_GROUP:New(_group,"Get Crates",topcrates) if self.onestepmenu then + _group.CTLD_CrateMenus = {} + + local crateStockSummary = nil + if self.showstockinmenuitems then + crateStockSummary = self:_CountStockPlusInHeloPlusAliveGroups(false) + end + + local function addCrateMenuEntry(cargoObj,parentMenu) + if cargoObj.DontShowInMenu then + return + end + local needed = cargoObj:GetCratesNeeded() or 1 + local txt = string.format("%d crate%s %s (%dkg)",needed,needed==1 and "" or "s",cargoObj.Name,cargoObj.PerCrateMass or 0) + if cargoObj.Location then txt = txt.."[R]" end + if self.showstockinmenuitems then + local suffix = self:_FormatCrateStockSuffix(cargoObj,crateStockSummary) + if suffix then txt = txt..suffix end + end + local mSet = MENU_GROUP:New(_group,txt,parentMenu) + _group.CTLD_CrateMenus[cargoObj.Name] = mSet + self:_AddCrateQuantityMenus(_group,_unit,mSet,cargoObj,crateStockSummary) + end + if self.usesubcats then local subcatmenus = {} for catName,_ in pairs(self.subcats) do subcatmenus[catName] = MENU_GROUP:New(_group,catName,cratesmenu) end for _,cargoObj in pairs(self.Cargo_Crates) do - if not cargoObj.DontShowInMenu then - local needed = cargoObj:GetCratesNeeded() or 1 - local txt = string.format("%d crate%s %s (%dkg)",needed,needed==1 and "" or "s",cargoObj.Name,cargoObj.PerCrateMass or 0) - if cargoObj.Location then txt = txt.."[R]" end - local stock = cargoObj:GetStock() - if stock>=0 and self.showstockinmenuitems then txt = txt.."["..stock.."]" end - local mSet = MENU_GROUP:New(_group,txt,subcatmenus[cargoObj.Subcategory]) - MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) - MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) - end + addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory] or cratesmenu) end for _,cargoObj in pairs(self.Cargo_Statics) do - if not cargoObj.DontShowInMenu then - local needed = cargoObj:GetCratesNeeded() or 1 - local txt = string.format("%d crate%s %s (%dkg)",needed,needed==1 and "" or "s",cargoObj.Name,cargoObj.PerCrateMass or 0) - if cargoObj.Location then txt = txt.."[R]" end - local stock = cargoObj:GetStock() - if stock>=0 and self.showstockinmenuitems then txt = txt.."["..stock.."]" end - local mSet = MENU_GROUP:New(_group,txt,subcatmenus[cargoObj.Subcategory]) - MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) - MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) - end + addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory] or cratesmenu) end else for _,cargoObj in pairs(self.Cargo_Crates) do - if not cargoObj.DontShowInMenu then - local needed = cargoObj:GetCratesNeeded() or 1 - local txt = string.format("%d crate%s %s (%dkg)",needed,needed==1 and "" or "s",cargoObj.Name,cargoObj.PerCrateMass or 0) - if cargoObj.Location then txt = txt.."[R]" end - local stock = cargoObj:GetStock() - if stock>=0 and self.showstockinmenuitems then txt = txt.."["..stock.."]" end - local mSet = MENU_GROUP:New(_group,txt,cratesmenu) - MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) - MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) - end + addCrateMenuEntry(cargoObj,cratesmenu) end for _,cargoObj in pairs(self.Cargo_Statics) do - if not cargoObj.DontShowInMenu then - local needed = cargoObj:GetCratesNeeded() or 1 - local txt = string.format("%d crate%s %s (%dkg)",needed,needed==1 and "" or "s",cargoObj.Name,cargoObj.PerCrateMass or 0) - if cargoObj.Location then txt = txt.."[R]" end - local stock = cargoObj:GetStock() - if stock>=0 and self.showstockinmenuitems then txt = txt.."["..stock.."]" end - local mSet = MENU_GROUP:New(_group,txt,cratesmenu) - MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) - MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) - - end + addCrateMenuEntry(cargoObj,cratesmenu) end end else @@ -4691,14 +5261,14 @@ function CTLD:_RefreshF10Menus() self.MenusDone[_unitName] = true self:_RefreshLoadCratesMenu(_group,_unit) self:_RefreshDropCratesMenu(_group,_unit) - + if firstBuild then menucount=menucount+1 end + if firstBuild and not self.showstockinmenuitems then self:_RefreshQuantityMenusForGroup(_group,_unit) end end -- if _group end -- if _unit else self:T(self.lid .. " Menus already done for this group!") end end -- for all pilot units - return self end @@ -4794,6 +5364,9 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName) end local found = #matchingCrates + local batch = self._batchCrateLoad and self._batchCrateLoad[Unit:GetName()] or nil + local prevSuppress = self.suppressmessages + if batch and batch.cname == cargoName then self.suppressmessages = true end -- 4) Check capacity local unitName = Unit:GetName() @@ -4848,26 +5421,47 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName) -- 7) Show final message, including a special note if capacity is now reached local loadedHere = toLoad - if loadedHere < needed and loadedData.Cratesloaded >= capacity then - self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s. Cargo limit is now reached!", loadedHere, needed, cargoName), 10, false, Group) - else - local fullSets = math.floor(loadedHere / needed) - local leftover = loadedHere % needed - if needed > 1 then - if fullSets > 0 and leftover == 0 then - self:_SendMessage(string.format("Loaded %d %s.", fullSets, cargoName), 10, false, Group) - elseif fullSets > 0 and leftover > 0 then - self:_SendMessage(string.format("Loaded %d %s(s), with %d leftover crate(s).", fullSets, cargoName, leftover), 10, false, Group) - else - self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s.", loadedHere, needed, cargoName), 15, false, Group) - end + if not batch then + if loadedHere < needed and loadedData.Cratesloaded >= capacity then + self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s. Cargo limit is now reached!", loadedHere, needed, cargoName), 10, false, Group) else - self:_SendMessage(string.format("Loaded %d %s(s).", loadedHere, cargoName), 10, false, Group) + local fullSets = math.floor(loadedHere / needed) + local leftover = loadedHere % needed + if needed > 1 then + if fullSets > 0 and leftover == 0 then + self:_SendMessage(string.format("Loaded %d %s.", fullSets, cargoName), 10, false, Group) + elseif fullSets > 0 and leftover > 0 then + self:_SendMessage(string.format("Loaded %d %s(s), with %d leftover crate(s).", fullSets, cargoName, leftover), 10, false, Group) + else + self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s.", loadedHere, needed, cargoName), 15, false, Group) + end + else + self:_SendMessage(string.format("Loaded %d %s(s).", loadedHere, cargoName), 10, false, Group) + end end end self:_RefreshLoadCratesMenu(Group, Unit) self:_RefreshDropCratesMenu(Group, Unit) + self:_RefreshCrateQuantityMenus(Group, Unit, self:_FindCratesCargoObject(cargoName)) + + if batch and batch.cname == cargoName then + local setsLoaded = math.floor((loadedHere or 0) / (needed or 1)) + batch.loaded = (batch.loaded or 0) + (setsLoaded or 0) + if loadedHere < (needed or 1) then batch.partials = (batch.partials or 0) + 1 end + batch.remaining = (batch.remaining or 1) - 1 + if batch.remaining <= 0 then + self.suppressmessages = prevSuppress + local txt = string.format("Loaded %d %s.", batch.loaded, cargoName) + if batch.partials and batch.partials > 0 then + txt = txt .. " Some sets could not be fully loaded." + end + self:_SendMessage(txt, 10, false, batch.group) + self._batchCrateLoad[Unit:GetName()] = nil + else + self.suppressmessages = prevSuppress + end + end return self end @@ -4990,6 +5584,7 @@ end self:_UpdateUnitCargoMass(Unit) self:_RefreshDropCratesMenu(Group, Unit) self:_RefreshLoadCratesMenu(Group, Unit) + self:_RefreshCrateQuantityMenus(Group, Unit, nil) return self end @@ -5052,29 +5647,62 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) local needed=list[1]:GetCratesNeeded() or 1 table.sort(list,function(a,b)return a:GetID()=needed then + local sets=math.floor(#list/(needed>0 and needed or 1)) + if sets>0 then + local parentLabel=string.format("%d. %s (%d SET)",lineIndex,cName,sets) + local parentMenu=MENU_GROUP:New(Group,parentLabel,dropCratesMenu) + for s=1,sets do local chunk={} - for n=i,i+needed-1 do - table.insert(chunk,list[n]) - end - local label=string.format("%d. %s",lineIndex,cName) + for n=i,i+needed-1 do table.insert(chunk,list[n]) end table.insert(self.CrateGroupList[Unit:GetName()],chunk) - local setIndex=#self.CrateGroupList[Unit:GetName()] - MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) i=i+needed - else - local chunk={} - for n=i,#list do - table.insert(chunk,list[n]) - end - local label=string.format("%d. %s %d/%d",lineIndex,cName,left,needed) - table.insert(self.CrateGroupList[Unit:GetName()],chunk) - local setIndex=#self.CrateGroupList[Unit:GetName()] - MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) - i=#list+1 end + if sets==1 then + MENU_GROUP_COMMAND:New(Group,"Drop",parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + local uName=UnitArg:GetName() + for k=1,qty do + local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] + if not lst then break end + local idx=nil + for j=1,#lst do + local ch=lst[j] + local first=ch and ch[1] + if first and (not first:WasDropped()) and first:GetName()==cNameArg and #ch>=neededArg then idx=j break end + end + if not idx then break end + selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx) + end + end,self,Group,Unit,cName,needed,1) + else + for q=1,sets do + local qm=MENU_GROUP:New(Group,string.format("Drop %d Set%s",q,q>1 and "s" or ""),parentMenu) + MENU_GROUP_COMMAND:New(Group,"Drop",qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + local uName=UnitArg:GetName() + for k=1,qty do + local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] + if not lst then break end + local idx=nil + for j=1,#lst do + local ch=lst[j] + local first=ch and ch[1] + if first and (not first:WasDropped()) and first:GetName()==cNameArg and #ch>=neededArg then idx=j break end + end + if not idx then break end + selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx) + end + end,self,Group,Unit,cName,needed,q) + end + end + lineIndex=lineIndex+1 + end + if i<=#list then + local left=#list-i+1 + local chunk={} + for n=i,#list do table.insert(chunk,list[n]) end + table.insert(self.CrateGroupList[Unit:GetName()],chunk) + local setIndex=#self.CrateGroupList[Unit:GetName()] + local label=string.format("%d. %s %d/%d",lineIndex,cName,left,needed) + MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) lineIndex=lineIndex+1 end end @@ -5097,39 +5725,105 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit) local needed=list[1]:GetCratesNeeded() or 1 table.sort(list,function(a,b)return a:GetID()=needed then + local sets=math.floor(#list/(needed>0 and needed or 1)) + if sets>0 then + local parentLabel=string.format("%d. %s (%d SET)",lineIndex,cName,sets) + local parentMenu=MENU_GROUP:New(Group,parentLabel,dropCratesMenu) + for s=1,sets do local chunk={} - for n=i,i+needed-1 do - table.insert(chunk,list[n]) - end - local label=string.format("%d. %s",lineIndex,cName) + for n=i,i+needed-1 do table.insert(chunk,list[n]) end table.insert(self.CrateGroupList[Unit:GetName()],chunk) - local setIndex=#self.CrateGroupList[Unit:GetName()] - local mSet=MENU_GROUP:New(Group,label,dropCratesMenu) - MENU_GROUP_COMMAND:New(Group,"Drop",mSet,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) - if not ( self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) ) then - MENU_GROUP_COMMAND:New(Group,"Drop and build",mSet,self._DropSingleAndBuild,self,Group,Unit,setIndex) - end i=i+needed - else - local chunk={} - for n=i,#list do - table.insert(chunk,list[n]) - end - local label=string.format("%d. %s %d/%d",lineIndex,cName,left,needed) - table.insert(self.CrateGroupList[Unit:GetName()],chunk) - local setIndex=#self.CrateGroupList[Unit:GetName()] - MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) - i=#list+1 end + if sets==1 then + MENU_GROUP_COMMAND:New(Group,"Drop",parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + local uName=UnitArg:GetName() + for k=1,qty do + local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] + if not lst then break end + local idx=nil + for j=1,#lst do + local ch=lst[j] + local first=ch and ch[1] + if first and (not first:WasDropped()) and first:GetName()==cNameArg and #ch>=neededArg then idx=j break end + end + if not idx then break end + selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx) + end + end,self,Group,Unit,cName,needed,1) + if not ( self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) ) then + MENU_GROUP_COMMAND:New(Group,"Drop and build",parentMenu,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + local uName=UnitArg:GetName() + for k=1,qty do + local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] + if not lst then break end + local idx=nil + for j=1,#lst do + local ch=lst[j] + local first=ch and ch[1] + if first and (not first:WasDropped()) and first:GetName()==cNameArg and #ch>=neededArg then idx=j break end + end + if not idx then break end + selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx) + end + selfArg:_BuildCrates(GroupArg,UnitArg) + end,self,Group,Unit,cName,needed,1) + end + else + for q=1,sets do + local qm=MENU_GROUP:New(Group,string.format("Drop %d Set%s",q,q>1 and "s" or ""),parentMenu) + MENU_GROUP_COMMAND:New(Group,"Drop",qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + local uName=UnitArg:GetName() + for k=1,qty do + local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] + if not lst then break end + local idx=nil + for j=1,#lst do + local ch=lst[j] + local first=ch and ch[1] + if first and (not first:WasDropped()) and first:GetName()==cNameArg and #ch>=neededArg then idx=j break end + end + if not idx then break end + selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx) + end + end,self,Group,Unit,cName,needed,q) + if not ( self:IsUnitInAir(Unit) and self:IsFixedWing(Unit) ) then + MENU_GROUP_COMMAND:New(Group,"Drop and build",qm,function(selfArg,GroupArg,UnitArg,cNameArg,neededArg,qty) + local uName=UnitArg:GetName() + for k=1,qty do + local lst=selfArg.CrateGroupList and selfArg.CrateGroupList[uName] + if not lst then break end + local idx=nil + for j=1,#lst do + local ch=lst[j] + local first=ch and ch[1] + if first and (not first:WasDropped()) and first:GetName()==cNameArg and #ch>=neededArg then idx=j break end + end + if not idx then break end + selfArg:_UnloadSingleCrateSet(GroupArg,UnitArg,idx) + end + selfArg:_BuildCrates(GroupArg,UnitArg) + end,self,Group,Unit,cName,needed,q) + end + end + end + lineIndex=lineIndex+1 + end + if i<=#list then + local left=#list-i+1 + local chunk={} + for n=i,#list do table.insert(chunk,list[n]) end + table.insert(self.CrateGroupList[Unit:GetName()],chunk) + local setIndex=#self.CrateGroupList[Unit:GetName()] + local label=string.format("%d. %s %d/%d",lineIndex,cName,left,needed) + MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) lineIndex=lineIndex+1 end end end end + --- (Internal) Function to unload a single Troop group by ID. -- @param #CTLD self -- @param Wrapper.Group#GROUP Group The calling group. @@ -5267,6 +5961,7 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID) local st = _troop:GetStock() if st and tonumber(st) >= 0 then _troop:AddStock() + self:_RefreshTroopQuantityMenus(Group, Unit, _troop) end end end @@ -5298,6 +5993,7 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID) self.Loaded_Cargo[unitName].Troopsloaded = troopsLoaded self.Loaded_Cargo[unitName].Cratesloaded = cratesLoaded self:_RefreshDropTroopsMenu(Group, Unit) + self:_RefreshTroopQuantityMenus(Group, Unit, nil) else local isHerc = self:IsFixedWing(Unit) if isHerc then @@ -6645,6 +7341,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:AddStock(number) + self:_RefreshTroopQuantityMenus(nil, nil, _troop) break end end @@ -6664,6 +7361,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:AddStock(number) + self:_RefreshCrateQuantityMenus(nil, nil, _troop) break end end @@ -6683,6 +7381,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:AddStock(number) + self:_RefreshQuantityMenusForGroup() break end end @@ -6702,6 +7401,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:SetStock(number) + self:_RefreshCrateQuantityMenus(nil, nil, _troop) break end end @@ -6721,6 +7421,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:SetStock(number) + self:_RefreshTroopQuantityMenus(nil, nil, _troop) break end end @@ -6740,6 +7441,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:SetStock(number) + self:_RefreshQuantityMenusForGroup() break end end @@ -6819,6 +7521,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:RemoveStock(number) + self:_RefreshTroopQuantityMenus(nil, nil, _troop) end end return self @@ -6837,6 +7540,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:RemoveStock(number) + self:_RefreshQuantityMenusForGroup() end end return self @@ -6855,6 +7559,7 @@ end for _id,_troop in pairs (gentroops) do -- #number, #CTLD_CARGO if _troop.Name == name then _troop:RemoveStock(number) + self:_RefreshQuantityMenusForGroup() end end return self @@ -7487,6 +8192,7 @@ end self:T({From, Event, To}) if self.movetroopstowpzone and Type ~= CTLD_CARGO.Enum.ENGINEERS then self:_MoveGroupToZone(Troops) + if not Group or not Unit then self:_RefreshQuantityMenusForGroup() end end return self end @@ -7557,6 +8263,7 @@ end self:_MoveGroupToZone(Vehicle) end end + if not Group or not Unit then self:_RefreshQuantityMenusForGroup() end return self end @@ -7914,7 +8621,7 @@ end local injecttroops = CTLD_CARGO:New(nil,cargoname,cargotemplates,cargotype,true,true,size,nil,true,mass) self:InjectTroops(dropzone,injecttroops,self.surfacetypes,self.useprecisecoordloads,structure,timestamp) end - elseif (type(groupname) == "string" and groupname == "STATIC") or cargotype == CTLD_CARGO.Enum.REPAIR then + elseif self.loadSavedCrates and (type(groupname) == "string" and groupname == "STATIC") or cargotype == CTLD_CARGO.Enum.REPAIR then local dropzone = ZONE_RADIUS:New("DropZone",vec2,20) local injectstatic = nil if cargotype == CTLD_CARGO.Enum.VEHICLE or cargotype == CTLD_CARGO.Enum.FOB then diff --git a/Moose Development/Moose/Ops/PlayerTask.lua b/Moose Development/Moose/Ops/PlayerTask.lua index 13cc66eba..1f5269ce9 100644 --- a/Moose Development/Moose/Ops/PlayerTask.lua +++ b/Moose Development/Moose/Ops/PlayerTask.lua @@ -21,7 +21,7 @@ -- === -- @module Ops.PlayerTask -- @image OPS_PlayerTask.jpg --- @date Last Update May 2025 +-- @date Last Update Oct 2025 do @@ -59,6 +59,8 @@ do -- @field #string FinalState -- @field #string TypeName -- @field #number PreviousCount +-- @field #boolean CanSmoke +-- @field #boolean ShowThreatDetails -- @extends Core.Fsm#FSM @@ -94,11 +96,13 @@ PLAYERTASK = { NextTaskFailure = {}, FinalState = "none", PreviousCount = 0, + CanSmoke = true, + ShowThreatDetails = true, } --- PLAYERTASK class version. -- @field #string version -PLAYERTASK.version="0.1.28" +PLAYERTASK.version="0.1.29" --- Generic task condition. -- @type PLAYERTASK.Condition @@ -231,6 +235,7 @@ function PLAYERTASK:New(Type, Target, Repeat, Times, TTSType) -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. + -- @param #boolen Silent If true, suppress message output on cancel. --- On After "Planned" event. Task has been planned. -- @function [parent=#PLAYERTASK] OnAfterPilotPlanned @@ -468,6 +473,26 @@ function PLAYERTASK:SetSubType(Type) return self end +--- [USER] Set if a task can have a smoke marker. +-- @param #PLAYERTASK self +-- @param #boolean OnOff If true (default) it can be smoke, false if not. +-- @return #PLAYERTASK self +function PLAYERTASK:SetCanSmoke(OnOff) + self:T(self.lid.."AddSSetCanSmokeubType") + self.CanSmoke = OnOff + return self +end + +--- [USER] Set if a task can show threat details. +-- @param #PLAYERTASK self +-- @param #boolean OnOff If true (default) it can be shown, false if not. +-- @return #PLAYERTASK self +function PLAYERTASK:SetShowThreatDetails(OnOff) + self:T(self.lid.."SetShowThreatDetails") + self.ShowThreatDetails = OnOff + return self +end + --- [USER] Get task sub type description from this task. -- @param #PLAYERTASK self -- @return #string Type or nil @@ -1173,11 +1198,12 @@ end -- @param #string From -- @param #string Event -- @param #string To +-- @param #boolean Silent -- @return #PLAYERTASK self -function PLAYERTASK:onafterCancel(From, Event, To) +function PLAYERTASK:onafterCancel(From, Event, To, Silent) self:T({From, Event, To}) if self.TaskController then - self.TaskController:__TaskCancelled(-1,self) + self.TaskController:__TaskCancelled(-1,self, Silent) end self.timestamp = timer.getAbsTime() self.FinalState = "Cancelled" @@ -1606,7 +1632,7 @@ do -- -- The event is triggered when a task was cancelled manually. Use @{#PLAYERTASKCONTROLLER.OnAfterTaskCancelled}()` to link into this event: -- --- function taskmanager:OnAfterTaskCancelled(From, Event, To, Task) +-- function taskmanager:OnAfterTaskCancelled(From, Event, To, Task, Silent) -- ... your code here ... -- end -- @@ -1770,12 +1796,15 @@ PLAYERTASKCONTROLLER.Messages = { THREATMEDIUM = "medium", THREATLOW = "low", THREATTEXT = "%s\nThreat: %s\nTargets left: %d\nCoord: %s", + NOTHREATTEXT = "%s\nNo target information available.", ELEVATION = "\nTarget Elevation: %s %s", METER = "meter", FEET = "feet", THREATTEXTTTS = "%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.", + NOTHREATTEXTTTS = "%s, %s. No target information available.", MARKTASK = "%s, %s, copy, task %03d location marked on map!", SMOKETASK = "%s, %s, copy, task %03d location smoked!", + NOSMOKETASK = "%s, %s, negative, task %03d location cannot be smoked!", FLARETASK = "%s, %s, copy, task %03d location illuminated!", ABORTTASK = "All stations, %s, %s has aborted %s task %03d!", UNKNOWN = "Unknown", @@ -1854,12 +1883,15 @@ PLAYERTASKCONTROLLER.Messages = { THREATMEDIUM = "mittel", THREATLOW = "niedrig", THREATTEXT = "%s\nGefahrstufe: %s\nZiele: %d\nKoord: %s", + NOTHREATTEXT = "%s\nKeine Zielinformation verfügbar.", ELEVATION = "\nZiel Höhe: %s %s", METER = "Meter", FEET = "Fuss", THREATTEXTTTS = "%s, %s. Zielinformation zu %s. Gefahrstufe %s. Ziele %d. Zielposition %s.", + NOTHREATTEXTTTS = "%s, %s. Keine Zielinformation verfügbar.", MARKTASK = "%s, %s, verstanden, Zielposition %03d auf der Karte markiert!", SMOKETASK = "%s, %s, verstanden, Zielposition %03d mit Rauch markiert!", + NOSMOKETASK = "%s, %s, negativ, Zielposition %03d kann nicht markiert werden!", FLARETASK = "%s, %s, verstanden, Zielposition %03d beleuchtet!", ABORTTASK = "%s, an alle, %s hat Auftrag %s %03d abgebrochen!", UNKNOWN = "Unbekannt", @@ -1920,7 +1952,7 @@ PLAYERTASKCONTROLLER.Messages = { --- PLAYERTASK class version. -- @field #string version -PLAYERTASKCONTROLLER.version="0.1.70" +PLAYERTASKCONTROLLER.version="0.1.71" --- Create and run a new TASKCONTROLLER instance. -- @param #PLAYERTASKCONTROLLER self @@ -2061,6 +2093,7 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter) -- @param #string Event Event. -- @param #string To To state. -- @param Ops.PlayerTask#PLAYERTASK Task + -- @param #boolean Silent If true suppress message output. --- On After "TaskFailed" event. Task has failed. -- @function [parent=#PLAYERTASKCONTROLLER] OnAfterTaskFailed @@ -2741,11 +2774,12 @@ end --- [User] Manually cancel a specific task -- @param #PLAYERTASKCONTROLLER self --- @param Ops.PlayerTask#PLAYERTASK Task The task to be cancelled +-- @param Ops.PlayerTask#PLAYERTASK Task The task to be cancelled. +-- @param #boolean Silent If true suppress message output. -- @return #PLAYERTASKCONTROLLER self -function PLAYERTASKCONTROLLER:CancelTask(Task) +function PLAYERTASKCONTROLLER:CancelTask(Task,Silent) self:T(self.lid.."CancelTask") - Task:__Cancel(-1) + Task:__Cancel(-1,Silent) return self end @@ -3734,6 +3768,7 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Task, Group, Client) local Elevation = Coordinate:GetLandHeight() or 0 -- meters local CoordText = "" local CoordTextLLDM = nil + local ShowThreatInfo = task.ShowThreatDetails local LasingDrone = self:_FindLasingDroneForTaskID(task.PlayerTaskNr) if self.Type ~= PLAYERTASKCONTROLLER.Type.A2A then CoordText = Coordinate:ToStringA2G(Client,nil,self.ShowMagnetic) @@ -3757,7 +3792,12 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Task, Group, Client) local clientlist, clientcount = task:GetClients() local ThreatGraph = "[" .. string.rep( "■", ThreatLevel ) .. string.rep( "□", 10 - ThreatLevel ) .. "]: "..ThreatLevel local ThreatLocaleText = self.gettext:GetEntry("THREATTEXT",self.locale) - text = string.format(ThreatLocaleText, taskname, ThreatGraph, targets, CoordText) + if ShowThreatInfo == true then + text = string.format(ThreatLocaleText, taskname, ThreatGraph, targets, CoordText) + else + ThreatLocaleText = self.gettext:GetEntry("NOTHREATTEXT",self.locale) + text = string.format(ThreatLocaleText, taskname) + end local settings = _DATABASE:GetPlayerSettings(playername) or _SETTINGS -- Core.Settings#SETTINGS local elevationmeasure = self.gettext:GetEntry("FEET",self.locale) if settings:IsMetric() then @@ -3880,9 +3920,19 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Task, Group, Client) end --self:I(self.lid.." | ".. CoordText) end + local ttstext local ThreatLocaleTextTTS = self.gettext:GetEntry("THREATTEXTTTS",self.locale) - local ttstext = string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name,ttstaskname,ThreatLevelText, targets, CoordText) + -- THREATTEXT = "%s\nThreat: %s\nTargets left: %d\nCoord: %s", + -- THREATTEXTTTS = "%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.", + if ShowThreatInfo == true then + ttstext = string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name,ttstaskname,ThreatLevelText, targets, CoordText) + else + ThreatLocaleTextTTS = self.gettext:GetEntry("NOTHREATTEXTTTS",self.locale) + ttstext = string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name) + end + -- POINTERTARGETLASINGTTS = ". Pointer over target and lasing." + if task.Type == AUFTRAG.Type.PRECISIONBOMBING and self.precisionbombing then if LasingDrone and LasingDrone.playertask.inreach and LasingDrone:IsLasing() then local lasingtext = self.gettext:GetEntry("POINTERTARGETLASINGTTS",self.locale) @@ -3951,15 +4001,25 @@ function PLAYERTASKCONTROLLER:_SmokeTask(Group, Client) local text = "" if self.TasksPerPlayer:HasUniqueID(playername) then local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK - task:SmokeTarget() - local textmark = self.gettext:GetEntry("SMOKETASK",self.locale) - text = string.format(textmark, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr) - self:T(self.lid..text) - --local m=MESSAGE:New(text,"10","Tasking"):ToAll() - if self.UseSRS then - self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) + if task.CanSmoke == true then + task:SmokeTarget() + local textmark = self.gettext:GetEntry("SMOKETASK",self.locale) + text = string.format(textmark, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr) + self:T(self.lid..text) + --local m=MESSAGE:New(text,"10","Tasking"):ToAll() + if self.UseSRS then + self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) + end + self:__TaskTargetSmoked(5,task) + else + local textmark = self.gettext:GetEntry("NOSMOKETASK",self.locale) + text = string.format(textmark, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr) + self:T(self.lid..text) + --local m=MESSAGE:New(text,"10","Tasking"):ToAll() + if self.UseSRS then + self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) + end end - self:__TaskTargetSmoked(5,task) else text = self.gettext:GetEntry("NOACTIVETASK",self.locale) end @@ -4793,22 +4853,27 @@ end -- @param #string Event -- @param #string To -- @param Ops.PlayerTask#PLAYERTASK Task +-- @param #boolean Silent If true, suppress message output on cancel. -- @return #PLAYERTASKCONTROLLER self -function PLAYERTASKCONTROLLER:onafterTaskCancelled(From, Event, To, Task) +function PLAYERTASKCONTROLLER:onafterTaskCancelled(From, Event, To, Task, Silent) self:T({From, Event, To}) self:T(self.lid.."TaskCancelled") - local canceltxt = self.gettext:GetEntry("TASKCANCELLED",self.locale) - local canceltxttts = self.gettext:GetEntry("TASKCANCELLEDTTS",self.locale) - local taskname = string.format(canceltxt, Task.PlayerTaskNr, tostring(Task.Type)) - if not self.NoScreenOutput then - self:_SendMessageToClients(taskname,15) - --local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition) + if Silent ~= true then + local canceltxt = self.gettext:GetEntry("TASKCANCELLED",self.locale) + local canceltxttts = self.gettext:GetEntry("TASKCANCELLEDTTS",self.locale) + local taskname = string.format(canceltxt, Task.PlayerTaskNr, tostring(Task.Type)) + + if self.NoScreenOutput ~= true then + self:_SendMessageToClients(taskname,15) + --local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition) + end + + if self.UseSRS then + taskname = string.format(canceltxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType)) + self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) + end + end - if self.UseSRS then - taskname = string.format(canceltxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType)) - self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) - end - local clients=Task:GetClientObjects() for _,client in pairs(clients) do self:_RemoveMenuEntriesForTask(Task,client) diff --git a/Moose Development/Moose/Utilities/Enums.lua b/Moose Development/Moose/Utilities/Enums.lua index bbec787ed..adcb5f862 100644 --- a/Moose Development/Moose/Utilities/Enums.lua +++ b/Moose Development/Moose/Utilities/Enums.lua @@ -598,6 +598,8 @@ ENUMS.Storage = { bombs = {}, -- Bombs nurs = {}, -- Rockets and unguided containers = {}, -- Containers + shells = {}, -- Shells + gunmounts = {}, -- Gun Mounts droptanks = {}, -- Droptanks adapters = {}, -- Adapter torpedoes = {}, -- Torpedoes @@ -610,754 +612,1182 @@ ENUMS.Storage = { } } -ENUMS.Storage.weapons.nurs.SNEB_TYPE253_F1B = "weapons.nurs.SNEB_TYPE253_F1B" -ENUMS.Storage.weapons.missiles.P_24T = "weapons.missiles.P_24T" -ENUMS.Storage.weapons.bombs.BLU_3B_OLD = "weapons.bombs.BLU-3B_OLD" -ENUMS.Storage.weapons.missiles.AGM_154 = "weapons.missiles.AGM_154" -ENUMS.Storage.weapons.nurs.HYDRA_70_M151_M433 = "weapons.nurs.HYDRA_70_M151_M433" -ENUMS.Storage.weapons.bombs.SAM_Avenger_M1097_Skid_7090lb = "weapons.bombs.SAM Avenger M1097 Skid [7090lb]" -ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk5 = "weapons.bombs.British_GP_250LB_Bomb_Mk5" -ENUMS.Storage.weapons.containers.OV10_SMOKE = "weapons.containers.{OV10_SMOKE}" -ENUMS.Storage.weapons.bombs.BLU_4B_OLD = "weapons.bombs.BLU-4B_OLD" -ENUMS.Storage.weapons.bombs.FAB_500M54 = "weapons.bombs.FAB-500M54" -ENUMS.Storage.weapons.bombs.GBU_38 = "weapons.bombs.GBU_38" -ENUMS.Storage.weapons.containers.F_15E_AXQ_14_DATALINK = "weapons.containers.F-15E_AXQ-14_DATALINK" -ENUMS.Storage.weapons.bombs.BEER_BOMB = "weapons.bombs.BEER_BOMB" -ENUMS.Storage.weapons.bombs.P_50T = "weapons.bombs.P-50T" -ENUMS.Storage.weapons.nurs.C_8CM_GN = "weapons.nurs.C_8CM_GN" -ENUMS.Storage.weapons.bombs.FAB_500SL = "weapons.bombs.FAB-500SL" -ENUMS.Storage.weapons.bombs.KAB_1500Kr = "weapons.bombs.KAB_1500Kr" -ENUMS.Storage.weapons.bombs.two50_2 = "weapons.bombs.250-2" -ENUMS.Storage.weapons.droptanks.Spitfire_tank_1 = "weapons.droptanks.Spitfire_tank_1" -ENUMS.Storage.weapons.missiles.AGM_65G = "weapons.missiles.AGM_65G" -ENUMS.Storage.weapons.missiles.AGM_65A = "weapons.missiles.AGM_65A" -ENUMS.Storage.weapons.containers.Hercules_JATO = "weapons.containers.Hercules_JATO" -ENUMS.Storage.weapons.nurs.HYDRA_70_M259 = "weapons.nurs.HYDRA_70_M259" -ENUMS.Storage.weapons.missiles.AGM_84E = "weapons.missiles.AGM_84E" -ENUMS.Storage.weapons.bombs.AN_M30A1 = "weapons.bombs.AN_M30A1" -ENUMS.Storage.weapons.nurs.C_25 = "weapons.nurs.C_25" -ENUMS.Storage.weapons.containers.AV8BNA_ALQ164 = "weapons.containers.AV8BNA_ALQ164" -ENUMS.Storage.weapons.containers.lav_25 = "weapons.containers.lav-25" -ENUMS.Storage.weapons.missiles.P_60 = "weapons.missiles.P_60" -ENUMS.Storage.weapons.bombs.FAB_1500 = "weapons.bombs.FAB_1500" -ENUMS.Storage.weapons.droptanks.FuelTank_350L = "weapons.droptanks.FuelTank_350L" -ENUMS.Storage.weapons.bombs.AAA_Vulcan_M163_Skid_21577lb = "weapons.bombs.AAA Vulcan M163 Skid [21577lb]" -ENUMS.Storage.weapons.missiles.Kormoran = "weapons.missiles.Kormoran" -ENUMS.Storage.weapons.droptanks.HB_F14_EXT_DROPTANK_EMPTY = "weapons.droptanks.HB_F14_EXT_DROPTANK_EMPTY" -ENUMS.Storage.weapons.droptanks.FuelTank_150L = "weapons.droptanks.FuelTank_150L" -ENUMS.Storage.weapons.missiles.Rb_15F_for_A_I = "weapons.missiles.Rb 15F (for A.I.)" -ENUMS.Storage.weapons.missiles.RB75T = "weapons.missiles.RB75T" -ENUMS.Storage.weapons.missiles.Vikhr_M = "weapons.missiles.Vikhr_M" -ENUMS.Storage.weapons.nurs.FFAR_M156_WP = "weapons.nurs.FFAR M156 WP" -ENUMS.Storage.weapons.nurs.British_HE_60LBSAPNo2_3INCHNo1 = "weapons.nurs.British_HE_60LBSAPNo2_3INCHNo1" -ENUMS.Storage.weapons.missiles.DWS39_MJ2 = "weapons.missiles.DWS39_MJ2" -ENUMS.Storage.weapons.bombs.HEBOMBD = "weapons.bombs.HEBOMBD" -ENUMS.Storage.weapons.missiles.CATM_9M = "weapons.missiles.CATM_9M" -ENUMS.Storage.weapons.bombs.Mk_81 = "weapons.bombs.Mk_81" -ENUMS.Storage.weapons.droptanks.Drop_Tank_300_Liter = "weapons.droptanks.Drop_Tank_300_Liter" -ENUMS.Storage.weapons.containers.HMMWV_M1025 = "weapons.containers.HMMWV_M1025" -ENUMS.Storage.weapons.bombs.SAM_CHAPARRAL_Air_21624lb = "weapons.bombs.SAM CHAPARRAL Air [21624lb]" -ENUMS.Storage.weapons.missiles.AGM_154A = "weapons.missiles.AGM_154A" -ENUMS.Storage.weapons.bombs.Mk_84AIR_TP = "weapons.bombs.Mk_84AIR_TP" -ENUMS.Storage.weapons.bombs.GBU_31_V_3B = "weapons.bombs.GBU_31_V_3B" -ENUMS.Storage.weapons.nurs.C_8CM_WH = "weapons.nurs.C_8CM_WH" -ENUMS.Storage.weapons.missiles.Matra_Super_530D = "weapons.missiles.Matra Super 530D" -ENUMS.Storage.weapons.nurs.ARF8M3TPSM = "weapons.nurs.ARF8M3TPSM" -ENUMS.Storage.weapons.missiles.TGM_65H = "weapons.missiles.TGM_65H" -ENUMS.Storage.weapons.nurs.M8rocket = "weapons.nurs.M8rocket" -ENUMS.Storage.weapons.bombs.GBU_27 = "weapons.bombs.GBU_27" -ENUMS.Storage.weapons.missiles.AGR_20A = "weapons.missiles.AGR_20A" -ENUMS.Storage.weapons.missiles.LS_6_250 = "weapons.missiles.LS-6-250" -ENUMS.Storage.weapons.droptanks.M2KC_RPL_522_EMPTY = "weapons.droptanks.M2KC_RPL_522_EMPTY" -ENUMS.Storage.weapons.droptanks.M2KC_02_RPL541 = "weapons.droptanks.M2KC_02_RPL541" -ENUMS.Storage.weapons.missiles.AGM_45 = "weapons.missiles.AGM_45" -ENUMS.Storage.weapons.missiles.AGM_84A = "weapons.missiles.AGM_84A" -ENUMS.Storage.weapons.bombs.APC_BTR_80_Air_23936lb = "weapons.bombs.APC BTR-80 Air [23936lb]" -ENUMS.Storage.weapons.missiles.P_33E = "weapons.missiles.P_33E" -ENUMS.Storage.weapons.missiles.Ataka_9M120 = "weapons.missiles.Ataka_9M120" -ENUMS.Storage.weapons.bombs.MK76 = "weapons.bombs.MK76" -ENUMS.Storage.weapons.bombs.AB_250_2_SD_2 = "weapons.bombs.AB_250_2_SD_2" -ENUMS.Storage.weapons.missiles.Rb_05A = "weapons.missiles.Rb 05A" -ENUMS.Storage.weapons.bombs.ART_GVOZDIKA_34720lb = "weapons.bombs.ART GVOZDIKA [34720lb]" -ENUMS.Storage.weapons.bombs.Generic_Crate_20000lb = "weapons.bombs.Generic Crate [20000lb]" -ENUMS.Storage.weapons.bombs.FAB_100SV = "weapons.bombs.FAB_100SV" -ENUMS.Storage.weapons.bombs.BetAB_500 = "weapons.bombs.BetAB_500" -ENUMS.Storage.weapons.droptanks.M2KC_02_RPL541_EMPTY = "weapons.droptanks.M2KC_02_RPL541_EMPTY" -ENUMS.Storage.weapons.droptanks.PTB600_MIG15 = "weapons.droptanks.PTB600_MIG15" -ENUMS.Storage.weapons.missiles.Rb_24J = "weapons.missiles.Rb 24J" -ENUMS.Storage.weapons.nurs.C_8CM_BU = "weapons.nurs.C_8CM_BU" -ENUMS.Storage.weapons.nurs.SNEB_TYPE259E_F1B = "weapons.nurs.SNEB_TYPE259E_F1B" -ENUMS.Storage.weapons.nurs.WGr21 = "weapons.nurs.WGr21" -ENUMS.Storage.weapons.bombs.SAMP250HD = "weapons.bombs.SAMP250HD" -ENUMS.Storage.weapons.containers.alq_184long = "weapons.containers.alq-184long" -ENUMS.Storage.weapons.nurs.SNEB_TYPE259E_H1 = "weapons.nurs.SNEB_TYPE259E_H1" -ENUMS.Storage.weapons.bombs.British_SAP_250LB_Bomb_Mk5 = "weapons.bombs.British_SAP_250LB_Bomb_Mk5" -ENUMS.Storage.weapons.bombs.Transport_UAZ_469_Air_3747lb = "weapons.bombs.Transport UAZ-469 Air [3747lb]" -ENUMS.Storage.weapons.bombs.Mk_83CT = "weapons.bombs.Mk_83CT" -ENUMS.Storage.weapons.missiles.AIM_7P = "weapons.missiles.AIM-7P" -ENUMS.Storage.weapons.missiles.AT_6 = "weapons.missiles.AT_6" -ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_GREEN = "weapons.nurs.SNEB_TYPE254_H1_GREEN" -ENUMS.Storage.weapons.nurs.SNEB_TYPE250_F1B = "weapons.nurs.SNEB_TYPE250_F1B" -ENUMS.Storage.weapons.containers.U22A = "weapons.containers.U22A" -ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk1 = "weapons.bombs.British_GP_250LB_Bomb_Mk1" -ENUMS.Storage.weapons.bombs.CBU_105 = "weapons.bombs.CBU_105" -ENUMS.Storage.weapons.droptanks.FW_190_Fuel_Tank = "weapons.droptanks.FW-190_Fuel-Tank" -ENUMS.Storage.weapons.missiles.X_58 = "weapons.missiles.X_58" -ENUMS.Storage.weapons.missiles.BK90_MJ1_MJ2 = "weapons.missiles.BK90_MJ1_MJ2" -ENUMS.Storage.weapons.missiles.TGM_65D = "weapons.missiles.TGM_65D" -ENUMS.Storage.weapons.containers.BRD_4_250 = "weapons.containers.BRD-4-250" -ENUMS.Storage.weapons.missiles.P_73 = "weapons.missiles.P_73" -ENUMS.Storage.weapons.bombs.AN_M66 = "weapons.bombs.AN_M66" -ENUMS.Storage.weapons.bombs.APC_LAV_25_Air_22520lb = "weapons.bombs.APC LAV-25 Air [22520lb]" -ENUMS.Storage.weapons.missiles.AIM_7MH = "weapons.missiles.AIM-7MH" -ENUMS.Storage.weapons.containers.MB339_TravelPod = "weapons.containers.MB339_TravelPod" -ENUMS.Storage.weapons.bombs.GBU_12 = "weapons.bombs.GBU_12" -ENUMS.Storage.weapons.bombs.SC_250_T3_J = "weapons.bombs.SC_250_T3_J" -ENUMS.Storage.weapons.missiles.KD_20 = "weapons.missiles.KD-20" -ENUMS.Storage.weapons.missiles.AGM_86C = "weapons.missiles.AGM_86C" -ENUMS.Storage.weapons.missiles.X_35 = "weapons.missiles.X_35" -ENUMS.Storage.weapons.bombs.MK106 = "weapons.bombs.MK106" -ENUMS.Storage.weapons.bombs.BETAB_500S = "weapons.bombs.BETAB-500S" -ENUMS.Storage.weapons.nurs.C_5 = "weapons.nurs.C_5" -ENUMS.Storage.weapons.nurs.S_24B = "weapons.nurs.S-24B" -ENUMS.Storage.weapons.bombs.British_MC_500LB_Bomb_Mk2 = "weapons.bombs.British_MC_500LB_Bomb_Mk2" -ENUMS.Storage.weapons.containers.ANAWW_13 = "weapons.containers.ANAWW_13" -ENUMS.Storage.weapons.droptanks.droptank_108_gal = "weapons.droptanks.droptank_108_gal" -ENUMS.Storage.weapons.droptanks.DFT_300_GAL_A4E_LR = "weapons.droptanks.DFT_300_GAL_A4E_LR" -ENUMS.Storage.weapons.bombs.CBU_87 = "weapons.bombs.CBU_87" -ENUMS.Storage.weapons.missiles.GAR_8 = "weapons.missiles.GAR-8" -ENUMS.Storage.weapons.bombs.BELOUGA = "weapons.bombs.BELOUGA" -ENUMS.Storage.weapons.containers.EclairM_33 = "weapons.containers.{EclairM_33}" -ENUMS.Storage.weapons.bombs.ART_2S9_NONA_Air_19140lb = "weapons.bombs.ART 2S9 NONA Air [19140lb]" -ENUMS.Storage.weapons.bombs.BR_250 = "weapons.bombs.BR_250" -ENUMS.Storage.weapons.bombs.IAB_500 = "weapons.bombs.IAB-500" -ENUMS.Storage.weapons.containers.AN_ASQ_228 = "weapons.containers.AN_ASQ_228" -ENUMS.Storage.weapons.missiles.P_27P = "weapons.missiles.P_27P" -ENUMS.Storage.weapons.bombs.SD_250_Stg = "weapons.bombs.SD_250_Stg" -ENUMS.Storage.weapons.missiles.R_530F_IR = "weapons.missiles.R_530F_IR" -ENUMS.Storage.weapons.bombs.British_SAP_500LB_Bomb_Mk5 = "weapons.bombs.British_SAP_500LB_Bomb_Mk5" -ENUMS.Storage.weapons.bombs.FAB_250M54 = "weapons.bombs.FAB-250M54" -ENUMS.Storage.weapons.containers.M2KC_AAF = "weapons.containers.{M2KC_AAF}" -ENUMS.Storage.weapons.missiles.CM_802AKG_AI = "weapons.missiles.CM-802AKG_AI" -ENUMS.Storage.weapons.bombs.CBU_103 = "weapons.bombs.CBU_103" -ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_RED = "weapons.containers.{US_M10_SMOKE_TANK_RED}" -ENUMS.Storage.weapons.missiles.X_29T = "weapons.missiles.X_29T" -ENUMS.Storage.weapons.bombs.HEMTT_TFFT_34400lb = "weapons.bombs.HEMTT TFFT [34400lb]" -ENUMS.Storage.weapons.missiles.C_701IR = "weapons.missiles.C-701IR" -ENUMS.Storage.weapons.containers.fullCargoSeats = "weapons.containers.fullCargoSeats" -ENUMS.Storage.weapons.bombs.GBU_15_V_31_B = "weapons.bombs.GBU_15_V_31_B" -ENUMS.Storage.weapons.bombs.APC_M1043_HMMWV_Armament_Air_7023lb = "weapons.bombs.APC M1043 HMMWV Armament Air [7023lb]" -ENUMS.Storage.weapons.missiles.PL_5EII = "weapons.missiles.PL-5EII" -ENUMS.Storage.weapons.bombs.SC_250_T1_L2 = "weapons.bombs.SC_250_T1_L2" -ENUMS.Storage.weapons.torpedoes.mk46torp_name = "weapons.torpedoes.mk46torp_name" -ENUMS.Storage.weapons.containers.F_15E_AAQ_33_XR_ATP_SE = "weapons.containers.F-15E_AAQ-33_XR_ATP-SE" -ENUMS.Storage.weapons.missiles.AIM_7 = "weapons.missiles.AIM_7" -ENUMS.Storage.weapons.missiles.AGM_122 = "weapons.missiles.AGM_122" -ENUMS.Storage.weapons.bombs.HEBOMB = "weapons.bombs.HEBOMB" -ENUMS.Storage.weapons.bombs.CBU_97 = "weapons.bombs.CBU_97" -ENUMS.Storage.weapons.bombs.MK_81SE = "weapons.bombs.MK-81SE" -ENUMS.Storage.weapons.nurs.Zuni_127 = "weapons.nurs.Zuni_127" -ENUMS.Storage.weapons.containers.M2KC_AGF = "weapons.containers.{M2KC_AGF}" -ENUMS.Storage.weapons.droptanks.Hercules_ExtFuelTank = "weapons.droptanks.Hercules_ExtFuelTank" -ENUMS.Storage.weapons.containers.SMOKE_WHITE = "weapons.containers.{SMOKE_WHITE}" -ENUMS.Storage.weapons.droptanks.droptank_150_gal = "weapons.droptanks.droptank_150_gal" -ENUMS.Storage.weapons.nurs.HYDRA_70_WTU1B = "weapons.nurs.HYDRA_70_WTU1B" -ENUMS.Storage.weapons.missiles.GB_6_SFW = "weapons.missiles.GB-6-SFW" -ENUMS.Storage.weapons.missiles.KD_63 = "weapons.missiles.KD-63" -ENUMS.Storage.weapons.bombs.GBU_28 = "weapons.bombs.GBU_28" -ENUMS.Storage.weapons.nurs.C_8CM_YE = "weapons.nurs.C_8CM_YE" -ENUMS.Storage.weapons.droptanks.HB_F14_EXT_DROPTANK = "weapons.droptanks.HB_F14_EXT_DROPTANK" -ENUMS.Storage.weapons.missiles.Super_530F = "weapons.missiles.Super_530F" -ENUMS.Storage.weapons.missiles.Ataka_9M220 = "weapons.missiles.Ataka_9M220" -ENUMS.Storage.weapons.bombs.BDU_33 = "weapons.bombs.BDU_33" -ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk4 = "weapons.bombs.British_GP_250LB_Bomb_Mk4" -ENUMS.Storage.weapons.missiles.TOW = "weapons.missiles.TOW" -ENUMS.Storage.weapons.bombs.ATGM_M1045_HMMWV_TOW_Air_7183lb = "weapons.bombs.ATGM M1045 HMMWV TOW Air [7183lb]" -ENUMS.Storage.weapons.missiles.X_25MR = "weapons.missiles.X_25MR" -ENUMS.Storage.weapons.droptanks.fueltank230 = "weapons.droptanks.fueltank230" -ENUMS.Storage.weapons.droptanks.PTB_490C_MIG21 = "weapons.droptanks.PTB-490C-MIG21" -ENUMS.Storage.weapons.bombs.M1025_HMMWV_Air_6160lb = "weapons.bombs.M1025 HMMWV Air [6160lb]" -ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_GREEN = "weapons.nurs.SNEB_TYPE254_F1B_GREEN" -ENUMS.Storage.weapons.missiles.R_550 = "weapons.missiles.R_550" -ENUMS.Storage.weapons.bombs.KAB_1500LG = "weapons.bombs.KAB_1500LG" -ENUMS.Storage.weapons.missiles.AGM_84D = "weapons.missiles.AGM_84D" -ENUMS.Storage.weapons.missiles.YJ_83K = "weapons.missiles.YJ-83K" -ENUMS.Storage.weapons.missiles.AIM_54C_Mk47 = "weapons.missiles.AIM_54C_Mk47" -ENUMS.Storage.weapons.missiles.BRM_1_90MM = "weapons.missiles.BRM-1_90MM" -ENUMS.Storage.weapons.missiles.Ataka_9M120F = "weapons.missiles.Ataka_9M120F" -ENUMS.Storage.weapons.droptanks.Eleven00L_Tank = "weapons.droptanks.1100L Tank" -ENUMS.Storage.weapons.bombs.BAP_100 = "weapons.bombs.BAP_100" -ENUMS.Storage.weapons.adapters.lau_88 = "weapons.adapters.lau-88" -ENUMS.Storage.weapons.missiles.P_40T = "weapons.missiles.P_40T" -ENUMS.Storage.weapons.missiles.GB_6 = "weapons.missiles.GB-6" -ENUMS.Storage.weapons.bombs.FAB_250M54TU = "weapons.bombs.FAB-250M54TU" -ENUMS.Storage.weapons.missiles.DWS39_MJ1 = "weapons.missiles.DWS39_MJ1" -ENUMS.Storage.weapons.missiles.CM_802AKG = "weapons.missiles.CM-802AKG" -ENUMS.Storage.weapons.bombs.FAB_250 = "weapons.bombs.FAB_250" -ENUMS.Storage.weapons.missiles.C_802AK = "weapons.missiles.C_802AK" -ENUMS.Storage.weapons.bombs.SD_500_A = "weapons.bombs.SD_500_A" -ENUMS.Storage.weapons.bombs.GBU_32_V_2B = "weapons.bombs.GBU_32_V_2B" -ENUMS.Storage.weapons.containers.marder = "weapons.containers.marder" -ENUMS.Storage.weapons.missiles.ADM_141B = "weapons.missiles.ADM_141B" -ENUMS.Storage.weapons.bombs.ROCKEYE = "weapons.bombs.ROCKEYE" -ENUMS.Storage.weapons.missiles.BK90_MJ1 = "weapons.missiles.BK90_MJ1" -ENUMS.Storage.weapons.containers.BTR_80 = "weapons.containers.BTR-80" -ENUMS.Storage.weapons.bombs.SAM_ROLAND_ADS_34720lb = "weapons.bombs.SAM ROLAND ADS [34720lb]" -ENUMS.Storage.weapons.containers.wmd7 = "weapons.containers.wmd7" -ENUMS.Storage.weapons.missiles.C_701T = "weapons.missiles.C-701T" -ENUMS.Storage.weapons.missiles.AIM_7E_2 = "weapons.missiles.AIM-7E-2" -ENUMS.Storage.weapons.nurs.HVAR = "weapons.nurs.HVAR" -ENUMS.Storage.weapons.containers.HMMWV_M1043 = "weapons.containers.HMMWV_M1043" -ENUMS.Storage.weapons.droptanks.PTB_800_MIG21 = "weapons.droptanks.PTB-800-MIG21" -ENUMS.Storage.weapons.missiles.AGM_114 = "weapons.missiles.AGM_114" -ENUMS.Storage.weapons.bombs.APC_M1126_Stryker_ICV_29542lb = "weapons.bombs.APC M1126 Stryker ICV [29542lb]" -ENUMS.Storage.weapons.bombs.APC_M113_Air_21624lb = "weapons.bombs.APC M113 Air [21624lb]" -ENUMS.Storage.weapons.bombs.M_117 = "weapons.bombs.M_117" -ENUMS.Storage.weapons.missiles.AGM_65D = "weapons.missiles.AGM_65D" -ENUMS.Storage.weapons.droptanks.MB339_TT320_L = "weapons.droptanks.MB339_TT320_L" -ENUMS.Storage.weapons.missiles.AGM_86 = "weapons.missiles.AGM_86" -ENUMS.Storage.weapons.bombs.BDU_45LGB = "weapons.bombs.BDU_45LGB" -ENUMS.Storage.weapons.missiles.AGM_65H = "weapons.missiles.AGM_65H" -ENUMS.Storage.weapons.nurs.RS_82 = "weapons.nurs.RS-82" -ENUMS.Storage.weapons.nurs.SNEB_TYPE252_F1B = "weapons.nurs.SNEB_TYPE252_F1B" -ENUMS.Storage.weapons.bombs.BL_755 = "weapons.bombs.BL_755" -ENUMS.Storage.weapons.containers.F_15E_AAQ_28_LITENING = "weapons.containers.F-15E_AAQ-28_LITENING" -ENUMS.Storage.weapons.nurs.SNEB_TYPE256_F1B = "weapons.nurs.SNEB_TYPE256_F1B" -ENUMS.Storage.weapons.missiles.AGM_84H = "weapons.missiles.AGM_84H" -ENUMS.Storage.weapons.missiles.AIM_54 = "weapons.missiles.AIM_54" -ENUMS.Storage.weapons.missiles.X_31A = "weapons.missiles.X_31A" -ENUMS.Storage.weapons.bombs.KAB_500Kr = "weapons.bombs.KAB_500Kr" -ENUMS.Storage.weapons.containers.SPS_141_100 = "weapons.containers.SPS-141-100" -ENUMS.Storage.weapons.missiles.BK90_MJ2 = "weapons.missiles.BK90_MJ2" -ENUMS.Storage.weapons.missiles.Super_530D = "weapons.missiles.Super_530D" -ENUMS.Storage.weapons.bombs.CBU_52B = "weapons.bombs.CBU_52B" -ENUMS.Storage.weapons.droptanks.PTB_450 = "weapons.droptanks.PTB-450" -ENUMS.Storage.weapons.bombs.IFV_MCV_80_34720lb = "weapons.bombs.IFV MCV-80 [34720lb]" -ENUMS.Storage.weapons.containers.Two_c9 = "weapons.containers.2-c9" -ENUMS.Storage.weapons.missiles.AIM_9JULI = "weapons.missiles.AIM-9JULI" -ENUMS.Storage.weapons.droptanks.MB339_TT500_R = "weapons.droptanks.MB339_TT500_R" -ENUMS.Storage.weapons.nurs.C_8CM = "weapons.nurs.C_8CM" -ENUMS.Storage.weapons.containers.BARAX = "weapons.containers.BARAX" -ENUMS.Storage.weapons.missiles.P_40R = "weapons.missiles.P_40R" -ENUMS.Storage.weapons.missiles.YJ_12 = "weapons.missiles.YJ-12" -ENUMS.Storage.weapons.missiles.CM_802AKG = "weapons.missiles.CM_802AKG" -ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_YELLOW = "weapons.nurs.SNEB_TYPE254_H1_YELLOW" -ENUMS.Storage.weapons.bombs.Durandal = "weapons.bombs.Durandal" -ENUMS.Storage.weapons.droptanks.i16_eft = "weapons.droptanks.i16_eft" -ENUMS.Storage.weapons.droptanks.AV8BNA_AERO1D_EMPTY = "weapons.droptanks.AV8BNA_AERO1D_EMPTY" -ENUMS.Storage.weapons.containers.Hercules_Battle_Station_TGP = "weapons.containers.Hercules_Battle_Station_TGP" -ENUMS.Storage.weapons.nurs.C_8CM_VT = "weapons.nurs.C_8CM_VT" -ENUMS.Storage.weapons.missiles.PL_12 = "weapons.missiles.PL-12" -ENUMS.Storage.weapons.missiles.R_3R = "weapons.missiles.R-3R" -ENUMS.Storage.weapons.bombs.GBU_54_V_1B = "weapons.bombs.GBU_54_V_1B" -ENUMS.Storage.weapons.droptanks.MB339_TT320_R = "weapons.droptanks.MB339_TT320_R" -ENUMS.Storage.weapons.bombs.RN_24 = "weapons.bombs.RN-24" -ENUMS.Storage.weapons.containers.Twoc6m = "weapons.containers.2c6m" -ENUMS.Storage.weapons.bombs.ARV_BRDM_2_Air_12320lb = "weapons.bombs.ARV BRDM-2 Air [12320lb]" -ENUMS.Storage.weapons.bombs.ARV_BRDM_2_Skid_12210lb = "weapons.bombs.ARV BRDM-2 Skid [12210lb]" -ENUMS.Storage.weapons.nurs.SNEB_TYPE251_F1B = "weapons.nurs.SNEB_TYPE251_F1B" -ENUMS.Storage.weapons.missiles.X_41 = "weapons.missiles.X_41" -ENUMS.Storage.weapons.containers.MIG21_SMOKE_WHITE = "weapons.containers.{MIG21_SMOKE_WHITE}" -ENUMS.Storage.weapons.bombs.MK_82AIR = "weapons.bombs.MK_82AIR" -ENUMS.Storage.weapons.missiles.R_530F_EM = "weapons.missiles.R_530F_EM" -ENUMS.Storage.weapons.bombs.SAMP400LD = "weapons.bombs.SAMP400LD" -ENUMS.Storage.weapons.bombs.FAB_50 = "weapons.bombs.FAB_50" -ENUMS.Storage.weapons.bombs.AB_250_2_SD_10A = "weapons.bombs.AB_250_2_SD_10A" -ENUMS.Storage.weapons.missiles.ADM_141A = "weapons.missiles.ADM_141A" -ENUMS.Storage.weapons.containers.KBpod = "weapons.containers.KBpod" -ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk4 = "weapons.bombs.British_GP_500LB_Bomb_Mk4" -ENUMS.Storage.weapons.missiles.AGM_65E = "weapons.missiles.AGM_65E" -ENUMS.Storage.weapons.containers.sa342_dipole_antenna = "weapons.containers.sa342_dipole_antenna" -ENUMS.Storage.weapons.bombs.OFAB_100_Jupiter = "weapons.bombs.OFAB-100 Jupiter" -ENUMS.Storage.weapons.nurs.SNEB_TYPE257_F1B = "weapons.nurs.SNEB_TYPE257_F1B" -ENUMS.Storage.weapons.missiles.Rb_04E_for_A_I = "weapons.missiles.Rb 04E (for A.I.)" -ENUMS.Storage.weapons.bombs.AN_M66A2 = "weapons.bombs.AN-M66A2" -ENUMS.Storage.weapons.missiles.P_27T = "weapons.missiles.P_27T" -ENUMS.Storage.weapons.droptanks.LNS_VIG_XTANK = "weapons.droptanks.LNS_VIG_XTANK" -ENUMS.Storage.weapons.missiles.R_55 = "weapons.missiles.R-55" -ENUMS.Storage.weapons.torpedoes.YU_6 = "weapons.torpedoes.YU-6" -ENUMS.Storage.weapons.bombs.British_MC_250LB_Bomb_Mk2 = "weapons.bombs.British_MC_250LB_Bomb_Mk2" -ENUMS.Storage.weapons.droptanks.PTB_120_F86F35 = "weapons.droptanks.PTB_120_F86F35" -ENUMS.Storage.weapons.missiles.PL_8B = "weapons.missiles.PL-8B" -ENUMS.Storage.weapons.droptanks.F_15E_Drop_Tank_Empty = "weapons.droptanks.F-15E_Drop_Tank_Empty" -ENUMS.Storage.weapons.nurs.British_HE_60LBFNo1_3INCHNo1 = "weapons.nurs.British_HE_60LBFNo1_3INCHNo1" -ENUMS.Storage.weapons.missiles.P_77 = "weapons.missiles.P_77" -ENUMS.Storage.weapons.torpedoes.LTF_5B = "weapons.torpedoes.LTF_5B" -ENUMS.Storage.weapons.missiles.R_3S = "weapons.missiles.R-3S" -ENUMS.Storage.weapons.nurs.SNEB_TYPE253_H1 = "weapons.nurs.SNEB_TYPE253_H1" -ENUMS.Storage.weapons.missiles.PL_8A = "weapons.missiles.PL-8A" -ENUMS.Storage.weapons.bombs.APC_BTR_82A_Skid_24888lb = "weapons.bombs.APC BTR-82A Skid [24888lb]" -ENUMS.Storage.weapons.containers.Sborka = "weapons.containers.Sborka" -ENUMS.Storage.weapons.missiles.AGM_65L = "weapons.missiles.AGM_65L" -ENUMS.Storage.weapons.missiles.X_28 = "weapons.missiles.X_28" -ENUMS.Storage.weapons.missiles.TGM_65G = "weapons.missiles.TGM_65G" -ENUMS.Storage.weapons.nurs.SNEB_TYPE257_H1 = "weapons.nurs.SNEB_TYPE257_H1" -ENUMS.Storage.weapons.missiles.RB75B = "weapons.missiles.RB75B" -ENUMS.Storage.weapons.missiles.X_25ML = "weapons.missiles.X_25ML" -ENUMS.Storage.weapons.droptanks.FPU_8A = "weapons.droptanks.FPU_8A" -ENUMS.Storage.weapons.bombs.BLG66 = "weapons.bombs.BLG66" -ENUMS.Storage.weapons.nurs.C_8CM_RD = "weapons.nurs.C_8CM_RD" -ENUMS.Storage.weapons.containers.EclairM_06 = "weapons.containers.{EclairM_06}" -ENUMS.Storage.weapons.bombs.RBK_500AO = "weapons.bombs.RBK_500AO" -ENUMS.Storage.weapons.missiles.AIM_9P = "weapons.missiles.AIM-9P" -ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk4_Short = "weapons.bombs.British_GP_500LB_Bomb_Mk4_Short" -ENUMS.Storage.weapons.containers.MB339_Vinten = "weapons.containers.MB339_Vinten" -ENUMS.Storage.weapons.missiles.Rb_15F = "weapons.missiles.Rb 15F" -ENUMS.Storage.weapons.nurs.ARAKM70BHE = "weapons.nurs.ARAKM70BHE" -ENUMS.Storage.weapons.bombs.AAA_Vulcan_M163_Air_21666lb = "weapons.bombs.AAA Vulcan M163 Air [21666lb]" -ENUMS.Storage.weapons.missiles.X_29L = "weapons.missiles.X_29L" -ENUMS.Storage.weapons.containers.F14_LANTIRN_TP = "weapons.containers.{F14-LANTIRN-TP}" -ENUMS.Storage.weapons.bombs.FAB_250_M62 = "weapons.bombs.FAB-250-M62" -ENUMS.Storage.weapons.missiles.AIM_120C = "weapons.missiles.AIM_120C" -ENUMS.Storage.weapons.bombs.EWR_SBORKA_Air_21624lb = "weapons.bombs.EWR SBORKA Air [21624lb]" -ENUMS.Storage.weapons.bombs.SAMP250LD = "weapons.bombs.SAMP250LD" -ENUMS.Storage.weapons.droptanks.Spitfire_slipper_tank = "weapons.droptanks.Spitfire_slipper_tank" -ENUMS.Storage.weapons.missiles.LS_6_500 = "weapons.missiles.LS-6-500" -ENUMS.Storage.weapons.bombs.GBU_31_V_4B = "weapons.bombs.GBU_31_V_4B" -ENUMS.Storage.weapons.droptanks.PTB400_MIG15 = "weapons.droptanks.PTB400_MIG15" -ENUMS.Storage.weapons.containers.m_113 = "weapons.containers.m-113" -ENUMS.Storage.weapons.bombs.SPG_M1128_Stryker_MGS_33036lb = "weapons.bombs.SPG M1128 Stryker MGS [33036lb]" -ENUMS.Storage.weapons.missiles.AIM_9L = "weapons.missiles.AIM-9L" -ENUMS.Storage.weapons.missiles.AIM_9X = "weapons.missiles.AIM_9X" -ENUMS.Storage.weapons.nurs.C_8 = "weapons.nurs.C_8" -ENUMS.Storage.weapons.bombs.SAM_CHAPARRAL_Skid_21516lb = "weapons.bombs.SAM CHAPARRAL Skid [21516lb]" -ENUMS.Storage.weapons.missiles.P_27TE = "weapons.missiles.P_27TE" -ENUMS.Storage.weapons.bombs.ODAB_500PM = "weapons.bombs.ODAB-500PM" -ENUMS.Storage.weapons.bombs.MK77mod1_WPN = "weapons.bombs.MK77mod1-WPN" -ENUMS.Storage.weapons.droptanks.PTB400_MIG19 = "weapons.droptanks.PTB400_MIG19" -ENUMS.Storage.weapons.torpedoes.Mark_46 = "weapons.torpedoes.Mark_46" -ENUMS.Storage.weapons.containers.rightSeat = "weapons.containers.rightSeat" -ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_ORANGE = "weapons.containers.{US_M10_SMOKE_TANK_ORANGE}" -ENUMS.Storage.weapons.bombs.SAB_100MN = "weapons.bombs.SAB_100MN" -ENUMS.Storage.weapons.nurs.FFAR_Mk5_HEAT = "weapons.nurs.FFAR Mk5 HEAT" -ENUMS.Storage.weapons.bombs.IFV_TPZ_FUCH_33440lb = "weapons.bombs.IFV TPZ FUCH [33440lb]" -ENUMS.Storage.weapons.bombs.IFV_M2A2_Bradley_34720lb = "weapons.bombs.IFV M2A2 Bradley [34720lb]" -ENUMS.Storage.weapons.bombs.MK77mod0_WPN = "weapons.bombs.MK77mod0-WPN" -ENUMS.Storage.weapons.containers.ASO_2 = "weapons.containers.ASO-2" -ENUMS.Storage.weapons.bombs.Mk_84AIR_GP = "weapons.bombs.Mk_84AIR_GP" -ENUMS.Storage.weapons.nurs.S_24A = "weapons.nurs.S-24A" -ENUMS.Storage.weapons.bombs.RBK_250_275_AO_1SCH = "weapons.bombs.RBK_250_275_AO_1SCH" -ENUMS.Storage.weapons.bombs.Transport_Tigr_Skid_15730lb = "weapons.bombs.Transport Tigr Skid [15730lb]" -ENUMS.Storage.weapons.missiles.AIM_7F = "weapons.missiles.AIM-7F" -ENUMS.Storage.weapons.bombs.CBU_99 = "weapons.bombs.CBU_99" -ENUMS.Storage.weapons.bombs.LUU_2B = "weapons.bombs.LUU_2B" -ENUMS.Storage.weapons.bombs.FAB_500TA = "weapons.bombs.FAB-500TA" -ENUMS.Storage.weapons.missiles.AGR_20_M282 = "weapons.missiles.AGR_20_M282" -ENUMS.Storage.weapons.droptanks.MB339_FT330 = "weapons.droptanks.MB339_FT330" -ENUMS.Storage.weapons.bombs.SAMP125LD = "weapons.bombs.SAMP125LD" -ENUMS.Storage.weapons.missiles.X_25MP = "weapons.missiles.X_25MP" -ENUMS.Storage.weapons.nurs.SNEB_TYPE252_H1 = "weapons.nurs.SNEB_TYPE252_H1" -ENUMS.Storage.weapons.missiles.AGM_65F = "weapons.missiles.AGM_65F" -ENUMS.Storage.weapons.missiles.AIM_9P5 = "weapons.missiles.AIM-9P5" -ENUMS.Storage.weapons.bombs.Transport_Tigr_Air_15900lb = "weapons.bombs.Transport Tigr Air [15900lb]" -ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_RED = "weapons.nurs.SNEB_TYPE254_H1_RED" -ENUMS.Storage.weapons.nurs.FFAR_Mk1_HE = "weapons.nurs.FFAR Mk1 HE" -ENUMS.Storage.weapons.nurs.SPRD_99 = "weapons.nurs.SPRD-99" -ENUMS.Storage.weapons.bombs.BIN_200 = "weapons.bombs.BIN_200" -ENUMS.Storage.weapons.bombs.BLU_4B_GROUP = "weapons.bombs.BLU_4B_GROUP" -ENUMS.Storage.weapons.bombs.GBU_24 = "weapons.bombs.GBU_24" -ENUMS.Storage.weapons.missiles.Rb_04E = "weapons.missiles.Rb 04E" -ENUMS.Storage.weapons.missiles.Rb_74 = "weapons.missiles.Rb 74" -ENUMS.Storage.weapons.containers.leftSeat = "weapons.containers.leftSeat" -ENUMS.Storage.weapons.bombs.LS_6_100 = "weapons.bombs.LS-6-100" -ENUMS.Storage.weapons.bombs.Transport_URAL_375_14815lb = "weapons.bombs.Transport URAL-375 [14815lb]" -ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_GREEN = "weapons.containers.{US_M10_SMOKE_TANK_GREEN}" -ENUMS.Storage.weapons.missiles.X_22 = "weapons.missiles.X_22" -ENUMS.Storage.weapons.containers.FAS = "weapons.containers.FAS" -ENUMS.Storage.weapons.nurs.S_25_O = "weapons.nurs.S-25-O" -ENUMS.Storage.weapons.droptanks.para = "weapons.droptanks.para" -ENUMS.Storage.weapons.droptanks.F_15E_Drop_Tank = "weapons.droptanks.F-15E_Drop_Tank" -ENUMS.Storage.weapons.droptanks.M2KC_08_RPL541_EMPTY = "weapons.droptanks.M2KC_08_RPL541_EMPTY" -ENUMS.Storage.weapons.missiles.X_31P = "weapons.missiles.X_31P" -ENUMS.Storage.weapons.bombs.RBK_500U = "weapons.bombs.RBK_500U" -ENUMS.Storage.weapons.missiles.AIM_54A_Mk47 = "weapons.missiles.AIM_54A_Mk47" -ENUMS.Storage.weapons.droptanks.oiltank = "weapons.droptanks.oiltank" -ENUMS.Storage.weapons.missiles.AGM_154B = "weapons.missiles.AGM_154B" -ENUMS.Storage.weapons.containers.MB339_SMOKE_POD = "weapons.containers.MB339_SMOKE-POD" -ENUMS.Storage.weapons.containers.ECM_POD_L_175V = "weapons.containers.{ECM_POD_L_175V}" -ENUMS.Storage.weapons.droptanks.PTB_580G_F1 = "weapons.droptanks.PTB_580G_F1" -ENUMS.Storage.weapons.containers.EclairM_15 = "weapons.containers.{EclairM_15}" -ENUMS.Storage.weapons.containers.F_15E_AAQ_13_LANTIRN = "weapons.containers.F-15E_AAQ-13_LANTIRN" -ENUMS.Storage.weapons.droptanks.Eight00L_Tank_Empty = "weapons.droptanks.800L Tank Empty" -ENUMS.Storage.weapons.containers.One6c_hts_pod = "weapons.containers.16c_hts_pod" -ENUMS.Storage.weapons.bombs.AN_M81 = "weapons.bombs.AN-M81" -ENUMS.Storage.weapons.droptanks.Mosquito_Drop_Tank_100gal = "weapons.droptanks.Mosquito_Drop_Tank_100gal" -ENUMS.Storage.weapons.droptanks.Mosquito_Drop_Tank_50gal = "weapons.droptanks.Mosquito_Drop_Tank_50gal" -ENUMS.Storage.weapons.droptanks.DFT_150_GAL_A4E = "weapons.droptanks.DFT_150_GAL_A4E" -ENUMS.Storage.weapons.missiles.AIM_9 = "weapons.missiles.AIM_9" -ENUMS.Storage.weapons.bombs.IFV_BTR_D_Air_18040lb = "weapons.bombs.IFV BTR-D Air [18040lb]" -ENUMS.Storage.weapons.containers.EclairM_42 = "weapons.containers.{EclairM_42}" -ENUMS.Storage.weapons.bombs.KAB_1500T = "weapons.bombs.KAB_1500T" -ENUMS.Storage.weapons.droptanks.PTB_490_MIG21 = "weapons.droptanks.PTB-490-MIG21" -ENUMS.Storage.weapons.droptanks.PTB_200_F86F35 = "weapons.droptanks.PTB_200_F86F35" -ENUMS.Storage.weapons.droptanks.PTB760_MIG19 = "weapons.droptanks.PTB760_MIG19" -ENUMS.Storage.weapons.bombs.GBU_43_B_MOAB = "weapons.bombs.GBU-43/B(MOAB)" -ENUMS.Storage.weapons.torpedoes.G7A_T1 = "weapons.torpedoes.G7A_T1" -ENUMS.Storage.weapons.bombs.IFV_BMD_1_Air_18040lb = "weapons.bombs.IFV BMD-1 Air [18040lb]" -ENUMS.Storage.weapons.bombs.SAM_LINEBACKER_34720lb = "weapons.bombs.SAM LINEBACKER [34720lb]" -ENUMS.Storage.weapons.containers.ais_pod_t50_r = "weapons.containers.ais-pod-t50_r" -ENUMS.Storage.weapons.containers.CE2_SMOKE_WHITE = "weapons.containers.{CE2_SMOKE_WHITE}" -ENUMS.Storage.weapons.droptanks.fuel_tank_230 = "weapons.droptanks.fuel_tank_230" -ENUMS.Storage.weapons.droptanks.M2KC_RPL_522 = "weapons.droptanks.M2KC_RPL_522" -ENUMS.Storage.weapons.missiles.AGM_130 = "weapons.missiles.AGM_130" -ENUMS.Storage.weapons.droptanks.Eight00L_Tank = "weapons.droptanks.800L Tank" -ENUMS.Storage.weapons.bombs.IFV_BTR_D_Skid_17930lb = "weapons.bombs.IFV BTR-D Skid [17930lb]" -ENUMS.Storage.weapons.containers.bmp_1 = "weapons.containers.bmp-1" -ENUMS.Storage.weapons.bombs.GBU_31 = "weapons.bombs.GBU_31" -ENUMS.Storage.weapons.containers.aaq_28LEFT_litening = "weapons.containers.aaq-28LEFT litening" -ENUMS.Storage.weapons.missiles.Kh_66_Grom = "weapons.missiles.Kh-66_Grom" -ENUMS.Storage.weapons.containers.MIG21_SMOKE_RED = "weapons.containers.{MIG21_SMOKE_RED}" -ENUMS.Storage.weapons.containers.U22 = "weapons.containers.U22" -ENUMS.Storage.weapons.bombs.IFV_BMD_1_Skid_17930lb = "weapons.bombs.IFV BMD-1 Skid [17930lb]" -ENUMS.Storage.weapons.droptanks.Bidon = "weapons.droptanks.Bidon" -ENUMS.Storage.weapons.bombs.GBU_31_V_2B = "weapons.bombs.GBU_31_V_2B" -ENUMS.Storage.weapons.bombs.Mk_82Y = "weapons.bombs.Mk_82Y" -ENUMS.Storage.weapons.containers.pl5eii = "weapons.containers.pl5eii" -ENUMS.Storage.weapons.bombs.RBK_500U_OAB_2_5RT = "weapons.bombs.RBK_500U_OAB_2_5RT" -ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk5 = "weapons.bombs.British_GP_500LB_Bomb_Mk5" -ENUMS.Storage.weapons.containers.Eclair = "weapons.containers.{Eclair}" -ENUMS.Storage.weapons.nurs.S5MO_HEFRAG_FFAR = "weapons.nurs.S5MO_HEFRAG_FFAR" -ENUMS.Storage.weapons.bombs.BETAB_500M = "weapons.bombs.BETAB-500M" -ENUMS.Storage.weapons.bombs.Transport_M818_16000lb = "weapons.bombs.Transport M818 [16000lb]" -ENUMS.Storage.weapons.bombs.British_MC_250LB_Bomb_Mk1 = "weapons.bombs.British_MC_250LB_Bomb_Mk1" -ENUMS.Storage.weapons.nurs.SNEB_TYPE251_H1 = "weapons.nurs.SNEB_TYPE251_H1" -ENUMS.Storage.weapons.bombs.TYPE_200A = "weapons.bombs.TYPE-200A" -ENUMS.Storage.weapons.nurs.HYDRA_70_M151 = "weapons.nurs.HYDRA_70_M151" -ENUMS.Storage.weapons.bombs.IFV_BMP_3_32912lb = "weapons.bombs.IFV BMP-3 [32912lb]" -ENUMS.Storage.weapons.bombs.APC_MTLB_Air_26400lb = "weapons.bombs.APC MTLB Air [26400lb]" -ENUMS.Storage.weapons.nurs.HYDRA_70_M229 = "weapons.nurs.HYDRA_70_M229" -ENUMS.Storage.weapons.bombs.BDU_45 = "weapons.bombs.BDU_45" -ENUMS.Storage.weapons.bombs.OFAB_100_120TU = "weapons.bombs.OFAB-100-120TU" -ENUMS.Storage.weapons.missiles.AIM_9J = "weapons.missiles.AIM-9J" -ENUMS.Storage.weapons.nurs.ARF8M3API = "weapons.nurs.ARF8M3API" -ENUMS.Storage.weapons.bombs.BetAB_500ShP = "weapons.bombs.BetAB_500ShP" -ENUMS.Storage.weapons.nurs.C_8OFP2 = "weapons.nurs.C_8OFP2" -ENUMS.Storage.weapons.bombs.GBU_10 = "weapons.bombs.GBU_10" -ENUMS.Storage.weapons.bombs.APC_MTLB_Skid_26290lb = "weapons.bombs.APC MTLB Skid [26290lb]" -ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_RED = "weapons.nurs.SNEB_TYPE254_F1B_RED" -ENUMS.Storage.weapons.missiles.X_65 = "weapons.missiles.X_65" -ENUMS.Storage.weapons.missiles.R_550_M1 = "weapons.missiles.R_550_M1" -ENUMS.Storage.weapons.missiles.AGM_65K = "weapons.missiles.AGM_65K" -ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_YELLOW = "weapons.nurs.SNEB_TYPE254_F1B_YELLOW" -ENUMS.Storage.weapons.missiles.AGM_88 = "weapons.missiles.AGM_88" -ENUMS.Storage.weapons.nurs.C_8OM = "weapons.nurs.C_8OM" -ENUMS.Storage.weapons.bombs.SAM_ROLAND_LN_34720b = "weapons.bombs.SAM ROLAND LN [34720b]" -ENUMS.Storage.weapons.missiles.AIM_120 = "weapons.missiles.AIM_120" -ENUMS.Storage.weapons.missiles.HOT3_MBDA = "weapons.missiles.HOT3_MBDA" -ENUMS.Storage.weapons.missiles.R_13M = "weapons.missiles.R-13M" -ENUMS.Storage.weapons.missiles.AIM_54C_Mk60 = "weapons.missiles.AIM_54C_Mk60" -ENUMS.Storage.weapons.bombs.AAA_GEPARD_34720lb = "weapons.bombs.AAA GEPARD [34720lb]" -ENUMS.Storage.weapons.missiles.R_13M1 = "weapons.missiles.R-13M1" -ENUMS.Storage.weapons.bombs.APC_Cobra_Air_10912lb = "weapons.bombs.APC Cobra Air [10912lb]" -ENUMS.Storage.weapons.bombs.RBK_250 = "weapons.bombs.RBK_250" -ENUMS.Storage.weapons.bombs.SC_500_J = "weapons.bombs.SC_500_J" -ENUMS.Storage.weapons.missiles.AGM_114K = "weapons.missiles.AGM_114K" -ENUMS.Storage.weapons.missiles.ALARM = "weapons.missiles.ALARM" -ENUMS.Storage.weapons.bombs.Mk_83 = "weapons.bombs.Mk_83" -ENUMS.Storage.weapons.missiles.AGM_65B = "weapons.missiles.AGM_65B" -ENUMS.Storage.weapons.bombs.MK_82SNAKEYE = "weapons.bombs.MK_82SNAKEYE" -ENUMS.Storage.weapons.nurs.HYDRA_70_MK1 = "weapons.nurs.HYDRA_70_MK1" -ENUMS.Storage.weapons.bombs.BLG66_BELOUGA = "weapons.bombs.BLG66_BELOUGA" -ENUMS.Storage.weapons.containers.EclairM_51 = "weapons.containers.{EclairM_51}" -ENUMS.Storage.weapons.missiles.AIM_54A_Mk60 = "weapons.missiles.AIM_54A_Mk60" -ENUMS.Storage.weapons.droptanks.DFT_300_GAL_A4E = "weapons.droptanks.DFT_300_GAL_A4E" -ENUMS.Storage.weapons.bombs.ATGM_M1134_Stryker_30337lb = "weapons.bombs.ATGM M1134 Stryker [30337lb]" -ENUMS.Storage.weapons.bombs.BAT_120 = "weapons.bombs.BAT-120" -ENUMS.Storage.weapons.missiles.DWS39_MJ1_MJ2 = "weapons.missiles.DWS39_MJ1_MJ2" -ENUMS.Storage.weapons.containers.SPRD = "weapons.containers.SPRD" -ENUMS.Storage.weapons.bombs.BR_500 = "weapons.bombs.BR_500" -ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk1 = "weapons.bombs.British_GP_500LB_Bomb_Mk1" -ENUMS.Storage.weapons.bombs.BDU_50HD = "weapons.bombs.BDU_50HD" -ENUMS.Storage.weapons.missiles.RS2US = "weapons.missiles.RS2US" -ENUMS.Storage.weapons.bombs.IFV_BMP_2_25168lb = "weapons.bombs.IFV BMP-2 [25168lb]" -ENUMS.Storage.weapons.bombs.SAMP400HD = "weapons.bombs.SAMP400HD" -ENUMS.Storage.weapons.containers.Hercules_Battle_Station = "weapons.containers.Hercules_Battle_Station" -ENUMS.Storage.weapons.bombs.AN_M64 = "weapons.bombs.AN_M64" -ENUMS.Storage.weapons.containers.rearCargoSeats = "weapons.containers.rearCargoSeats" -ENUMS.Storage.weapons.bombs.Mk_82 = "weapons.bombs.Mk_82" -ENUMS.Storage.weapons.missiles.AKD_10 = "weapons.missiles.AKD-10" -ENUMS.Storage.weapons.bombs.BDU_50LGB = "weapons.bombs.BDU_50LGB" -ENUMS.Storage.weapons.missiles.SD_10 = "weapons.missiles.SD-10" -ENUMS.Storage.weapons.containers.IRDeflector = "weapons.containers.IRDeflector" -ENUMS.Storage.weapons.bombs.FAB_500 = "weapons.bombs.FAB_500" -ENUMS.Storage.weapons.bombs.KAB_500 = "weapons.bombs.KAB_500" -ENUMS.Storage.weapons.nurs.S_5M = "weapons.nurs.S-5M" -ENUMS.Storage.weapons.missiles.MICA_R = "weapons.missiles.MICA_R" -ENUMS.Storage.weapons.missiles.X_59M = "weapons.missiles.X_59M" -ENUMS.Storage.weapons.nurs.UG_90MM = "weapons.nurs.UG_90MM" -ENUMS.Storage.weapons.bombs.LYSBOMB = "weapons.bombs.LYSBOMB" -ENUMS.Storage.weapons.nurs.R4M = "weapons.nurs.R4M" -ENUMS.Storage.weapons.containers.dlpod_akg = "weapons.containers.dlpod_akg" -ENUMS.Storage.weapons.missiles.LD_10 = "weapons.missiles.LD-10" -ENUMS.Storage.weapons.bombs.SC_50 = "weapons.bombs.SC_50" -ENUMS.Storage.weapons.nurs.HYDRA_70_MK5 = "weapons.nurs.HYDRA_70_MK5" -ENUMS.Storage.weapons.bombs.FAB_100M = "weapons.bombs.FAB_100M" -ENUMS.Storage.weapons.missiles.Rb_24 = "weapons.missiles.Rb 24" -ENUMS.Storage.weapons.bombs.BDU_45B = "weapons.bombs.BDU_45B" -ENUMS.Storage.weapons.missiles.GB_6_HE = "weapons.missiles.GB-6-HE" -ENUMS.Storage.weapons.missiles.KD_63B = "weapons.missiles.KD-63B" -ENUMS.Storage.weapons.missiles.P_27PE = "weapons.missiles.P_27PE" -ENUMS.Storage.weapons.droptanks.PTB300_MIG15 = "weapons.droptanks.PTB300_MIG15" -ENUMS.Storage.weapons.bombs.Two50_3 = "weapons.bombs.250-3" -ENUMS.Storage.weapons.bombs.SC_500_L2 = "weapons.bombs.SC_500_L2" -ENUMS.Storage.weapons.containers.HMMWV_M1045 = "weapons.containers.HMMWV_M1045" -ENUMS.Storage.weapons.bombs.FAB_500M54TU = "weapons.bombs.FAB-500M54TU" -ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_YELLOW = "weapons.containers.{US_M10_SMOKE_TANK_YELLOW}" -ENUMS.Storage.weapons.containers.EclairM_60 = "weapons.containers.{EclairM_60}" -ENUMS.Storage.weapons.bombs.SAB_250_200 = "weapons.bombs.SAB_250_200" -ENUMS.Storage.weapons.bombs.FAB_100 = "weapons.bombs.FAB_100" -ENUMS.Storage.weapons.bombs.KAB_500S = "weapons.bombs.KAB_500S" -ENUMS.Storage.weapons.missiles.AGM_45A = "weapons.missiles.AGM_45A" -ENUMS.Storage.weapons.missiles.Kh25MP_PRGS1VP = "weapons.missiles.Kh25MP_PRGS1VP" -ENUMS.Storage.weapons.nurs.S5M1_HEFRAG_FFAR = "weapons.nurs.S5M1_HEFRAG_FFAR" -ENUMS.Storage.weapons.containers.kg600 = "weapons.containers.kg600" -ENUMS.Storage.weapons.bombs.AN_M65 = "weapons.bombs.AN_M65" -ENUMS.Storage.weapons.bombs.AN_M57 = "weapons.bombs.AN_M57" -ENUMS.Storage.weapons.bombs.BLU_3B_GROUP = "weapons.bombs.BLU_3B_GROUP" -ENUMS.Storage.weapons.bombs.BAP_100 = "weapons.bombs.BAP-100" -ENUMS.Storage.weapons.containers.HEMTT = "weapons.containers.HEMTT" -ENUMS.Storage.weapons.bombs.British_MC_500LB_Bomb_Mk1_Short = "weapons.bombs.British_MC_500LB_Bomb_Mk1_Short" -ENUMS.Storage.weapons.nurs.ARAKM70BAP = "weapons.nurs.ARAKM70BAP" -ENUMS.Storage.weapons.missiles.AGM_119 = "weapons.missiles.AGM_119" -ENUMS.Storage.weapons.missiles.MMagicII = "weapons.missiles.MMagicII" -ENUMS.Storage.weapons.bombs.AB_500_1_SD_10A = "weapons.bombs.AB_500_1_SD_10A" -ENUMS.Storage.weapons.nurs.HYDRA_70_M282 = "weapons.nurs.HYDRA_70_M282" -ENUMS.Storage.weapons.droptanks.DFT_400_GAL_A4E = "weapons.droptanks.DFT_400_GAL_A4E" -ENUMS.Storage.weapons.nurs.HYDRA_70_M257 = "weapons.nurs.HYDRA_70_M257" -ENUMS.Storage.weapons.droptanks.AV8BNA_AERO1D = "weapons.droptanks.AV8BNA_AERO1D" -ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_BLUE = "weapons.containers.{US_M10_SMOKE_TANK_BLUE}" -ENUMS.Storage.weapons.nurs.ARF8M3HEI = "weapons.nurs.ARF8M3HEI" -ENUMS.Storage.weapons.bombs.RN_28 = "weapons.bombs.RN-28" -ENUMS.Storage.weapons.bombs.Squad_30_x_Soldier_7950lb = "weapons.bombs.Squad 30 x Soldier [7950lb]" -ENUMS.Storage.weapons.containers.uaz_469 = "weapons.containers.uaz-469" -ENUMS.Storage.weapons.containers.Otokar_Cobra = "weapons.containers.Otokar_Cobra" -ENUMS.Storage.weapons.bombs.APC_BTR_82A_Air_24998lb = "weapons.bombs.APC BTR-82A Air [24998lb]" -ENUMS.Storage.weapons.nurs.HYDRA_70_M274 = "weapons.nurs.HYDRA_70_M274" -ENUMS.Storage.weapons.missiles.P_24R = "weapons.missiles.P_24R" -ENUMS.Storage.weapons.nurs.HYDRA_70_MK61 = "weapons.nurs.HYDRA_70_MK61" -ENUMS.Storage.weapons.missiles.Igla_1E = "weapons.missiles.Igla_1E" -ENUMS.Storage.weapons.missiles.C_802AK = "weapons.missiles.C-802AK" -ENUMS.Storage.weapons.nurs.C_24 = "weapons.nurs.C_24" -ENUMS.Storage.weapons.droptanks.M2KC_08_RPL541 = "weapons.droptanks.M2KC_08_RPL541" -ENUMS.Storage.weapons.nurs.C_13 = "weapons.nurs.C_13" -ENUMS.Storage.weapons.droptanks.droptank_110_gal = "weapons.droptanks.droptank_110_gal" -ENUMS.Storage.weapons.bombs.Mk_84 = "weapons.bombs.Mk_84" -ENUMS.Storage.weapons.missiles.Sea_Eagle = "weapons.missiles.Sea_Eagle" -ENUMS.Storage.weapons.droptanks.PTB_1200_F1 = "weapons.droptanks.PTB_1200_F1" -ENUMS.Storage.weapons.nurs.SNEB_TYPE256_H1 = "weapons.nurs.SNEB_TYPE256_H1" -ENUMS.Storage.weapons.containers.MATRA_PHIMAT = "weapons.containers.MATRA-PHIMAT" -ENUMS.Storage.weapons.containers.smoke_pod = "weapons.containers.smoke_pod" -ENUMS.Storage.weapons.containers.F_15E_AAQ_14_LANTIRN = "weapons.containers.F-15E_AAQ-14_LANTIRN" -ENUMS.Storage.weapons.containers.EclairM_24 = "weapons.containers.{EclairM_24}" -ENUMS.Storage.weapons.bombs.GBU_16 = "weapons.bombs.GBU_16" -ENUMS.Storage.weapons.nurs.HYDRA_70_M156 = "weapons.nurs.HYDRA_70_M156" -ENUMS.Storage.weapons.missiles.R_60 = "weapons.missiles.R-60" -ENUMS.Storage.weapons.containers.zsu_23_4 = "weapons.containers.zsu-23-4" -ENUMS.Storage.weapons.missiles.RB75 = "weapons.missiles.RB75" -ENUMS.Storage.weapons.missiles.Mistral = "weapons.missiles.Mistral" -ENUMS.Storage.weapons.droptanks.MB339_TT500_L = "weapons.droptanks.MB339_TT500_L" -ENUMS.Storage.weapons.bombs.SAM_SA_13_STRELA_21624lb = "weapons.bombs.SAM SA-13 STRELA [21624lb]" -ENUMS.Storage.weapons.bombs.SAM_Avenger_M1097_Air_7200lb = "weapons.bombs.SAM Avenger M1097 Air [7200lb]" -ENUMS.Storage.weapons.droptanks.Eleven00L_Tank_Empty = "weapons.droptanks.1100L Tank Empty" -ENUMS.Storage.weapons.bombs.AN_M88 = "weapons.bombs.AN-M88" -ENUMS.Storage.weapons.missiles.S_25L = "weapons.missiles.S_25L" -ENUMS.Storage.weapons.nurs.British_AP_25LBNo1_3INCHNo1 = "weapons.nurs.British_AP_25LBNo1_3INCHNo1" -ENUMS.Storage.weapons.bombs.BDU_50LD = "weapons.bombs.BDU_50LD" -ENUMS.Storage.weapons.bombs.AGM_62 = "weapons.bombs.AGM_62" -ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_WHITE = "weapons.containers.{US_M10_SMOKE_TANK_WHITE}" -ENUMS.Storage.weapons.missiles.MICA_T = "weapons.missiles.MICA_T" -ENUMS.Storage.weapons.containers.HVAR_rocket = "weapons.containers.HVAR_rocket" --- 2025 -ENUMS.Storage.weapons.containers.LANTIRN = "weapons.containers.LANTIRN" -ENUMS.Storage.weapons.missiles.AGM_78B = "weapons.missiles.AGM_78B" -ENUMS.Storage.weapons.containers.uh_60l_pilot = "weapons.containers.uh-60l_pilot" -ENUMS.Storage.weapons.missiles.AIM_92E = "weapons.missiles.AIM-92E" -ENUMS.Storage.weapons.missiles.KD_63B = "weapons.missiles.KD_63B" -ENUMS.Storage.weapons.bombs.Type_200A = "weapons.bombs.Type_200A" -ENUMS.Storage.weapons.missiles.HB_AIM_7E_2 = "weapons.missiles.HB-AIM-7E-2" -ENUMS.Storage.weapons.containers.Spear = "weapons.containers.Spear" -ENUMS.Storage.weapons.missiles.LS_6 = "weapons.missiles.LS_6" -ENUMS.Storage.weapons.containers.HB_ALE_40_0_120 = "weapons.containers.HB_ALE_40_0_120" -ENUMS.Storage.weapons.containers.Fantasm = "weapons.containers.Fantasm" -ENUMS.Storage.weapons.nurs.FFAR_Mk61 = "weapons.nurs.FFAR_Mk61" -ENUMS.Storage.weapons.bombs.HB_F4E_GBU15V1 = "weapons.bombs.HB_F4E_GBU15V1" -ENUMS.Storage.weapons.containers.HB_F14_EXT_AN_APQ_167 = "weapons.containers.HB_F14_EXT_AN_APQ-167" -ENUMS.Storage.weapons.nurs.LWL_RP = "weapons.nurs.LWL_RP" -ENUMS.Storage.weapons.bombs.AGM_62_I = "weapons.bombs.AGM_62_I" -ENUMS.Storage.weapons.containers.ETHER = "weapons.containers.ETHER" -ENUMS.Storage.weapons.containers.TANGAZH = "weapons.containers.TANGAZH" -ENUMS.Storage.weapons.bombs.LYSBOMB_11086 = "weapons.bombs.LYSBOMB 11086" -ENUMS.Storage.weapons.containers.Stub_Wing = "weapons.containers.Stub_Wing" -ENUMS.Storage.weapons.missiles.AIM_9E = "weapons.missiles.AIM-9E" -ENUMS.Storage.weapons.missiles.C_701T = "weapons.missiles.C_701T" -ENUMS.Storage.weapons.bombs.BAP_100 = "weapons.bombs.BAP_100" -ENUMS.Storage.weapons.missiles.CM_802AKG = "weapons.missiles.CM-802AKG" -ENUMS.Storage.weapons.missiles.CM_400AKG = "weapons.missiles.CM-400AKG" -ENUMS.Storage.weapons.missiles.C_802AK = "weapons.missiles.C_802AK" -ENUMS.Storage.weapons.missiles.KD_63 = "weapons.missiles.KD_63" -ENUMS.Storage.weapons.containers.HB_ORD_Pave_Spike_Fast = "weapons.containers.HB_ORD_Pave_Spike_Fast" -ENUMS.Storage.weapons.missiles.SPIKE_ER2 = "weapons.missiles.SPIKE_ER2" -ENUMS.Storage.weapons.containers.KINGAL = "weapons.containers.KINGAL" -ENUMS.Storage.weapons.containers.LANTIRN_F14_TARGET = "weapons.containers.LANTIRN-F14-TARGET" -ENUMS.Storage.weapons.containers.SPS_141 = "weapons.containers.SPS-141" -ENUMS.Storage.weapons.bombs.BLU_3B_GROUP = "weapons.bombs.BLU-3B_GROUP" -ENUMS.Storage.weapons.containers.HB_ALE_40_30_0 = "weapons.containers.HB_ALE_40_30_0" -ENUMS.Storage.weapons.droptanks.HB_HIGH_PERFORMANCE_CENTERLINE_600_GAL = "weapons.droptanks.HB_HIGH_PERFORMANCE_CENTERLINE_600_GAL" -ENUMS.Storage.weapons.containers.ALQ_184 = "weapons.containers.ALQ-184" -ENUMS.Storage.weapons.missiles.AGM_45B = "weapons.missiles.AGM_45B" -ENUMS.Storage.weapons.bombs.BLU_3_GROUP = "weapons.bombs.BLU-3_GROUP" -ENUMS.Storage.weapons.missiles.SPIKE_ER = "weapons.missiles.SPIKE_ER" -ENUMS.Storage.weapons.nurs.ARAKM70BAPPX = "weapons.nurs.ARAKM70BAPPX" -ENUMS.Storage.weapons.bombs.LYSBOMB_11088 = "weapons.bombs.LYSBOMB 11088" -ENUMS.Storage.weapons.bombs.LYSBOMB_11087 = "weapons.bombs.LYSBOMB 11087" -ENUMS.Storage.weapons.missiles.KD_20 = "weapons.missiles.KD_20" -ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank = "weapons.droptanks.HB_F-4E_EXT_WingTank" -ENUMS.Storage.weapons.missiles.Rb_04 = "weapons.missiles.Rb_04" -ENUMS.Storage.weapons.containers.AAQ_33 = "weapons.containers.AAQ-33" -ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_Center_Fuel_Tank_EMPTY = "weapons.droptanks.HB_F-4E_EXT_Center_Fuel_Tank_EMPTY" -ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank_R_EMPTY = "weapons.droptanks.HB_F-4E_EXT_WingTank_R_EMPTY" -ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank_EMPTY = "weapons.droptanks.HB_F-4E_EXT_WingTank_EMPTY" -ENUMS.Storage.weapons.containers.uh_60l_copilot = "weapons.containers.uh-60l_copilot" -ENUMS.Storage.weapons.droptanks.JAYHAWK_80gal_Fuel_Tankv2 = "weapons.droptanks.JAYHAWK_80gal_Fuel_Tankv2" -ENUMS.Storage.weapons.containers.supply_m134 = "weapons.containers.supply_m134" -ENUMS.Storage.weapons.containers.Seahawk_Pylon = "weapons.containers.Seahawk_Pylon" -ENUMS.Storage.weapons.nurs.LWL_MPP = "weapons.nurs.LWL_MPP" -ENUMS.Storage.weapons.nurs.S_5KP = "weapons.nurs.S_5KP" -ENUMS.Storage.weapons.missiles.AIM_92J = "weapons.missiles.AIM-92J" -ENUMS.Storage.weapons.missiles.HB_AIM_7E = "weapons.missiles.HB-AIM-7E" -ENUMS.Storage.weapons.containers.ALQ_131 = "weapons.containers.ALQ-131" -ENUMS.Storage.weapons.containers.HB_F14_EXT_TARPS = "weapons.containers.HB_F14_EXT_TARPS" -ENUMS.Storage.weapons.containers.MH60_SOAR = "weapons.containers.MH60_SOAR" -ENUMS.Storage.weapons.missiles.YJ_83 = "weapons.missiles.YJ-83" -ENUMS.Storage.weapons.bombs.GBU_8_B = "weapons.bombs.GBU_8_B" -ENUMS.Storage.weapons.containers.HB_F14_EXT_ECA = "weapons.containers.HB_F14_EXT_ECA" -ENUMS.Storage.weapons.bombs.BAP_100 = "weapons.bombs.BAP-100" -ENUMS.Storage.weapons.nurs.M261_MPSM_Rocket = "weapons.nurs.M261_MPSM_Rocket" -ENUMS.Storage.weapons.droptanks.SEAHAWK_120_Fuel_Tank = "weapons.droptanks.SEAHAWK_120_Fuel_Tank" -ENUMS.Storage.weapons.containers.SHPIL = "weapons.containers.SHPIL" -ENUMS.Storage.weapons.bombs.GBU_39 = "weapons.bombs.GBU_39" -ENUMS.Storage.weapons.nurs.S_5M = "weapons.nurs.S_5M" -ENUMS.Storage.weapons.containers.HB_ALE_40_15_90 = "weapons.containers.HB_ALE_40_15_90" -ENUMS.Storage.weapons.missiles.AIM_7E = "weapons.missiles.AIM-7E" -ENUMS.Storage.weapons.missiles.AIM_9P3 = "weapons.missiles.AIM-9P3" -ENUMS.Storage.weapons.missiles.AGM_12B = "weapons.missiles.AGM_12B" -ENUMS.Storage.weapons.missiles.CM_802AKG = "weapons.missiles.CM_802AKG" -ENUMS.Storage.weapons.droptanks.JAYHAWK_120_Fuel_Dual_Tank = "weapons.droptanks.JAYHAWK_120_Fuel_Dual_Tank" -ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_Center_Fuel_Tank = "weapons.droptanks.HB_F-4E_EXT_Center_Fuel_Tank" -ENUMS.Storage.weapons.containers.PAVETACK = "weapons.containers.PAVETACK" -ENUMS.Storage.weapons.missiles.LS_6_500 = "weapons.missiles.LS_6_500" -ENUMS.Storage.weapons.bombs.LYSBOMB_11089 = "weapons.bombs.LYSBOMB 11089" -ENUMS.Storage.weapons.bombs.BLU_4B_GROUP = "weapons.bombs.BLU-4B_GROUP" -ENUMS.Storage.weapons.containers.ah_64d_radar = "weapons.containers.ah-64d_radar" -ENUMS.Storage.weapons.containers.F_18_LDT_POD = "weapons.containers.F-18-LDT-POD" -ENUMS.Storage.weapons.containers.HB_ALE_40_30_60 = "weapons.containers.HB_ALE_40_30_60" -ENUMS.Storage.weapons.bombs.LS_6_100 = "weapons.bombs.LS_6_100" -ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank_R = "weapons.droptanks.HB_F-4E_EXT_WingTank_R" -ENUMS.Storage.weapons.containers.SORBCIJA_R = "weapons.containers.SORBCIJA_R" -ENUMS.Storage.weapons.missiles.CATM_65K = "weapons.missiles.CATM_65K" -ENUMS.Storage.weapons.containers.HB_ORD_Pave_Spike = "weapons.containers.HB_ORD_Pave_Spike" -ENUMS.Storage.weapons.containers.RobbieTank1 = "weapons.containers.RobbieTank1" -ENUMS.Storage.weapons.containers.SKY_SHADOW = "weapons.containers.SKY_SHADOW" -ENUMS.Storage.weapons.containers.SORBCIJA_L = "weapons.containers.SORBCIJA_L" -ENUMS.Storage.weapons.containers.Pavehawk = "weapons.containers.Pavehawk" -ENUMS.Storage.weapons.bombs.BLG66_EG = "weapons.bombs.BLG66_EG" -ENUMS.Storage.weapons.missiles.AGM_12C_ED = "weapons.missiles.AGM_12C_ED" -ENUMS.Storage.weapons.missiles.AIM_92C = "weapons.missiles.AIM-92C" -ENUMS.Storage.weapons.containers.MPS_410 = "weapons.containers.MPS-410" -ENUMS.Storage.weapons.missiles.HJ_12 = "weapons.missiles.HJ-12" -ENUMS.Storage.weapons.containers.AAQ_28_LITENING = "weapons.containers.AAQ-28_LITENING" -ENUMS.Storage.weapons.containers.F_18_FLIR_POD = "weapons.containers.F-18-FLIR-POD" -ENUMS.Storage.weapons.bombs.BLU_3B_GROUP = "weapons.bombs.BLU_3B_GROUP" -ENUMS.Storage.weapons.containers.UH60L_Jayhawk = "weapons.containers.UH60L_Jayhawk" -ENUMS.Storage.weapons.containers.BOZ_100 = "weapons.containers.BOZ-100" -ENUMS.Storage.weapons.missiles.AGM_78A = "weapons.missiles.AGM_78A" -ENUMS.Storage.weapons.missiles.LAU_61_APKWS_M282 = "weapons.missiles.LAU_61_APKWS_M282" -ENUMS.Storage.weapons.bombs.BAP_100 = "weapons.bombs.BAP-100" -ENUMS.Storage.weapons.missiles.CM_802AKG = "weapons.missiles.CM-802AKG" -ENUMS.Storage.weapons.bombs.BLU_3B_GROUP = "weapons.bombs.BLU_3B_GROUP" -ENUMS.Storage.weapons.bombs.BLU_4B_GROUP = "weapons.bombs.BLU-4B_GROUP" -ENUMS.Storage.weapons.nurs.S_5M = "weapons.nurs.S_5M" -ENUMS.Storage.weapons.missiles.AGM_12A = "weapons.missiles.AGM_12A" -ENUMS.Storage.weapons.droptanks.JAYHAWK_120_Fuel_Tank = "weapons.droptanks.JAYHAWK_120_Fuel_Tank" -ENUMS.Storage.weapons.bombs.GBU_15_V_1_B = "weapons.bombs.GBU_15_V_1_B" -ENUMS.Storage.weapons.missiles.HYDRA_70_M151_APKWS = {4,4,8,292} -ENUMS.Storage.weapons.missiles.HYDRA_70_M282_APKWS = {4,4,8,293} --- dupes with typos -ENUMS.Storage.weapons.bombs.BAP100 = "weapons.bombs.BAP_100" -ENUMS.Storage.weapons.bombs.BLU3B_GROUP = "weapons.bombs.BLU-3B_GROUP" -ENUMS.Storage.weapons.missiles.CM_802AKG = "weapons.missiles.CM_802AKG" -ENUMS.Storage.weapons.bombs.BLU_4B_GROUP = "weapons.bombs.BLU_4B_GROUP" -ENUMS.Storage.weapons.nurs.S5M = "weapons.nurs.S-5M" --- Gazelle -ENUMS.Storage.weapons.Gazelle.HMP400_100RDS = {4,15,46,1771} -ENUMS.Storage.weapons.Gazelle.HMP400_200RDS = {4,15,46,1770} -ENUMS.Storage.weapons.Gazelle.HMP400_400RDS = {4,15,46,1769} -ENUMS.Storage.weapons.Gazelle.GIAT_M261_AP = {4,15,46,1768} -ENUMS.Storage.weapons.Gazelle.GIAT_M261_SAPHEI = {4,15,46,1767} -ENUMS.Storage.weapons.Gazelle.GIAT_M261_HE = {4,15,46,1766} -ENUMS.Storage.weapons.Gazelle.GIAT_M261_HEAP = {4,15,46,1765} -ENUMS.Storage.weapons.Gazelle.GIAT_M261_APHE = {4,15,46,1764} -ENUMS.Storage.weapons.Gazelle.GAZELLE_IR_DEFLECTOR = {4,15,47,680} -ENUMS.Storage.weapons.Gazelle.GAZELLE_FAS_SANDFILTER = {4,15,47,679} --- Chinook (changed) -ENUMS.Storage.weapons.CH47.CH47_PORT_M60D = {4,15,46,2489} -ENUMS.Storage.weapons.CH47.CH47_STBD_M60D = {4,15,46,2488} -ENUMS.Storage.weapons.CH47.CH47_AFT_M60D = {4,15,46,2490} -ENUMS.Storage.weapons.CH47.CH47_PORT_M134D = {4,15,46,2494} -ENUMS.Storage.weapons.CH47.CH47_STBD_M134D = {4,15,46,2495} -ENUMS.Storage.weapons.CH47.CH47_AFT_M3M = {4,15,46,2496} -- -ENUMS.Storage.weapons.CH47.CH47_PORT_M240H = {4,15,46,2492} -ENUMS.Storage.weapons.CH47.CH47_STBD_M240H = {4,15,46,2491} -ENUMS.Storage.weapons.CH47.CH47_AFT_M240H = {4,15,46,2493} --- Huey -ENUMS.Storage.weapons.UH1H.M134_MiniGun_Right = {4,15,46,161} -ENUMS.Storage.weapons.UH1H.M134_MiniGun_Left = {4,15,46,160} -ENUMS.Storage.weapons.UH1H.M134_MiniGun_Right_Door = {4,15,46,175} -ENUMS.Storage.weapons.UH1H.M60_MG_Right_Door = {4,15,46,177} -ENUMS.Storage.weapons.UH1H.M134_MiniGun_Left_Door = {4,15,46,174} -ENUMS.Storage.weapons.UH1H.M60_MG_Left_Door = {4,15,46,176} --- UH-60L -ENUMS.Storage.weapons.UH60L.M151_HYDRA = {4, 7, 33, 147} -- 2.75" Hydra, UnGd Rkts M151, HE -ENUMS.Storage.weapons.UH60L.M156_HYDRA = {4, 7, 33, 148} -- 2.75" Hydra, UnGd Rkts M156, Wht Phos -ENUMS.Storage.weapons.UH60L.M229_HYDRA = {4, 7, 33, 148} -- 2.75" Hydra, UnGd Rkts M229, HE -ENUMS.Storage.weapons.UH60L.M257_HYDRA = {4, 7, 33, 151} -- 2.75" Hydra, UnGd Rkts M257, Para Illum -ENUMS.Storage.weapons.UH60L.M259_HYDRA = {4, 7, 33, 151} -- 2.75" Hydra, UnGd Rkts M259, Smoke Marker -ENUMS.Storage.weapons.UH60L.M274_HYDRA = {4, 7, 33, 150} -- 2.75" Hydra, UnGd Rkts M274, Practice Smk -ENUMS.Storage.weapons.UH60L.M134_DOOR_GUN = {4, 15, 46, 3031} -ENUMS.Storage.weapons.UH60L.M3M = {4, 15, 46, 2496} -ENUMS.Storage.weapons.UH60L.M3M_DOOR_GUN = {4, 15, 46, 3032} -ENUMS.Storage.weapons.UH60L.M60_DOOR_GUN = {4, 15, 46, 3033} -ENUMS.Storage.weapons.UH60L.FUEL_TANK_200 = {1,3,43,3023} -ENUMS.Storage.weapons.UH60L.FUEL_TANK_230 = {1,3,43,3024} -ENUMS.Storage.weapons.UH60L.FUEL_TANK_450 = {1,3,43,3025} -ENUMS.Storage.weapons.UH60L.FUEL_TANK_DUAL_AUX = {1,3,43,3026} -ENUMS.Storage.weapons.UH60L.CARGO_SEAT_REAR_ROW = {1,3,43,3030} -ENUMS.Storage.weapons.UH60L.CARGO_SEAT_THREE_ROWS = {1,3,43,3029} -ENUMS.Storage.weapons.UH60L.EMPTY_GUNNER_SEAT_1 = {1,3,43,3027} -ENUMS.Storage.weapons.UH60L.EMPTY_GUNNER_SEAT_2 = {1,3,43,3028} +ENUMS.Storage.weapons.containers.APK9 = 'weapons.containers.APK-9' +ENUMS.Storage.weapons.shells.KDA_35_FAPDS = 'weapons.shells.KDA_35_FAPDS' +ENUMS.Storage.weapons.shells.BR_354N = 'weapons.shells.BR_354N' +ENUMS.Storage.weapons.droptanks.HB_F4E_EXT_WingTank_EMPTY = 'weapons.droptanks.HB_F-4E_EXT_WingTank_EMPTY' +ENUMS.Storage.weapons.nurs.HYDRA_70_M151_M433 = 'weapons.nurs.HYDRA_70_M151_M433' +ENUMS.Storage.weapons.shells.Rh202_20_HE = 'weapons.shells.Rh202_20_HE' +ENUMS.Storage.weapons.bombs.GBU_38 = 'weapons.bombs.GBU_38' +ENUMS.Storage.weapons.containers._16c_hts_pod = 'weapons.containers.16c_hts_pod' +ENUMS.Storage.weapons.missiles.AGM_65G = 'weapons.missiles.AGM_65G' +ENUMS.Storage.weapons.gunmounts.NR30 = 'weapons.gunmounts.NR-30' +ENUMS.Storage.weapons.gunmounts.MB339_ANM3_L = 'weapons.gunmounts.{MB339_ANM3_L}' +ENUMS.Storage.weapons.adapters.UB13 = 'weapons.adapters.UB-13' +ENUMS.Storage.weapons.shells.N37_37x155_HEI_T = 'weapons.shells.N37_37x155_HEI_T' +ENUMS.Storage.weapons.bombs.AN_M30A1 = 'weapons.bombs.AN_M30A1' +ENUMS.Storage.weapons.adapters.APU601 = 'weapons.adapters.APU-60-1' +ENUMS.Storage.weapons.adapters.M2000C_AUF2 = 'weapons.adapters.M-2000C_AUF2' +ENUMS.Storage.weapons.shells.MG_20x82_API = 'weapons.shells.MG_20x82_API' +ENUMS.Storage.weapons.adapters.Carrier_N1_EM_EF = 'weapons.adapters.Carrier_N-1_EM_EF' +ENUMS.Storage.weapons.gunmounts.OH58D_M3P_L500 = 'weapons.gunmounts.OH58D_M3P_L500' +ENUMS.Storage.weapons.adapters.RB15pylon = 'weapons.adapters.RB15pylon' +ENUMS.Storage.weapons.bombs.AGM_62 = 'weapons.bombs.AGM_62' +ENUMS.Storage.weapons.shells.GSH23_23_AP = 'weapons.shells.GSH23_23_AP' +ENUMS.Storage.weapons.shells.Mauser7_92x57_S_m_K_Ub_m_Zerl = 'weapons.shells.Mauser7.92x57_S.m.K._Ub.m.Zerl.' +ENUMS.Storage.weapons.shells.M2_12_7 = 'weapons.shells.M2_12_7' +ENUMS.Storage.weapons.shells.M230_HEDPM789 = 'weapons.shells.M230_HEDP M789' +ENUMS.Storage.weapons.adapters.UB_32A = 'weapons.adapters.UB_32A' +ENUMS.Storage.weapons.shells.L23A1_APFSDS = 'weapons.shells.L23A1_APFSDS' +ENUMS.Storage.weapons.shells.DEFA553_30HE = 'weapons.shells.DEFA553_30HE' +ENUMS.Storage.weapons.bombs.LYSBOMB11087 = 'weapons.bombs.LYSBOMB 11087' +ENUMS.Storage.weapons.shells.KS19_100HE = 'weapons.shells.KS19_100HE' +ENUMS.Storage.weapons.droptanks.M2KC_RPL_522_EMPTY = 'weapons.droptanks.M2KC_RPL_522_EMPTY' +ENUMS.Storage.weapons.droptanks.M2KC_08_RPL541 = 'weapons.droptanks.M2KC_08_RPL541' +ENUMS.Storage.weapons.shells._50Browning_API_M8_Corsair = 'weapons.shells.50Browning_API_M8_Corsair' +ENUMS.Storage.weapons.adapters.OH58D_M260 = 'weapons.adapters.OH58D_M260' +ENUMS.Storage.weapons.missiles.Rb05A = 'weapons.missiles.Rb 05A' +ENUMS.Storage.weapons.adapters.HB_F14_EXT_SHOULDER_PHX_L = 'weapons.adapters.HB_F14_EXT_SHOULDER_PHX_L' +ENUMS.Storage.weapons.shells.MG_13x64_HEI_T = 'weapons.shells.MG_13x64_HEI_T' +ENUMS.Storage.weapons.droptanks.M2KC_08_RPL541_EMPTY = 'weapons.droptanks.M2KC_08_RPL541_EMPTY' +ENUMS.Storage.weapons.missiles.HQ16 = 'weapons.missiles.HQ-16' +ENUMS.Storage.weapons.nurs.SMERCH_9M55F = 'weapons.nurs.SMERCH_9M55F' +ENUMS.Storage.weapons.nurs.M26 = 'weapons.nurs.M26' +ENUMS.Storage.weapons.shells._2A38_30_AP = 'weapons.shells.2A38_30_AP' +ENUMS.Storage.weapons.missiles.LS_6 = 'weapons.missiles.LS_6' +ENUMS.Storage.weapons.containers.EclairM_60 = 'weapons.containers.{EclairM_60}' +ENUMS.Storage.weapons.bombs.FAB_100 = 'weapons.bombs.FAB_100' +ENUMS.Storage.weapons.missiles.MALUTKA = 'weapons.missiles.MALUTKA' +ENUMS.Storage.weapons.containers.HB_ALE_40_0_120 = 'weapons.containers.HB_ALE_40_0_120' +ENUMS.Storage.weapons.bombs.M485_FLARE = 'weapons.bombs.M485_FLARE' +ENUMS.Storage.weapons.nurs.AGR_20_M282_unguided = 'weapons.nurs.AGR_20_M282_unguided' +ENUMS.Storage.weapons.droptanks.F15E_Drop_Tank = 'weapons.droptanks.F-15E_Drop_Tank' +ENUMS.Storage.weapons.shells._20mm_M70LD_SAPHEI = 'weapons.shells.20mm_M70LD_SAPHEI' +ENUMS.Storage.weapons.adapters.CHAP_Mi28N_ataka = 'weapons.adapters.CHAP_Mi28N_ataka' +ENUMS.Storage.weapons.bombs.GBU_30 = 'weapons.bombs.GBU_30' +ENUMS.Storage.weapons.bombs.AGM_62_I = 'weapons.bombs.AGM_62_I' +ENUMS.Storage.weapons.bombs.BETAB500S = 'weapons.bombs.BETAB-500S' +ENUMS.Storage.weapons.shells.ZTZ_125_HE = 'weapons.shells.ZTZ_125_HE' +ENUMS.Storage.weapons.shells.HP30_30_AP = 'weapons.shells.HP30_30_AP' +ENUMS.Storage.weapons.missiles.SM_6 = 'weapons.missiles.SM_6' +ENUMS.Storage.weapons.gunmounts.MINIGUN = 'weapons.gunmounts.MINIGUN' +ENUMS.Storage.weapons.bombs.CBU_87 = 'weapons.bombs.CBU_87' +ENUMS.Storage.weapons.adapters.B8V20A = 'weapons.adapters.B-8V20A' +ENUMS.Storage.weapons.containers.AN_ASQ_228 = 'weapons.containers.AN_ASQ_228' +ENUMS.Storage.weapons.missiles.Sea_Dart = 'weapons.missiles.Sea_Dart' +ENUMS.Storage.weapons.adapters.apu13mt = 'weapons.adapters.apu-13mt' +ENUMS.Storage.weapons.adapters.HB_ORD_Missile_Well_Adapter = 'weapons.adapters.HB_ORD_Missile_Well_Adapter' +ENUMS.Storage.weapons.shells.AK176_76 = 'weapons.shells.AK176_76' +ENUMS.Storage.weapons.missiles.X_29T = 'weapons.missiles.X_29T' +ENUMS.Storage.weapons.nurs.HYDRA_70_MK61 = 'weapons.nurs.HYDRA_70_MK61' +ENUMS.Storage.weapons.shells.M393A3_105_HE = 'weapons.shells.M393A3_105_HE' +ENUMS.Storage.weapons.bombs.AN_M57 = 'weapons.bombs.AN_M57' +ENUMS.Storage.weapons.missiles.AIM_7 = 'weapons.missiles.AIM_7' +ENUMS.Storage.weapons.gunmounts.GIAT_M621_SAPHEI = 'weapons.gunmounts.{GIAT_M621_SAPHEI}' +ENUMS.Storage.weapons.containers.MATRAPHIMAT = 'weapons.containers.MATRA-PHIMAT' +ENUMS.Storage.weapons.shells.M61_20_AP = 'weapons.shells.M61_20_AP' +ENUMS.Storage.weapons.droptanks.droptank_150_gal = 'weapons.droptanks.droptank_150_gal' +ENUMS.Storage.weapons.missiles.SA48H6E2 = 'weapons.missiles.SA48H6E2' +ENUMS.Storage.weapons.nurs.HVARUSNMk28Mod4 = 'weapons.nurs.HVAR USN Mk28 Mod4' +ENUMS.Storage.weapons.adapters.KMGU2 = 'weapons.adapters.KMGU-2' +ENUMS.Storage.weapons.missiles.C_701T = 'weapons.missiles.C_701T' +ENUMS.Storage.weapons.shells.DM53_120_AP = 'weapons.shells.DM53_120_AP' +ENUMS.Storage.weapons.adapters._9M114PYLON_EMPTY = 'weapons.adapters.9M114-PYLON_EMPTY' +ENUMS.Storage.weapons.missiles.P_500 = 'weapons.missiles.P_500' +ENUMS.Storage.weapons.bombs.S_8OM_FLARE = 'weapons.bombs.S_8OM_FLARE' +ENUMS.Storage.weapons.adapters.LAU115C2_LAU127 = 'weapons.adapters.LAU-115C+2_LAU127' +ENUMS.Storage.weapons.shells.M256_120_HE = 'weapons.shells.M256_120_HE' +ENUMS.Storage.weapons.shells._7_62x51tr = 'weapons.shells.7_62x51tr' +ENUMS.Storage.weapons.adapters.adapter_gdj_kd63 = 'weapons.adapters.adapter_gdj_kd63' +ENUMS.Storage.weapons.missiles.CM802AKG = 'weapons.missiles.CM-802AKG' +ENUMS.Storage.weapons.missiles.C_802AK = 'weapons.missiles.C_802AK' +ENUMS.Storage.weapons.bombs.GBU_39 = 'weapons.bombs.GBU_39' +ENUMS.Storage.weapons.bombs.BETAB500M = 'weapons.bombs.BETAB-500M' +ENUMS.Storage.weapons.adapters.LAU117 = 'weapons.adapters.LAU-117' +ENUMS.Storage.weapons.missiles.BK90_MJ1 = 'weapons.missiles.BK90_MJ1' +ENUMS.Storage.weapons.missiles.R60 = 'weapons.missiles.R-60' +ENUMS.Storage.weapons.shells.PJ26_76_PFHE = 'weapons.shells.PJ26_76_PFHE' +ENUMS.Storage.weapons.nurs.AGR_20_M151_unguided = 'weapons.nurs.AGR_20_M151_unguided' +ENUMS.Storage.weapons.shells.HEDPM430 = 'weapons.shells.HEDPM430' +ENUMS.Storage.weapons.shells.GSH_23_HE = 'weapons.shells.GSH_23_HE' +ENUMS.Storage.weapons.gunmounts.CC420_GUN_POD = 'weapons.gunmounts.{CC420_GUN_POD}' +ENUMS.Storage.weapons.shells.Hispano_Mk_II_SAPI = 'weapons.shells.Hispano_Mk_II_SAP/I' +ENUMS.Storage.weapons.adapters.Spitfire_pilon2L = 'weapons.adapters.Spitfire_pilon2L' +ENUMS.Storage.weapons.bombs.RBK_500SOAB = 'weapons.bombs.RBK_500SOAB' +ENUMS.Storage.weapons.bombs.M_117 = 'weapons.bombs.M_117' +ENUMS.Storage.weapons.missiles.SPIKE_ER2 = 'weapons.missiles.SPIKE_ER2' +ENUMS.Storage.weapons.bombs.BDU_45LGB = 'weapons.bombs.BDU_45LGB' +ENUMS.Storage.weapons.missiles.AGM_65H = 'weapons.missiles.AGM_65H' +ENUMS.Storage.weapons.adapters.adapter_df4b = 'weapons.adapters.adapter_df4b' +ENUMS.Storage.weapons.nurs.SNEB_TYPE252_F1B = 'weapons.nurs.SNEB_TYPE252_F1B' +ENUMS.Storage.weapons.droptanks._800LTank = 'weapons.droptanks.800L Tank' +ENUMS.Storage.weapons.missiles.X_31A = 'weapons.missiles.X_31A' +ENUMS.Storage.weapons.containers.LANTIRNF14TARGET = 'weapons.containers.LANTIRN-F14-TARGET' +ENUMS.Storage.weapons.bombs.CBU_52B = 'weapons.bombs.CBU_52B' +ENUMS.Storage.weapons.adapters.b52mbd_mk84 = 'weapons.adapters.b52-mbd_mk84' +ENUMS.Storage.weapons.adapters.J11A_twinpylon_l = 'weapons.adapters.J-11A_twinpylon_l' +ENUMS.Storage.weapons.gunmounts.MB339_DEFA553_R = 'weapons.gunmounts.{MB339_DEFA553_R}' +ENUMS.Storage.weapons.containers.BARAX = 'weapons.containers.BARAX' +ENUMS.Storage.weapons.shells.DEFA554_30_HE = 'weapons.shells.DEFA554_30_HE' +ENUMS.Storage.weapons.droptanks.i16_eft = 'weapons.droptanks.i16_eft' +ENUMS.Storage.weapons.bombs.BLU3B_GROUP = 'weapons.bombs.BLU-3B_GROUP' +ENUMS.Storage.weapons.missiles.Sea_Cat = 'weapons.missiles.Sea_Cat' +ENUMS.Storage.weapons.adapters.aero3b = 'weapons.adapters.aero-3b' +ENUMS.Storage.weapons.nurs.SNEB_TYPE251_F1B = 'weapons.nurs.SNEB_TYPE251_F1B' +ENUMS.Storage.weapons.missiles.FIM_92C = 'weapons.missiles.FIM_92C' +ENUMS.Storage.weapons.missiles.SM_2ER = 'weapons.missiles.SM_2ER' +ENUMS.Storage.weapons.missiles.AGM_114K = 'weapons.missiles.AGM_114K' +ENUMS.Storage.weapons.bombs.AB_250_2_SD_10A = 'weapons.bombs.AB_250_2_SD_10A' +ENUMS.Storage.weapons.missiles.X_65 = 'weapons.missiles.X_65' +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk4 = 'weapons.bombs.British_GP_500LB_Bomb_Mk4' +ENUMS.Storage.weapons.shells._50Browning_Ball_M2 = 'weapons.shells.50Browning_Ball_M2' +ENUMS.Storage.weapons.containers.HB_F14_EXT_TARPS = 'weapons.containers.HB_F14_EXT_TARPS' +ENUMS.Storage.weapons.gunmounts.PKT_7_62 = 'weapons.gunmounts.PKT_7_62' +ENUMS.Storage.weapons.shells._50Browning_I_M1 = 'weapons.shells.50Browning_I_M1' +ENUMS.Storage.weapons.shells.British303_Ball_Mk8 = 'weapons.shells.British303_Ball_Mk8' +ENUMS.Storage.weapons.adapters.F4PILON = 'weapons.adapters.F4-PILON' +ENUMS.Storage.weapons.missiles.P_77 = 'weapons.missiles.P_77' +ENUMS.Storage.weapons.missiles.SA9M338K = 'weapons.missiles.SA9M338K' +ENUMS.Storage.weapons.shells.ZTZ_7_62 = 'weapons.shells.ZTZ_7_62' +ENUMS.Storage.weapons.shells.Mauser7_92x57_B = 'weapons.shells.Mauser7.92x57_B.' +ENUMS.Storage.weapons.missiles.X_28 = 'weapons.missiles.X_28' +ENUMS.Storage.weapons.missiles.KD_20 = 'weapons.missiles.KD_20' +ENUMS.Storage.weapons.missiles.TGM_65G = 'weapons.missiles.TGM_65G' +ENUMS.Storage.weapons.adapters.mbd4 = 'weapons.adapters.mbd-4' +ENUMS.Storage.weapons.shells.Mauser7_92x57_S_m_K_ = 'weapons.shells.Mauser7.92x57_S.m.K.' +ENUMS.Storage.weapons.missiles.M39A1 = 'weapons.missiles.M39A1' +ENUMS.Storage.weapons.adapters.m559 = 'weapons.adapters.m559' +ENUMS.Storage.weapons.missiles.AGM_12B = 'weapons.missiles.AGM_12B' +ENUMS.Storage.weapons.shells.M39_20_HEI = 'weapons.shells.M39_20_HEI' +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk4_Short = 'weapons.bombs.British_GP_500LB_Bomb_Mk4_Short' +ENUMS.Storage.weapons.missiles.Rb15F = 'weapons.missiles.Rb 15F' +ENUMS.Storage.weapons.missiles.AIM_120C = 'weapons.missiles.AIM_120C' +ENUMS.Storage.weapons.shells.Mauser7_92x57_SmK_Lspurweiss = "weapons.shells.Mauser7.92x57_S.m.K._L'spur(weiss)" +ENUMS.Storage.weapons.nurs.S_5KP = 'weapons.nurs.S_5KP' +ENUMS.Storage.weapons.bombs.GBU_31_V_4B = 'weapons.bombs.GBU_31_V_4B' +ENUMS.Storage.weapons.missiles.HQ7B = 'weapons.missiles.HQ-7B' +ENUMS.Storage.weapons.bombs.ODAB500PM = 'weapons.bombs.ODAB-500PM' +ENUMS.Storage.weapons.bombs.BAP100 = 'weapons.bombs.BAP-100' +ENUMS.Storage.weapons.shells.MK_108_MGsch = 'weapons.shells.MK_108_MGsch' +ENUMS.Storage.weapons.bombs.British_MC_500LB_Bomb_Mk1_Short = 'weapons.bombs.British_MC_500LB_Bomb_Mk1_Short' +ENUMS.Storage.weapons.adapters.BRU42_LS_LAU131 = 'weapons.adapters.BRU-42_LS_(LAU-131)' +ENUMS.Storage.weapons.containers.SHPIL = 'weapons.containers.SHPIL' +ENUMS.Storage.weapons.torpedoes.Mark_46 = 'weapons.torpedoes.Mark_46' +ENUMS.Storage.weapons.bombs.SAB_100MN = 'weapons.bombs.SAB_100MN' +ENUMS.Storage.weapons.missiles.SA3M9M = 'weapons.missiles.SA3M9M' +ENUMS.Storage.weapons.adapters.LAU61 = 'weapons.adapters.LAU-61' +ENUMS.Storage.weapons.adapters.mer2 = 'weapons.adapters.mer2' +ENUMS.Storage.weapons.shells.ship_Bofors_40mm_HE = 'weapons.shells.ship_Bofors_40mm_HE' +ENUMS.Storage.weapons.nurs.S24A = 'weapons.nurs.S-24A' +ENUMS.Storage.weapons.shells.GSh_30_2K_AP_Tr = 'weapons.shells.GSh_30_2K_AP_Tr' +ENUMS.Storage.weapons.missiles.AIM7F = 'weapons.missiles.AIM-7F' +ENUMS.Storage.weapons.shells.M383 = 'weapons.shells.M383' +ENUMS.Storage.weapons.nurs.HYDRA_70_M257 = 'weapons.nurs.HYDRA_70_M257' +ENUMS.Storage.weapons.droptanks.PTB_580G_F1 = 'weapons.droptanks.PTB_580G_F1' +ENUMS.Storage.weapons.gunmounts.C101DEFA553 = 'weapons.gunmounts.{C-101-DEFA553}' +ENUMS.Storage.weapons.missiles.MICA_R = 'weapons.missiles.MICA_R' +ENUMS.Storage.weapons.shells.M53_APT_RED = 'weapons.shells.M53_APT_RED' +ENUMS.Storage.weapons.missiles.AIM9P5 = 'weapons.missiles.AIM-9P5' +ENUMS.Storage.weapons.adapters._306M2 = 'weapons.adapters.30-6-M2' +ENUMS.Storage.weapons.shells._75mm_AA_JAP = 'weapons.shells.75mm_AA_JAP' +ENUMS.Storage.weapons.nurs.TinyTim = 'weapons.nurs.Tiny Tim' +ENUMS.Storage.weapons.missiles.X_22 = 'weapons.missiles.X_22' +ENUMS.Storage.weapons.nurs.S25O = 'weapons.nurs.S-25-O' +ENUMS.Storage.weapons.missiles.X_101 = 'weapons.missiles.X_101' +ENUMS.Storage.weapons.missiles.AIM_54A_Mk47 = 'weapons.missiles.AIM_54A_Mk47' +ENUMS.Storage.weapons.containers.ECM_POD_L_175V = 'weapons.containers.{ECM_POD_L_175V}' +ENUMS.Storage.weapons.shells._2A28_73 = 'weapons.shells.2A28_73' +ENUMS.Storage.weapons.shells.GAU8_30_AP = 'weapons.shells.GAU8_30_AP' +ENUMS.Storage.weapons.shells.British303_Ball_Mk1c = 'weapons.shells.British303_Ball_Mk1c' +ENUMS.Storage.weapons.missiles.AIM_9 = 'weapons.missiles.AIM_9' +ENUMS.Storage.weapons.missiles.SD10 = 'weapons.missiles.SD-10' +ENUMS.Storage.weapons.droptanks.M2KC_RPL_522 = 'weapons.droptanks.M2KC_RPL_522' +ENUMS.Storage.weapons.missiles.AGM_130 = 'weapons.missiles.AGM_130' +ENUMS.Storage.weapons.gunmounts.defa_553 = 'weapons.gunmounts.defa_553' +ENUMS.Storage.weapons.nurs.BRM1_90MM_UG = 'weapons.nurs.BRM1_90MM_UG' +ENUMS.Storage.weapons.gunmounts.CH47_STBD_M60D = 'weapons.gunmounts.{CH47_STBD_M60D}' +ENUMS.Storage.weapons.adapters.LAU10 = 'weapons.adapters.LAU-10' +ENUMS.Storage.weapons.shells.L31_120mm_HESH = 'weapons.shells.L31_120mm_HESH' +ENUMS.Storage.weapons.gunmounts.CH47_AFT_M60D = 'weapons.gunmounts.{CH47_AFT_M60D}' +ENUMS.Storage.weapons.shells._20mm_M53_API = 'weapons.shells.20mm_M53_API' +ENUMS.Storage.weapons.adapters.HB_F14_EXT_LAU7 = 'weapons.adapters.HB_F14_EXT_LAU-7' +ENUMS.Storage.weapons.shells.CHAP_76_PFHE = 'weapons.shells.CHAP_76_PFHE' +ENUMS.Storage.weapons.bombs.KAB_500KrOD = 'weapons.bombs.KAB_500KrOD' +ENUMS.Storage.weapons.adapters.PU_9S846_STRELEC = 'weapons.adapters.PU_9S846_STRELEC' +ENUMS.Storage.weapons.containers.EclairM_51 = 'weapons.containers.{EclairM_51}' +ENUMS.Storage.weapons.containers.HB_ORD_Pave_Spike = 'weapons.containers.HB_ORD_Pave_Spike' +ENUMS.Storage.weapons.shells.MINGR55_NO_TRC = 'weapons.shells.MINGR55_NO_TRC' +ENUMS.Storage.weapons.nurs.PG_9V = 'weapons.nurs.PG_9V' +ENUMS.Storage.weapons.gunmounts.M61A1 = 'weapons.gunmounts.M-61A1' +ENUMS.Storage.weapons.nurs.PG_16V = 'weapons.nurs.PG_16V' +ENUMS.Storage.weapons.shells.British303_G_Mk4 = 'weapons.shells.British303_G_Mk4' +ENUMS.Storage.weapons.missiles.SA5B55 = 'weapons.missiles.SA5B55' +ENUMS.Storage.weapons.adapters.b52_CSRL_ALCM = 'weapons.adapters.b-52_CSRL_ALCM' +ENUMS.Storage.weapons.adapters._9M114PILON = 'weapons.adapters.9M114-PILON' +ENUMS.Storage.weapons.shells._50Browning_APIT_M20_Corsair = 'weapons.shells.50Browning_APIT_M20_Corsair' +ENUMS.Storage.weapons.shells.PJ87_100_PFHE = 'weapons.shells.PJ87_100_PFHE' +ENUMS.Storage.weapons.bombs._2503 = 'weapons.bombs.250-3' +ENUMS.Storage.weapons.shells._2A42_30_AP = 'weapons.shells.2A42_30_AP' +ENUMS.Storage.weapons.shells._37mm_Type_100_JAP = 'weapons.shells.37mm_Type_100_JAP' +ENUMS.Storage.weapons.droptanks.oiltank = 'weapons.droptanks.oiltank' +ENUMS.Storage.weapons.droptanks.AV8BNA_AERO1D = 'weapons.droptanks.AV8BNA_AERO1D' +ENUMS.Storage.weapons.containers.smoke_pod = 'weapons.containers.smoke_pod' +ENUMS.Storage.weapons.missiles.AGM_12A = 'weapons.missiles.AGM_12A' +ENUMS.Storage.weapons.missiles.MICA_T = 'weapons.missiles.MICA_T' +ENUMS.Storage.weapons.droptanks._1100LTankEmpty = 'weapons.droptanks.1100L Tank Empty' +ENUMS.Storage.weapons.adapters.CHAP_Mi28N_igla = 'weapons.adapters.CHAP_Mi28N_igla' +ENUMS.Storage.weapons.bombs.GBU_15_V_1_B = 'weapons.bombs.GBU_15_V_1_B' +ENUMS.Storage.weapons.missiles.Rb24 = 'weapons.missiles.Rb 24' +ENUMS.Storage.weapons.missiles.RB75 = 'weapons.missiles.RB75' +ENUMS.Storage.weapons.shells.M2_12_7_T = 'weapons.shells.M2_12_7_T' +ENUMS.Storage.weapons.shells._2A42_30_HE = 'weapons.shells.2A42_30_HE' +ENUMS.Storage.weapons.containers.HVAR_rocket = 'weapons.containers.HVAR_rocket' +ENUMS.Storage.weapons.gunmounts.GIAT_M621_APHE = 'weapons.gunmounts.{GIAT_M621_APHE}' +ENUMS.Storage.weapons.nurs.SNEB_TYPE253_F1B = 'weapons.nurs.SNEB_TYPE253_F1B' +ENUMS.Storage.weapons.shells.M230_HEIM799 = 'weapons.shells.M230_HEI M799' +ENUMS.Storage.weapons.containers.HB_F14_EXT_BRU34 = 'weapons.containers.HB_F14_EXT_BRU34' +ENUMS.Storage.weapons.shells.Sprgr_34_L48 = 'weapons.shells.Sprgr_34_L48' +ENUMS.Storage.weapons.shells._7_62x39 = 'weapons.shells.7_62x39' +ENUMS.Storage.weapons.containers.LANTIRN = 'weapons.containers.LANTIRN' +ENUMS.Storage.weapons.shells.GSH23_23_HE = 'weapons.shells.GSH23_23_HE' +ENUMS.Storage.weapons.bombs.KAB_1500Kr = 'weapons.bombs.KAB_1500Kr' +ENUMS.Storage.weapons.bombs.British_MC_250LB_Bomb_Mk1 = 'weapons.bombs.British_MC_250LB_Bomb_Mk1' +ENUMS.Storage.weapons.gunmounts.ANM3 = 'weapons.gunmounts.{AN-M3}' +ENUMS.Storage.weapons.droptanks.Spitfire_tank_1 = 'weapons.droptanks.Spitfire_tank_1' +ENUMS.Storage.weapons.missiles.AGM_78B = 'weapons.missiles.AGM_78B' +ENUMS.Storage.weapons.adapters.hj12launchertube = 'weapons.adapters.hj12-launcher-tube' +ENUMS.Storage.weapons.shells.M242_25_HE_M792 = 'weapons.shells.M242_25_HE_M792' +ENUMS.Storage.weapons.shells.M46 = 'weapons.shells.M46' +ENUMS.Storage.weapons.droptanks.HB_F14_EXT_DROPTANK_EMPTY = 'weapons.droptanks.HB_F14_EXT_DROPTANK_EMPTY' +ENUMS.Storage.weapons.missiles.AIM_120 = 'weapons.missiles.AIM_120' +ENUMS.Storage.weapons.missiles.Rb15FforA_I__ = 'weapons.missiles.Rb 15F (for A.I.)' +ENUMS.Storage.weapons.gunmounts.NR23 = 'weapons.gunmounts.NR-23' +ENUMS.Storage.weapons.missiles.Vikhr_M = 'weapons.missiles.Vikhr_M' +ENUMS.Storage.weapons.bombs.Mk_83 = 'weapons.bombs.Mk_83' +ENUMS.Storage.weapons.adapters._9m114pilon = 'weapons.adapters.9m114-pilon' +ENUMS.Storage.weapons.bombs.RBK_500U_OAB_2_5RT = 'weapons.bombs.RBK_500U_OAB_2_5RT' +ENUMS.Storage.weapons.shells._50Browning_AP_M2_Corsair = 'weapons.shells.50Browning_AP_M2_Corsair' +ENUMS.Storage.weapons.shells.British303_G_Mk2 = 'weapons.shells.British303_G_Mk2' +ENUMS.Storage.weapons.gunmounts.UPK_23_25 = 'weapons.gunmounts.UPK_23_25' +ENUMS.Storage.weapons.shells.M242_25_AP_M919 = 'weapons.shells.M242_25_AP_M919' +ENUMS.Storage.weapons.bombs.Type_200A = 'weapons.bombs.Type_200A' +ENUMS.Storage.weapons.containers.SORBCIJA_L = 'weapons.containers.SORBCIJA_L' +ENUMS.Storage.weapons.shells.M322_120_AP = 'weapons.shells.M322_120_AP' +ENUMS.Storage.weapons.missiles.AGR_20A = 'weapons.missiles.AGR_20A' +ENUMS.Storage.weapons.missiles._9M723 = 'weapons.missiles.9M723' +ENUMS.Storage.weapons.bombs.BKF_AO2_5RT = 'weapons.bombs.BKF_AO2_5RT' +ENUMS.Storage.weapons.missiles.P_33E = 'weapons.missiles.P_33E' +ENUMS.Storage.weapons.adapters.b52mbd_m117 = 'weapons.adapters.b52-mbd_m117' +ENUMS.Storage.weapons.missiles.Ataka_9M120 = 'weapons.missiles.Ataka_9M120' +ENUMS.Storage.weapons.bombs.MK76 = 'weapons.bombs.MK76' +ENUMS.Storage.weapons.bombs.AB_250_2_SD_2 = 'weapons.bombs.AB_250_2_SD_2' +ENUMS.Storage.weapons.adapters.OH58D_HRACK_R = 'weapons.adapters.OH58D_HRACK_R' +ENUMS.Storage.weapons.missiles.AGM_78A = 'weapons.missiles.AGM_78A' +ENUMS.Storage.weapons.bombs.FAB_100SV = 'weapons.bombs.FAB_100SV' +ENUMS.Storage.weapons.adapters.F4E_dual_LAU7 = 'weapons.adapters.F4E_dual_LAU7' +ENUMS.Storage.weapons.shells.CHAP_76_HE_T = 'weapons.shells.CHAP_76_HE_T' +ENUMS.Storage.weapons.adapters.HB_F14_EXT_SPARROW_PYLON = 'weapons.adapters.HB_F14_EXT_SPARROW_PYLON' +ENUMS.Storage.weapons.missiles.P_27PE = 'weapons.missiles.P_27PE' +ENUMS.Storage.weapons.shells._2A38_30_HE = 'weapons.shells.2A38_30_HE' +ENUMS.Storage.weapons.nurs.WGr21 = 'weapons.nurs.WGr21' +ENUMS.Storage.weapons.droptanks.HB_F4E_EXT_WingTank_R_EMPTY = 'weapons.droptanks.HB_F-4E_EXT_WingTank_R_EMPTY' +ENUMS.Storage.weapons.shells.British303_G_Mk5 = 'weapons.shells.British303_G_Mk5' +ENUMS.Storage.weapons.gunmounts.SUU_23_POD = 'weapons.gunmounts.{SUU_23_POD}' +ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk1 = 'weapons.bombs.British_GP_250LB_Bomb_Mk1' +ENUMS.Storage.weapons.bombs.RBK_500U_BETAB_M = 'weapons.bombs.RBK_500U_BETAB_M' +ENUMS.Storage.weapons.gunmounts.SA342_M134_SIDE_R = 'weapons.gunmounts.{SA342_M134_SIDE_R}' +ENUMS.Storage.weapons.adapters.LAU_127 = 'weapons.adapters.LAU_127' +ENUMS.Storage.weapons.missiles.TGM_65D = 'weapons.missiles.TGM_65D' +ENUMS.Storage.weapons.shells.ZTZ_125_AP = 'weapons.shells.ZTZ_125_AP' +ENUMS.Storage.weapons.missiles.P_73 = 'weapons.missiles.P_73' +ENUMS.Storage.weapons.gunmounts.M134_R = 'weapons.gunmounts.M134_R' +ENUMS.Storage.weapons.shells.M39_20_TP = 'weapons.shells.M39_20_TP' +ENUMS.Storage.weapons.shells.GAU8_30_HE = 'weapons.shells.GAU8_30_HE' +ENUMS.Storage.weapons.bombs.GBU_12 = 'weapons.bombs.GBU_12' +ENUMS.Storage.weapons.bombs.SC_250_T3_J = 'weapons.bombs.SC_250_T3_J' +ENUMS.Storage.weapons.gunmounts.OH_58_BRAUNING = 'weapons.gunmounts.OH_58_BRAUNING' +ENUMS.Storage.weapons.shells.KDA_35_AP = 'weapons.shells.KDA_35_AP' +ENUMS.Storage.weapons.shells.CL3143_120_AP = 'weapons.shells.CL3143_120_AP' +ENUMS.Storage.weapons.shells.M61_20_TP_T = 'weapons.shells.M61_20_TP_T' +ENUMS.Storage.weapons.containers.ANAWW_13 = 'weapons.containers.ANAWW_13' +ENUMS.Storage.weapons.droptanks.droptank_108_gal = 'weapons.droptanks.droptank_108_gal' +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_BLUE = 'weapons.containers.{US_M10_SMOKE_TANK_BLUE}' +ENUMS.Storage.weapons.missiles.GAR8 = 'weapons.missiles.GAR-8' +ENUMS.Storage.weapons.missiles.ASM_N_2 = 'weapons.missiles.ASM_N_2' +ENUMS.Storage.weapons.bombs.BR_250 = 'weapons.bombs.BR_250' +ENUMS.Storage.weapons.containers.F18FLIRPOD = 'weapons.containers.F-18-FLIR-POD' +ENUMS.Storage.weapons.containers.EclairM_42 = 'weapons.containers.{EclairM_42}' +ENUMS.Storage.weapons.missiles.P_27P = 'weapons.missiles.P_27P' +ENUMS.Storage.weapons.bombs.British_SAP_500LB_Bomb_Mk5 = 'weapons.bombs.British_SAP_500LB_Bomb_Mk5' +ENUMS.Storage.weapons.shells.NR23_23x115_API = 'weapons.shells.NR23_23x115_API' +ENUMS.Storage.weapons.shells.KPVT_14_5 = 'weapons.shells.KPVT_14_5' +ENUMS.Storage.weapons.gunmounts.M60_SIDE_L = 'weapons.gunmounts.M60_SIDE_L' +ENUMS.Storage.weapons.nurs.S5M1_HEFRAG_FFAR = 'weapons.nurs.S5M1_HEFRAG_FFAR' +ENUMS.Storage.weapons.bombs.SAB_100_FLARE = 'weapons.bombs.SAB_100_FLARE' +ENUMS.Storage.weapons.adapters.HB_F4E_BRU42 = 'weapons.adapters.HB_F-4E_BRU-42' +ENUMS.Storage.weapons.containers.F15E_AAQ33_XR_ATPSE = 'weapons.containers.F-15E_AAQ-33_XR_ATP-SE' +ENUMS.Storage.weapons.adapters.MBD267 = 'weapons.adapters.MBD-2-67' +ENUMS.Storage.weapons.adapters.OH58D_SRACK_R = 'weapons.adapters.OH58D_SRACK_R' +ENUMS.Storage.weapons.adapters.UB16 = 'weapons.adapters.UB-16' +ENUMS.Storage.weapons.nurs.HYDRA_70_WTU1B = 'weapons.nurs.HYDRA_70_WTU1B' +ENUMS.Storage.weapons.shells.L14A2_30_APDS = 'weapons.shells.L14A2_30_APDS' +ENUMS.Storage.weapons.missiles.SVIR = 'weapons.missiles.SVIR' +ENUMS.Storage.weapons.adapters.APU170 = 'weapons.adapters.APU-170' +ENUMS.Storage.weapons.missiles.AIM9E = 'weapons.missiles.AIM-9E' +ENUMS.Storage.weapons.adapters.adapter_df4a = 'weapons.adapters.adapter_df4a' +ENUMS.Storage.weapons.missiles.Super_530F = 'weapons.missiles.Super_530F' +ENUMS.Storage.weapons.adapters.Rocket_Launcher_4_5inch = 'weapons.adapters.Rocket_Launcher_4_5inch' +ENUMS.Storage.weapons.adapters.JF17_PF12_twin = 'weapons.adapters.JF-17_PF12_twin' +ENUMS.Storage.weapons.adapters.CLB_30 = 'weapons.adapters.CLB_30' +ENUMS.Storage.weapons.gunmounts.KORD_12_7_MI24_R = 'weapons.gunmounts.KORD_12_7_MI24_R' +ENUMS.Storage.weapons.gunmounts.KORD_12_7_MI24_L = 'weapons.gunmounts.KORD_12_7_MI24_L' +ENUMS.Storage.weapons.adapters._9M120_pylon = 'weapons.adapters.9M120_pylon' +ENUMS.Storage.weapons.missiles.REFLEX = 'weapons.missiles.REFLEX' +ENUMS.Storage.weapons.adapters.oro57k_edm = 'weapons.adapters.oro-57k.edm' +ENUMS.Storage.weapons.bombs.GBU_31_V_2B = 'weapons.bombs.GBU_31_V_2B' +ENUMS.Storage.weapons.missiles.P_40T = 'weapons.missiles.P_40T' +ENUMS.Storage.weapons.adapters.suu25 = 'weapons.adapters.suu-25' +ENUMS.Storage.weapons.missiles.GB6 = 'weapons.missiles.GB-6' +ENUMS.Storage.weapons.missiles.DWS39_MJ1 = 'weapons.missiles.DWS39_MJ1' +ENUMS.Storage.weapons.bombs.FAB_250 = 'weapons.bombs.FAB_250' +ENUMS.Storage.weapons.bombs.SD_500_A = 'weapons.bombs.SD_500_A' +ENUMS.Storage.weapons.gunmounts.M60_SIDE_R = 'weapons.gunmounts.M60_SIDE_R' +ENUMS.Storage.weapons.shells.L21A1_30_HE = 'weapons.shells.L21A1_30_HE' +ENUMS.Storage.weapons.missiles.KD_63 = 'weapons.missiles.KD_63' +ENUMS.Storage.weapons.gunmounts.GAU_12_Equalizer_HE = 'weapons.gunmounts.{GAU_12_Equalizer_HE}' +ENUMS.Storage.weapons.bombs.ROCKEYE = 'weapons.bombs.ROCKEYE' +ENUMS.Storage.weapons.shells.GSh_30_2K_HE = 'weapons.shells.GSh_30_2K_HE' +ENUMS.Storage.weapons.adapters.LAU3 = 'weapons.adapters.LAU-3' +ENUMS.Storage.weapons.shells.M39_20_API = 'weapons.shells.M39_20_API' +ENUMS.Storage.weapons.nurs.HVAR = 'weapons.nurs.HVAR' +ENUMS.Storage.weapons.adapters.F15E_LAU117 = 'weapons.adapters.F-15E_LAU-117' +ENUMS.Storage.weapons.adapters.SA342_LAU_HOT3_2x = 'weapons.adapters.SA342_LAU_HOT3_2x' +ENUMS.Storage.weapons.droptanks.PTB800MIG21 = 'weapons.droptanks.PTB-800-MIG21' +ENUMS.Storage.weapons.missiles.AGM_114 = 'weapons.missiles.AGM_114' +ENUMS.Storage.weapons.shells._2A46M_125_AP = 'weapons.shells.2A46M_125_AP' +ENUMS.Storage.weapons.droptanks.MB339_TT320_L = 'weapons.droptanks.MB339_TT320_L' +ENUMS.Storage.weapons.shells.M61_20_HEIT_RED = 'weapons.shells.M61_20_HEIT_RED' +ENUMS.Storage.weapons.shells.KS19_100AP = 'weapons.shells.KS19_100AP' +ENUMS.Storage.weapons.containers.KINGAL = 'weapons.containers.KINGAL' +ENUMS.Storage.weapons.nurs.RS82 = 'weapons.nurs.RS-82' +ENUMS.Storage.weapons.missiles.HOT2 = 'weapons.missiles.HOT2' +ENUMS.Storage.weapons.adapters.Schloss_500XIIC = 'weapons.adapters.Schloss_500XIIC' +ENUMS.Storage.weapons.droptanks.fueltank450 = 'weapons.droptanks.fueltank450' +ENUMS.Storage.weapons.missiles.X_59M = 'weapons.missiles.X_59M' +ENUMS.Storage.weapons.droptanks.PTB450 = 'weapons.droptanks.PTB-450' +ENUMS.Storage.weapons.containers.SPS141 = 'weapons.containers.SPS-141' +ENUMS.Storage.weapons.adapters.mbd3 = 'weapons.adapters.mbd-3' +ENUMS.Storage.weapons.bombs.OFAB100120TU = 'weapons.bombs.OFAB-100-120TU' +ENUMS.Storage.weapons.shells._20mm_M56_HEI = 'weapons.shells.20mm_M56_HEI' +ENUMS.Storage.weapons.containers.HB_ALE_40_30_0 = 'weapons.containers.HB_ALE_40_30_0' +ENUMS.Storage.weapons.droptanks.HB_HIGH_PERFORMANCE_CENTERLINE_600_GAL = 'weapons.droptanks.HB_HIGH_PERFORMANCE_CENTERLINE_600_GAL' +ENUMS.Storage.weapons.shells.M61 = 'weapons.shells.M61' +ENUMS.Storage.weapons.missiles.PL12 = 'weapons.missiles.PL-12' +ENUMS.Storage.weapons.missiles.R3R = 'weapons.missiles.R-3R' +ENUMS.Storage.weapons.bombs.GBU_54_V_1B = 'weapons.bombs.GBU_54_V_1B' +ENUMS.Storage.weapons.droptanks.MB339_TT320_R = 'weapons.droptanks.MB339_TT320_R' +ENUMS.Storage.weapons.bombs.GBU_10 = 'weapons.bombs.GBU_10' +ENUMS.Storage.weapons.adapters.b52mbd_agm86 = 'weapons.adapters.b52-mbd_agm86' +ENUMS.Storage.weapons.adapters.Spitfire_pilon2R = 'weapons.adapters.Spitfire_pilon2R' +ENUMS.Storage.weapons.adapters.apu602_R = 'weapons.adapters.apu-60-2_R' +ENUMS.Storage.weapons.shells._50Browning_APIT_M20 = 'weapons.shells.50Browning_APIT_M20' +ENUMS.Storage.weapons.bombs.FAB_50 = 'weapons.bombs.FAB_50' +ENUMS.Storage.weapons.shells._2A46M_125_HE = 'weapons.shells.2A46M_125_HE' +ENUMS.Storage.weapons.containers.sa342_dipole_antenna = 'weapons.containers.sa342_dipole_antenna' +ENUMS.Storage.weapons.shells._50Browning_T_M1 = 'weapons.shells.50Browning_T_M1' +ENUMS.Storage.weapons.bombs.OFAB100Jupiter = 'weapons.bombs.OFAB-100 Jupiter' +ENUMS.Storage.weapons.adapters.MER5E = 'weapons.adapters.MER-5E' +ENUMS.Storage.weapons.shells.NR30_30x155_APT = 'weapons.shells.NR30_30x155_APT' +ENUMS.Storage.weapons.containers.ALQ184 = 'weapons.containers.ALQ-184' +ENUMS.Storage.weapons.missiles.AGM_45B = 'weapons.missiles.AGM_45B' +ENUMS.Storage.weapons.containers.SKY_SHADOW = 'weapons.containers.SKY_SHADOW' +ENUMS.Storage.weapons.gunmounts.FN_HMP400_200 = 'weapons.gunmounts.{FN_HMP400_200}' +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_GREEN = 'weapons.containers.{US_M10_SMOKE_TANK_GREEN}' +ENUMS.Storage.weapons.bombs.BLU3_GROUP = 'weapons.bombs.BLU-3_GROUP' +ENUMS.Storage.weapons.adapters.gdjiv1 = 'weapons.adapters.gdj-iv1' +ENUMS.Storage.weapons.missiles.SPIKE_ER = 'weapons.missiles.SPIKE_ER' +ENUMS.Storage.weapons.shells.AK630_30_AP = 'weapons.shells.AK630_30_AP' +ENUMS.Storage.weapons.missiles.AGM_65L = 'weapons.missiles.AGM_65L' +ENUMS.Storage.weapons.gunmounts.MG_151_20 = 'weapons.gunmounts.MG_151_20' +ENUMS.Storage.weapons.droptanks.PTB490MIG21 = 'weapons.droptanks.PTB-490-MIG21' +ENUMS.Storage.weapons.shells.MG_20x82_HEI_T = 'weapons.shells.MG_20x82_HEI_T' +ENUMS.Storage.weapons.adapters._143M2 = 'weapons.adapters.14-3-M2' +ENUMS.Storage.weapons.adapters.OH58D_Gorgona = 'weapons.adapters.OH-58D_Gorgona' +ENUMS.Storage.weapons.missiles.Rb_04 = 'weapons.missiles.Rb_04' +ENUMS.Storage.weapons.nurs.C_8CM_RD = 'weapons.nurs.C_8CM_RD' +ENUMS.Storage.weapons.missiles.AKD10 = 'weapons.missiles.AKD-10' +ENUMS.Storage.weapons.missiles.X_29L = 'weapons.missiles.X_29L' +ENUMS.Storage.weapons.containers.F14LANTIRNTP = 'weapons.containers.{F14-LANTIRN-TP}' +ENUMS.Storage.weapons.adapters.apu6 = 'weapons.adapters.apu-6' +ENUMS.Storage.weapons.bombs.AO_2_5RT = 'weapons.bombs.AO_2_5RT' +ENUMS.Storage.weapons.shells.L23_120_AP = 'weapons.shells.L23_120_AP' +ENUMS.Storage.weapons.missiles.AIM9L = 'weapons.missiles.AIM-9L' +ENUMS.Storage.weapons.containers.ALQ131 = 'weapons.containers.ALQ-131' +ENUMS.Storage.weapons.shells._25mm_AA_JAP = 'weapons.shells.25mm_AA_JAP' +ENUMS.Storage.weapons.nurs.C_8 = 'weapons.nurs.C_8' +ENUMS.Storage.weapons.missiles.YJ83 = 'weapons.missiles.YJ-83' +ENUMS.Storage.weapons.shells.MK_108_HEI = 'weapons.shells.MK_108_HEI' +ENUMS.Storage.weapons.droptanks.PTB400_MIG19 = 'weapons.droptanks.PTB400_MIG19' +ENUMS.Storage.weapons.adapters.BRU42_LS = 'weapons.adapters.BRU-42_LS' +ENUMS.Storage.weapons.adapters.M299_AGM114 = 'weapons.adapters.M299_AGM114' +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_ORANGE = 'weapons.containers.{US_M10_SMOKE_TANK_ORANGE}' +ENUMS.Storage.weapons.adapters.B1B_Conventional_Rotary_Launcher = 'weapons.adapters.B-1B_Conventional_Rotary_Launcher' +ENUMS.Storage.weapons.nurs.S_5M = 'weapons.nurs.S_5M' +ENUMS.Storage.weapons.shells.MG_13x64_I_T = 'weapons.shells.MG_13x64_I_T' +ENUMS.Storage.weapons.bombs.CBU_99 = 'weapons.bombs.CBU_99' +ENUMS.Storage.weapons.bombs.LUU_2B = 'weapons.bombs.LUU_2B' +ENUMS.Storage.weapons.containers.aaq28LEFTlitening = 'weapons.containers.aaq-28LEFT litening' +ENUMS.Storage.weapons.containers.F4PILON = 'weapons.containers.F4-PILON' +ENUMS.Storage.weapons.missiles.X_25MP = 'weapons.missiles.X_25MP' +ENUMS.Storage.weapons.nurs.SNEB_TYPE252_H1 = 'weapons.nurs.SNEB_TYPE252_H1' +ENUMS.Storage.weapons.adapters.LAU105 = 'weapons.adapters.LAU-105' +ENUMS.Storage.weapons.nurs.FFARMk1HE = 'weapons.nurs.FFAR Mk1 HE' +ENUMS.Storage.weapons.shells.M39_20_TP_T = 'weapons.shells.M39_20_TP_T' +ENUMS.Storage.weapons.containers.FAS = 'weapons.containers.FAS' +ENUMS.Storage.weapons.missiles.X_31P = 'weapons.missiles.X_31P' +ENUMS.Storage.weapons.missiles.R13M = 'weapons.missiles.R-13M' +ENUMS.Storage.weapons.missiles.AGM_154B = 'weapons.missiles.AGM_154B' +ENUMS.Storage.weapons.bombs.BAT120 = 'weapons.bombs.BAT-120' +ENUMS.Storage.weapons.shells.OF_350 = 'weapons.shells.OF_350' +ENUMS.Storage.weapons.adapters.BRU42_LS_LAU68 = 'weapons.adapters.BRU-42_LS_(LAU-68)' +ENUMS.Storage.weapons.shells.M134_7_62_T = 'weapons.shells.M134_7_62_T' +ENUMS.Storage.weapons.shells.DM33_120_AP = 'weapons.shells.DM33_120_AP' +ENUMS.Storage.weapons.shells.M256_120_HE_L55 = 'weapons.shells.M256_120_HE_L55' +ENUMS.Storage.weapons.shells.Hispano_Mk_II_Mk_Z_Ball = 'weapons.shells.Hispano_Mk_II_Mk_Z_Ball' +ENUMS.Storage.weapons.containers.aispodt50_r = 'weapons.containers.ais-pod-t50_r' +ENUMS.Storage.weapons.bombs.GBU_11 = 'weapons.bombs.GBU_11' +ENUMS.Storage.weapons.gunmounts.m3_browning = 'weapons.gunmounts.m3_browning' +ENUMS.Storage.weapons.containers.ah64d_radar = 'weapons.containers.ah-64d_radar' +ENUMS.Storage.weapons.shells.YakB_12_7 = 'weapons.shells.YakB_12_7' +ENUMS.Storage.weapons.nurs.HYDRA_70_M151 = 'weapons.nurs.HYDRA_70_M151' +ENUMS.Storage.weapons.droptanks.fueltank200 = 'weapons.droptanks.fueltank200' +ENUMS.Storage.weapons.adapters.ER4_Rack = 'weapons.adapters.ER4_Rack' +ENUMS.Storage.weapons.containers.HB_ALE_40_30_60 = 'weapons.containers.HB_ALE_40_30_60' +ENUMS.Storage.weapons.bombs.LS_6_100 = 'weapons.bombs.LS_6_100' +ENUMS.Storage.weapons.containers.SORBCIJA_R = 'weapons.containers.SORBCIJA_R' +ENUMS.Storage.weapons.missiles.R13M1 = 'weapons.missiles.R-13M1' +ENUMS.Storage.weapons.missiles.ALARM = 'weapons.missiles.ALARM' +ENUMS.Storage.weapons.gunmounts.AKAN_NO_TRC = 'weapons.gunmounts.{AKAN_NO_TRC}' +ENUMS.Storage.weapons.missiles.RS2US = 'weapons.missiles.RS2US' +ENUMS.Storage.weapons.shells.M230_30 = 'weapons.shells.M230_30' +ENUMS.Storage.weapons.bombs.BLG66_EG = 'weapons.bombs.BLG66_EG' +ENUMS.Storage.weapons.bombs.FAB_500 = 'weapons.bombs.FAB_500' +ENUMS.Storage.weapons.adapters.lau118a = 'weapons.adapters.lau-118a' +ENUMS.Storage.weapons.missiles.BGM_109B = 'weapons.missiles.BGM_109B' +ENUMS.Storage.weapons.missiles.LD10 = 'weapons.missiles.LD-10' +ENUMS.Storage.weapons.shells._120_EXPL_F1_120mm_HE = 'weapons.shells.120_EXPL_F1_120mm_HE' +ENUMS.Storage.weapons.missiles.ROLAND_R = 'weapons.missiles.ROLAND_R' +ENUMS.Storage.weapons.droptanks.PTB300_MIG15 = 'weapons.droptanks.PTB300_MIG15' +ENUMS.Storage.weapons.missiles.SPIKE_ERA = 'weapons.missiles.SPIKE_ERA' +ENUMS.Storage.weapons.adapters.b52_suu67 = 'weapons.adapters.b-52_suu67' +ENUMS.Storage.weapons.shells.VOG17 = 'weapons.shells.VOG17' +ENUMS.Storage.weapons.adapters.JF17_GDJII19L = 'weapons.adapters.JF-17_GDJ-II19L' +ENUMS.Storage.weapons.containers.F4U1D_SMOKE_WHITE = 'weapons.containers.{F4U1D_SMOKE_WHITE}' +ENUMS.Storage.weapons.shells.GSh_30_2K_AP = 'weapons.shells.GSh_30_2K_AP' +ENUMS.Storage.weapons.shells.M61_20_PGU30 = 'weapons.shells.M61_20_PGU30' +ENUMS.Storage.weapons.nurs.HYDRA_70_M274 = 'weapons.nurs.HYDRA_70_M274' +ENUMS.Storage.weapons.bombs.Mk_84 = 'weapons.bombs.Mk_84' +ENUMS.Storage.weapons.bombs.BDU_50LD = 'weapons.bombs.BDU_50LD' +ENUMS.Storage.weapons.gunmounts.A20_TopTurret_M2_R = 'weapons.gunmounts.A20_TopTurret_M2_R' +ENUMS.Storage.weapons.gunmounts.MG_131 = 'weapons.gunmounts.MG_131' +ENUMS.Storage.weapons.adapters.AUF2_RACK = 'weapons.adapters.AUF2_RACK' +ENUMS.Storage.weapons.missiles.Mistral = 'weapons.missiles.Mistral' +ENUMS.Storage.weapons.bombs.LUU_2BB = 'weapons.bombs.LUU_2BB' +ENUMS.Storage.weapons.adapters.JF17_GDJII19R = 'weapons.adapters.JF-17_GDJ-II19R' +ENUMS.Storage.weapons.shells.PGU32_SAPHEI_T = 'weapons.shells.PGU32_SAPHEI_T' +ENUMS.Storage.weapons.adapters.F15E_LAU88 = 'weapons.adapters.F-15E_LAU-88' +ENUMS.Storage.weapons.missiles.AGM_154 = 'weapons.missiles.AGM_154' +ENUMS.Storage.weapons.gunmounts.A20_TopTurret_M2_L = 'weapons.gunmounts.A20_TopTurret_M2_L' +ENUMS.Storage.weapons.missiles.TOW2 = 'weapons.missiles.TOW2' +ENUMS.Storage.weapons.shells.British303_B_Mk6z = 'weapons.shells.British303_B_Mk6z' +ENUMS.Storage.weapons.bombs.P50T = 'weapons.bombs.P-50T' +ENUMS.Storage.weapons.shells._5_56x45_NOtr = 'weapons.shells.5_56x45_NOtr' +ENUMS.Storage.weapons.missiles.SA9M333 = 'weapons.missiles.SA9M333' +ENUMS.Storage.weapons.nurs.HYDRA_70_M259 = 'weapons.nurs.HYDRA_70_M259' +ENUMS.Storage.weapons.shells._50Browning_API_M8 = 'weapons.shells.50Browning_API_M8' +ENUMS.Storage.weapons.missiles.AGM_84E = 'weapons.missiles.AGM_84E' +ENUMS.Storage.weapons.droptanks.FuelTank_350L = 'weapons.droptanks.FuelTank_350L' +ENUMS.Storage.weapons.adapters._9k121 = 'weapons.adapters.9k121' +ENUMS.Storage.weapons.missiles.KD_63B = 'weapons.missiles.KD_63B' +ENUMS.Storage.weapons.droptanks.FuelTank_150L = 'weapons.droptanks.FuelTank_150L' +ENUMS.Storage.weapons.shells._5_45x39 = 'weapons.shells.5_45x39' +ENUMS.Storage.weapons.missiles.AIM_54C_Mk60 = 'weapons.missiles.AIM_54C_Mk60' +ENUMS.Storage.weapons.missiles.CATM_9M = 'weapons.missiles.CATM_9M' +ENUMS.Storage.weapons.droptanks.Drop_Tank_300_Liter = 'weapons.droptanks.Drop_Tank_300_Liter' +ENUMS.Storage.weapons.gunmounts.GUV_VOG = 'weapons.gunmounts.GUV_VOG' +ENUMS.Storage.weapons.bombs.Mk_83AIR = 'weapons.bombs.Mk_83AIR' +ENUMS.Storage.weapons.adapters.MAK79_VAR_4 = 'weapons.adapters.MAK-79_VAR_4' +ENUMS.Storage.weapons.shells.M39_20_HEI_T = 'weapons.shells.M39_20_HEI_T' +ENUMS.Storage.weapons.bombs.Mk_84AIR_TP = 'weapons.bombs.Mk_84AIR_TP' +ENUMS.Storage.weapons.bombs.GBU_31_V_3B = 'weapons.bombs.GBU_31_V_3B' +ENUMS.Storage.weapons.shells.CHAP_125_3BM69_APFSDS_T = 'weapons.shells.CHAP_125_3BM69_APFSDS_T' +ENUMS.Storage.weapons.adapters.BRU_42A = 'weapons.adapters.BRU_42A' +ENUMS.Storage.weapons.missiles.TGM_65H = 'weapons.missiles.TGM_65H' +ENUMS.Storage.weapons.bombs.GBU_27 = 'weapons.bombs.GBU_27' +ENUMS.Storage.weapons.adapters.APU1240 = 'weapons.adapters.APU-12-40' +ENUMS.Storage.weapons.droptanks.F4U1D_Drop_Tank_Aux = 'weapons.droptanks.F4U-1D_Drop_Tank_Aux' +ENUMS.Storage.weapons.shells.DM12_L55_120mm_HEAT_MP_T = 'weapons.shells.DM12_L55_120mm_HEAT_MP_T' +ENUMS.Storage.weapons.shells.British303_O_Mk1 = 'weapons.shells.British303_O_Mk1' +ENUMS.Storage.weapons.missiles.HBAIM7E2 = 'weapons.missiles.HB-AIM-7E-2' +ENUMS.Storage.weapons.containers.Spear = 'weapons.containers.Spear' +ENUMS.Storage.weapons.bombs.BetAB_500 = 'weapons.bombs.BetAB_500' +ENUMS.Storage.weapons.adapters.HB_F14_EXT_BRU34 = 'weapons.adapters.HB_F14_EXT_BRU34' +ENUMS.Storage.weapons.missiles.Rb24J = 'weapons.missiles.Rb 24J' +ENUMS.Storage.weapons.shells.M256_120_AP = 'weapons.shells.M256_120_AP' +ENUMS.Storage.weapons.bombs.SAMP250HD = 'weapons.bombs.SAMP250HD' +ENUMS.Storage.weapons.containers.alq184long = 'weapons.containers.alq-184long' +ENUMS.Storage.weapons.shells.UOF412_100HE = 'weapons.shells.UOF412_100HE' +ENUMS.Storage.weapons.bombs.Mk_83CT = 'weapons.bombs.Mk_83CT' +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_YELLOW = 'weapons.nurs.SNEB_TYPE254_F1B_YELLOW' +ENUMS.Storage.weapons.missiles.AT_6 = 'weapons.missiles.AT_6' +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_GREEN = 'weapons.nurs.SNEB_TYPE254_H1_GREEN' +ENUMS.Storage.weapons.gunmounts.HispanoMkII = 'weapons.gunmounts.HispanoMkII' +ENUMS.Storage.weapons.missiles.C_701IR = 'weapons.missiles.C_701IR' +ENUMS.Storage.weapons.missiles.P_9M133 = 'weapons.missiles.P_9M133' +ENUMS.Storage.weapons.containers.HB_ALE_40_0_0 = 'weapons.containers.HB_ALE_40_0_0' +ENUMS.Storage.weapons.missiles.KONKURS = 'weapons.missiles.KONKURS' +ENUMS.Storage.weapons.bombs.HB_F4E_GBU15V1 = 'weapons.bombs.HB_F4E_GBU15V1' +ENUMS.Storage.weapons.bombs.SC_50 = 'weapons.bombs.SC_50' +ENUMS.Storage.weapons.bombs.AN_M66 = 'weapons.bombs.AN_M66' +ENUMS.Storage.weapons.adapters.UB32 = 'weapons.adapters.UB-32' +ENUMS.Storage.weapons.adapters.HB_ORD_LAU88 = 'weapons.adapters.HB_ORD_LAU-88' +ENUMS.Storage.weapons.bombs.RBK_250 = 'weapons.bombs.RBK_250' +ENUMS.Storage.weapons.shells._6_5mm_Type_91_JAP = 'weapons.shells.6_5mm_Type_91_JAP' +ENUMS.Storage.weapons.gunmounts.ADEN_GUNPOD = 'weapons.gunmounts.{ADEN_GUNPOD}' +ENUMS.Storage.weapons.bombs.MK106 = 'weapons.bombs.MK106' +ENUMS.Storage.weapons.bombs.RBK_250S = 'weapons.bombs.RBK_250S' +ENUMS.Storage.weapons.shells.M61_20_PGU28 = 'weapons.shells.M61_20_PGU28' +ENUMS.Storage.weapons.gunmounts.OH58D_M3P = 'weapons.gunmounts.OH58D_M3P' +ENUMS.Storage.weapons.containers.EclairM_15 = 'weapons.containers.{EclairM_15}' +ENUMS.Storage.weapons.containers.EclairM_33 = 'weapons.containers.{EclairM_33}' +ENUMS.Storage.weapons.shells.NR30_30x155_APHE = 'weapons.shells.NR30_30x155_APHE' +ENUMS.Storage.weapons.gunmounts.GAU_12_Equalizer = 'weapons.gunmounts.{GAU_12_Equalizer}' +ENUMS.Storage.weapons.bombs.IAB500 = 'weapons.bombs.IAB-500' +ENUMS.Storage.weapons.bombs.OH58D_Green_Smoke_Grenade = 'weapons.bombs.OH58D_Green_Smoke_Grenade' +ENUMS.Storage.weapons.adapters.ptab2_5ko_block1 = 'weapons.adapters.ptab-2_5ko_block1' +ENUMS.Storage.weapons.shells._7_7mm_Type_97_JAP = 'weapons.shells.7_7mm_Type_97_JAP' +ENUMS.Storage.weapons.missiles.R_530F_IR = 'weapons.missiles.R_530F_IR' +ENUMS.Storage.weapons.bombs.FAB250M54 = 'weapons.bombs.FAB-250M54' +ENUMS.Storage.weapons.missiles.RIM_116A = 'weapons.missiles.RIM_116A' +ENUMS.Storage.weapons.shells.PINK_PROJECTILE = 'weapons.shells.PINK_PROJECTILE' +ENUMS.Storage.weapons.shells.CHAP_76_HESH_T = 'weapons.shells.CHAP_76_HESH_T' +ENUMS.Storage.weapons.bombs.CBU_103 = 'weapons.bombs.CBU_103' +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_RED = 'weapons.containers.{US_M10_SMOKE_TANK_RED}' +ENUMS.Storage.weapons.missiles.Sea_Eagle = 'weapons.missiles.Sea_Eagle' +ENUMS.Storage.weapons.shells.PKT_7_62 = 'weapons.shells.PKT_7_62' +ENUMS.Storage.weapons.missiles.PL5EII = 'weapons.missiles.PL-5EII' +ENUMS.Storage.weapons.bombs.GBU_16 = 'weapons.bombs.GBU_16' +ENUMS.Storage.weapons.shells.OFL_120F2_AP = 'weapons.shells.OFL_120F2_AP' +ENUMS.Storage.weapons.missiles.AIM_54A_Mk60 = 'weapons.missiles.AIM_54A_Mk60' +ENUMS.Storage.weapons.bombs.CBU_97 = 'weapons.bombs.CBU_97' +ENUMS.Storage.weapons.adapters.XM158 = 'weapons.adapters.XM158' +ENUMS.Storage.weapons.containers.M2KC_AGF = 'weapons.containers.{M2KC_AGF}' +ENUMS.Storage.weapons.adapters.CBLS200 = 'weapons.adapters.CBLS-200' +ENUMS.Storage.weapons.containers.SPRD99 = 'weapons.containers.SPRD-99' +ENUMS.Storage.weapons.missiles.DWS39_MJ1_MJ2 = 'weapons.missiles.DWS39_MJ1_MJ2' +ENUMS.Storage.weapons.bombs.BDU_33 = 'weapons.bombs.BDU_33' +ENUMS.Storage.weapons.missiles.TOW = 'weapons.missiles.TOW' +ENUMS.Storage.weapons.gunmounts.OH58D_M3P_L400 = 'weapons.gunmounts.OH58D_M3P_L400' +ENUMS.Storage.weapons.bombs.KAB_1500LG = 'weapons.bombs.KAB_1500LG' +ENUMS.Storage.weapons.shells.MK45_127mm_AP_Essex = 'weapons.shells.MK45_127mm_AP_Essex' +ENUMS.Storage.weapons.shells.M61_20_HE_gr = 'weapons.shells.M61_20_HE_gr' +ENUMS.Storage.weapons.missiles.BRM1_90MM = 'weapons.missiles.BRM-1_90MM' +ENUMS.Storage.weapons.missiles.Ataka_9M120F = 'weapons.missiles.Ataka_9M120F' +ENUMS.Storage.weapons.adapters.lau88 = 'weapons.adapters.lau-88' +ENUMS.Storage.weapons.missiles.Sea_Wolf = 'weapons.missiles.Sea_Wolf' +ENUMS.Storage.weapons.shells.M61_20_PGU27 = 'weapons.shells.M61_20_PGU27' +ENUMS.Storage.weapons.missiles.CM400AKG = 'weapons.missiles.CM-400AKG' +ENUMS.Storage.weapons.containers.F15E_AAQ14_LANTIRN = 'weapons.containers.F-15E_AAQ-14_LANTIRN' +ENUMS.Storage.weapons.containers.wmd7 = 'weapons.containers.wmd7' +ENUMS.Storage.weapons.missiles.AIM7E2 = 'weapons.missiles.AIM-7E-2' +ENUMS.Storage.weapons.shells.Utes_12_7x108 = 'weapons.shells.Utes_12_7x108' +ENUMS.Storage.weapons.containers.HB_ORD_Pave_Spike_Fast = 'weapons.containers.HB_ORD_Pave_Spike_Fast' +ENUMS.Storage.weapons.adapters.MAK79_VAR_2 = 'weapons.adapters.MAK-79_VAR_2' +ENUMS.Storage.weapons.missiles.AGM_65D = 'weapons.missiles.AGM_65D' +ENUMS.Storage.weapons.missiles.AGM_86 = 'weapons.missiles.AGM_86' +ENUMS.Storage.weapons.shells.British303_G_Mk3 = 'weapons.shells.British303_G_Mk3' +ENUMS.Storage.weapons.shells.M61_20_AP_gr = 'weapons.shells.M61_20_AP_gr' +ENUMS.Storage.weapons.adapters.UB_32A_24 = 'weapons.adapters.UB_32A_24' +ENUMS.Storage.weapons.containers.F15E_AAQ28_LITENING = 'weapons.containers.F-15E_AAQ-28_LITENING' +ENUMS.Storage.weapons.bombs.OH58D_Blue_Smoke_Grenade = 'weapons.bombs.OH58D_Blue_Smoke_Grenade' +ENUMS.Storage.weapons.bombs.KAB_500Kr = 'weapons.bombs.KAB_500Kr' +ENUMS.Storage.weapons.containers.SPS141100 = 'weapons.containers.SPS-141-100' +ENUMS.Storage.weapons.missiles.AIM9JULI = 'weapons.missiles.AIM-9JULI' +ENUMS.Storage.weapons.droptanks.MB339_TT500_R = 'weapons.droptanks.MB339_TT500_R' +ENUMS.Storage.weapons.adapters.towpilon = 'weapons.adapters.tow-pilon' +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_YELLOW = 'weapons.nurs.SNEB_TYPE254_H1_YELLOW' +ENUMS.Storage.weapons.missiles.M30 = 'weapons.missiles.M30' +ENUMS.Storage.weapons.bombs.Durandal = 'weapons.bombs.Durandal' +ENUMS.Storage.weapons.adapters.apu7 = 'weapons.adapters.apu-7' +ENUMS.Storage.weapons.nurs.C_8CM_VT = 'weapons.nurs.C_8CM_VT' +ENUMS.Storage.weapons.containers.aispodt50 = 'weapons.containers.ais-pod-t50' +ENUMS.Storage.weapons.shells.M485_155_IL = 'weapons.shells.M485_155_IL' +ENUMS.Storage.weapons.bombs.RN24 = 'weapons.bombs.RN-24' +ENUMS.Storage.weapons.shells._2A64_152 = 'weapons.shells.2A64_152' +ENUMS.Storage.weapons.containers._ = 'weapons.containers.' +ENUMS.Storage.weapons.shells.M61_20_HE = 'weapons.shells.M61_20_HE' +ENUMS.Storage.weapons.gunmounts.CPG_M4 = 'weapons.gunmounts.CPG_M4' +ENUMS.Storage.weapons.shells._57mm_Type_90_JAP = 'weapons.shells.57mm_Type_90_JAP' +ENUMS.Storage.weapons.missiles.ADM_141A = 'weapons.missiles.ADM_141A' +ENUMS.Storage.weapons.containers.KBpod = 'weapons.containers.KBpod' +ENUMS.Storage.weapons.shells.DEFA554_30_HE_TRACERS = 'weapons.shells.DEFA554_30_HE_TRACERS' +ENUMS.Storage.weapons.missiles.SA_IRIS_T_SL = 'weapons.missiles.SA_IRIS_T_SL' +ENUMS.Storage.weapons.missiles.R55 = 'weapons.missiles.R-55' +ENUMS.Storage.weapons.adapters.BRU42_HS = 'weapons.adapters.BRU-42_HS' +ENUMS.Storage.weapons.shells.Hispano_Mk_II_MKIIZ_AP = 'weapons.shells.Hispano_Mk_II_MKIIZ_AP' +ENUMS.Storage.weapons.missiles.SA2V755 = 'weapons.missiles.SA2V755' +ENUMS.Storage.weapons.missiles.PL8B = 'weapons.missiles.PL-8B' +ENUMS.Storage.weapons.droptanks.Mosquito_Drop_Tank_100gal = 'weapons.droptanks.Mosquito_Drop_Tank_100gal' +ENUMS.Storage.weapons.shells.MG_13x64_HE = 'weapons.shells.MG_13x64_HE' +ENUMS.Storage.weapons.shells.Hispano_Mk_II_Tracer_G = 'weapons.shells.Hispano_Mk_II_Tracer_G' +ENUMS.Storage.weapons.nurs.SNEB_TYPE253_H1 = 'weapons.nurs.SNEB_TYPE253_H1' +ENUMS.Storage.weapons.nurs.ARAKM70BAPPX = 'weapons.nurs.ARAKM70BAPPX' +ENUMS.Storage.weapons.adapters.TER9A = 'weapons.adapters.TER-9A' +ENUMS.Storage.weapons.missiles._9M317 = 'weapons.missiles.9M317' +ENUMS.Storage.weapons.adapters.LAU115C = 'weapons.adapters.LAU-115C' +ENUMS.Storage.weapons.gunmounts.M134_L = 'weapons.gunmounts.M134_L' +ENUMS.Storage.weapons.shells._20mm_M220_Tracer = 'weapons.shells.20mm_M220_Tracer' +ENUMS.Storage.weapons.containers.EclairM_06 = 'weapons.containers.{EclairM_06}' +ENUMS.Storage.weapons.bombs.RBK_500AO = 'weapons.bombs.RBK_500AO' +ENUMS.Storage.weapons.shells.Bofors_40mm_Essex = 'weapons.shells.Bofors_40mm_Essex' +ENUMS.Storage.weapons.containers.MB339_Vinten = 'weapons.containers.MB339_Vinten' +ENUMS.Storage.weapons.nurs.ARAKM70BHE = 'weapons.nurs.ARAKM70BHE' +ENUMS.Storage.weapons.bombs.FAB250M62 = 'weapons.bombs.FAB-250-M62' +ENUMS.Storage.weapons.missiles.Rb04E = 'weapons.missiles.Rb 04E' +ENUMS.Storage.weapons.droptanks.PTB400_MIG15 = 'weapons.droptanks.PTB400_MIG15' +ENUMS.Storage.weapons.bombs.PTAB_2_5KO = 'weapons.bombs.PTAB_2_5KO' +ENUMS.Storage.weapons.adapters.M2000C_LRF4_edm = 'weapons.adapters.M-2000C_LRF4.edm' +ENUMS.Storage.weapons.missiles.AIM_9X = 'weapons.missiles.AIM_9X' +ENUMS.Storage.weapons.shells.MG_13x64_I = 'weapons.shells.MG_13x64_I' +ENUMS.Storage.weapons.bombs.GBU_8_B = 'weapons.bombs.GBU_8_B' +ENUMS.Storage.weapons.missiles.SA9M31 = 'weapons.missiles.SA9M31' +ENUMS.Storage.weapons.containers.rightSeat = 'weapons.containers.rightSeat' +ENUMS.Storage.weapons.shells.Pzgr_3940 = 'weapons.shells.Pzgr_39/40' +ENUMS.Storage.weapons.shells._2A60_120 = 'weapons.shells.2A60_120' +ENUMS.Storage.weapons.bombs.GBU_17 = 'weapons.bombs.GBU_17' +ENUMS.Storage.weapons.missiles.HHQ9 = 'weapons.missiles.HHQ-9' +ENUMS.Storage.weapons.bombs.Mk_84AIR_GP = 'weapons.bombs.Mk_84AIR_GP' +ENUMS.Storage.weapons.bombs.RBK_250_275_AO_1SCH = 'weapons.bombs.RBK_250_275_AO_1SCH' +ENUMS.Storage.weapons.missiles.AIM7E = 'weapons.missiles.AIM-7E' +ENUMS.Storage.weapons.missiles.AGR_20_M282 = 'weapons.missiles.AGR_20_M282' +ENUMS.Storage.weapons.droptanks.MB339_FT330 = 'weapons.droptanks.MB339_FT330' +ENUMS.Storage.weapons.shells.MK_108_MGsch_T = 'weapons.shells.MK_108_MGsch_T' +ENUMS.Storage.weapons.missiles.GB6HE = 'weapons.missiles.GB-6-HE' +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_RED = 'weapons.nurs.SNEB_TYPE254_H1_RED' +ENUMS.Storage.weapons.shells.HP30_30_HE = 'weapons.shells.HP30_30_HE' +ENUMS.Storage.weapons.bombs.RN28 = 'weapons.bombs.RN-28' +ENUMS.Storage.weapons.shells.L31A7_HESH = 'weapons.shells.L31A7_HESH' +ENUMS.Storage.weapons.shells.GSH301_30_AP = 'weapons.shells.GSH301_30_AP' +ENUMS.Storage.weapons.bombs.RBK_500U = 'weapons.bombs.RBK_500U' +ENUMS.Storage.weapons.droptanks.HB_F4E_EXT_Center_Fuel_Tank = 'weapons.droptanks.HB_F-4E_EXT_Center_Fuel_Tank' +ENUMS.Storage.weapons.containers.F15E_AAQ13_LANTIRN = 'weapons.containers.F-15E_AAQ-13_LANTIRN' +ENUMS.Storage.weapons.droptanks._800LTankEmpty = 'weapons.droptanks.800L Tank Empty' +ENUMS.Storage.weapons.missiles.MIM_104 = 'weapons.missiles.MIM_104' +ENUMS.Storage.weapons.shells.MG_13x64_API = 'weapons.shells.MG_13x64_API' +ENUMS.Storage.weapons.shells.M61_20_TP = 'weapons.shells.M61_20_TP' +ENUMS.Storage.weapons.bombs.LUU_19 = 'weapons.bombs.LUU_19' +ENUMS.Storage.weapons.shells.M55A2_TP_RED = 'weapons.shells.M55A2_TP_RED' +ENUMS.Storage.weapons.adapters.su27twinpylon = 'weapons.adapters.su-27-twinpylon' +ENUMS.Storage.weapons.nurs.M26HE = 'weapons.nurs.M26HE' +ENUMS.Storage.weapons.bombs.BLU4B_GROUP = 'weapons.bombs.BLU-4B_GROUP' +ENUMS.Storage.weapons.nurs.HYDRA_70_M156 = 'weapons.nurs.HYDRA_70_M156' +ENUMS.Storage.weapons.shells.DM23_105_AP = 'weapons.shells.DM23_105_AP' +ENUMS.Storage.weapons.missiles.SM_1 = 'weapons.missiles.SM_1' +ENUMS.Storage.weapons.missiles.OH58D_FIM_92 = 'weapons.missiles.OH58D_FIM_92' +ENUMS.Storage.weapons.containers.F18LDTPOD = 'weapons.containers.F-18-LDT-POD' +ENUMS.Storage.weapons.missiles.AGM_65K = 'weapons.missiles.AGM_65K' +ENUMS.Storage.weapons.shells.Bofors_40mm_HE = 'weapons.shells.Bofors_40mm_HE' +ENUMS.Storage.weapons.missiles.HAWK_RAKETA = 'weapons.missiles.HAWK_RAKETA' +ENUMS.Storage.weapons.shells._7_62x54 = 'weapons.shells.7_62x54' +ENUMS.Storage.weapons.shells.DM12_120mm_HEAT_MP_T = 'weapons.shells.DM12_120mm_HEAT_MP_T' +ENUMS.Storage.weapons.bombs.AN_M64 = 'weapons.bombs.AN_M64' +ENUMS.Storage.weapons.containers.rearCargoSeats = 'weapons.containers.rearCargoSeats' +ENUMS.Storage.weapons.bombs.AN_M65 = 'weapons.bombs.AN_M65' +ENUMS.Storage.weapons.missiles.Rb74 = 'weapons.missiles.Rb 74' +ENUMS.Storage.weapons.shells.DEFA553_30AP = 'weapons.shells.DEFA553_30AP' +ENUMS.Storage.weapons.nurs.S5M = 'weapons.nurs.S-5M' +ENUMS.Storage.weapons.gunmounts.M134_SIDE_R = 'weapons.gunmounts.M134_SIDE_R' +ENUMS.Storage.weapons.missiles.HJ12 = 'weapons.missiles.HJ-12' +ENUMS.Storage.weapons.shells.PLZ_155_HE = 'weapons.shells.PLZ_155_HE' +ENUMS.Storage.weapons.adapters.BRU_33A = 'weapons.adapters.BRU_33A' +ENUMS.Storage.weapons.nurs.ARAKM70BAP = 'weapons.nurs.ARAKM70BAP' +ENUMS.Storage.weapons.missiles.MMagicII = 'weapons.missiles.MMagicII' +ENUMS.Storage.weapons.nurs.HYDRA_70_M282 = 'weapons.nurs.HYDRA_70_M282' +ENUMS.Storage.weapons.nurs.ARF8M3HEI = 'weapons.nurs.ARF8M3HEI' +ENUMS.Storage.weapons.shells._76mm_AA_JAP = 'weapons.shells.76mm_AA_JAP' +ENUMS.Storage.weapons.missiles.Igla_1E = 'weapons.missiles.Igla_1E' +ENUMS.Storage.weapons.nurs.SMERCH_9M55K = 'weapons.nurs.SMERCH_9M55K' +ENUMS.Storage.weapons.nurs.C_24 = 'weapons.nurs.C_24' +ENUMS.Storage.weapons.shells.GSH301_30_HE = 'weapons.shells.GSH301_30_HE' +ENUMS.Storage.weapons.nurs.SNEB_TYPE256_H1 = 'weapons.nurs.SNEB_TYPE256_H1' +ENUMS.Storage.weapons.adapters.T45_PMBR = 'weapons.adapters.T45_PMBR' +ENUMS.Storage.weapons.containers.EclairM_24 = 'weapons.containers.{EclairM_24}' +ENUMS.Storage.weapons.droptanks.MB339_TT500_L = 'weapons.droptanks.MB339_TT500_L' +ENUMS.Storage.weapons.bombs.BKF_PTAB2_5KO = 'weapons.bombs.BKF_PTAB2_5KO' +ENUMS.Storage.weapons.shells.Br303 = 'weapons.shells.Br303' +ENUMS.Storage.weapons.shells.DANA_152 = 'weapons.shells.DANA_152' +ENUMS.Storage.weapons.nurs.S5MO_HEFRAG_FFAR = 'weapons.nurs.S5MO_HEFRAG_FFAR' +ENUMS.Storage.weapons.missiles.AIM9P3 = 'weapons.missiles.AIM-9P3' +ENUMS.Storage.weapons.gunmounts.GAU_12 = 'weapons.gunmounts.GAU_12' +ENUMS.Storage.weapons.shells.MK45_127 = 'weapons.shells.MK45_127' +ENUMS.Storage.weapons.nurs.C_8CM_GN = 'weapons.nurs.C_8CM_GN' +ENUMS.Storage.weapons.nurs.C_13 = 'weapons.nurs.C_13' +ENUMS.Storage.weapons.gunmounts.OH58D_M3P_L300 = 'weapons.gunmounts.OH58D_M3P_L300' +ENUMS.Storage.weapons.missiles.AGM_65A = 'weapons.missiles.AGM_65A' +ENUMS.Storage.weapons.containers.AV8BNA_ALQ164 = 'weapons.containers.AV8BNA_ALQ164' +ENUMS.Storage.weapons.bombs.OH58D_Red_Smoke_Grenade = 'weapons.bombs.OH58D_Red_Smoke_Grenade' +ENUMS.Storage.weapons.bombs.FAB_1500 = 'weapons.bombs.FAB_1500' +ENUMS.Storage.weapons.shells.M230_TPM788 = 'weapons.shells.M230_TP M788' +ENUMS.Storage.weapons.containers.leftSeat = 'weapons.containers.leftSeat' +ENUMS.Storage.weapons.missiles.Kormoran = 'weapons.missiles.Kormoran' +ENUMS.Storage.weapons.adapters.boz100 = 'weapons.adapters.boz-100' +ENUMS.Storage.weapons.nurs.HYDRA_70_MK1 = 'weapons.nurs.HYDRA_70_MK1' +ENUMS.Storage.weapons.shells.Utes_12_7x108_T = 'weapons.shells.Utes_12_7x108_T' +ENUMS.Storage.weapons.missiles.AGM_154A = 'weapons.missiles.AGM_154A' +ENUMS.Storage.weapons.adapters.MBD3LAU68 = 'weapons.adapters.MBD-3-LAU-68' +ENUMS.Storage.weapons.nurs.C_8CM_WH = 'weapons.nurs.C_8CM_WH' +ENUMS.Storage.weapons.missiles.MatraSuper530D = 'weapons.missiles.Matra Super 530D' +ENUMS.Storage.weapons.bombs.BDU_50HD = 'weapons.bombs.BDU_50HD' +ENUMS.Storage.weapons.adapters.M2000c_BAP_Rack = 'weapons.adapters.M-2000c_BAP_Rack' +ENUMS.Storage.weapons.shells._7_92x57sS = 'weapons.shells.7_92x57sS' +ENUMS.Storage.weapons.shells.M20_50_aero_APIT = 'weapons.shells.M20_50_aero_APIT' +ENUMS.Storage.weapons.bombs.KAB_500 = 'weapons.bombs.KAB_500' +ENUMS.Storage.weapons.gunmounts.AKAN = 'weapons.gunmounts.{AKAN}' +ENUMS.Storage.weapons.shells._20MM_M242_HEIT = 'weapons.shells.20MM_M242_HEI-T' +ENUMS.Storage.weapons.gunmounts.GAU_12_Equalizer_AP = 'weapons.gunmounts.{GAU_12_Equalizer_AP}' +ENUMS.Storage.weapons.gunmounts.FN_HMP400 = 'weapons.gunmounts.{FN_HMP400}' +ENUMS.Storage.weapons.containers.dlpod_akg = 'weapons.containers.dlpod_akg' +ENUMS.Storage.weapons.droptanks.PTB600_MIG15 = 'weapons.droptanks.PTB600_MIG15' +ENUMS.Storage.weapons.adapters.apu602_L = 'weapons.adapters.apu-60-2_L' +ENUMS.Storage.weapons.missiles.SeaSparrow = 'weapons.missiles.SeaSparrow' +ENUMS.Storage.weapons.droptanks._ = 'weapons.droptanks.' +ENUMS.Storage.weapons.adapters.lau117 = 'weapons.adapters.lau-117' +ENUMS.Storage.weapons.shells.M197_20 = 'weapons.shells.M197_20' +ENUMS.Storage.weapons.shells.Br303_tr = 'weapons.shells.Br303_tr' +ENUMS.Storage.weapons.adapters.MBD3LAU61 = 'weapons.adapters.MBD-3-LAU-61' +ENUMS.Storage.weapons.bombs.British_SAP_250LB_Bomb_Mk5 = 'weapons.bombs.British_SAP_250LB_Bomb_Mk5' +ENUMS.Storage.weapons.adapters.apu68m3 = 'weapons.adapters.apu-68m3' +ENUMS.Storage.weapons.shells.British303_Ball_Mk6 = 'weapons.shells.British303_Ball_Mk6' +ENUMS.Storage.weapons.shells._7_62x54_NOTRACER = 'weapons.shells.7_62x54_NOTRACER' +ENUMS.Storage.weapons.nurs.SNEB_TYPE250_F1B = 'weapons.nurs.SNEB_TYPE250_F1B' +ENUMS.Storage.weapons.shells.ZTZ_14_5 = 'weapons.shells.ZTZ_14_5' +ENUMS.Storage.weapons.bombs.CBU_105 = 'weapons.bombs.CBU_105' +ENUMS.Storage.weapons.droptanks.FW190_FuelTank = 'weapons.droptanks.FW-190_Fuel-Tank' +ENUMS.Storage.weapons.missiles.X_58 = 'weapons.missiles.X_58' +ENUMS.Storage.weapons.bombs.LYSBOMB11089 = 'weapons.bombs.LYSBOMB 11089' +ENUMS.Storage.weapons.containers.PAVETACK = 'weapons.containers.PAVETACK' +ENUMS.Storage.weapons.bombs.GBU_24 = 'weapons.bombs.GBU_24' +ENUMS.Storage.weapons.gunmounts.FN_HMP400_100 = 'weapons.gunmounts.{FN_HMP400_100}' +ENUMS.Storage.weapons.missiles.AIM7MH = 'weapons.missiles.AIM-7MH' +ENUMS.Storage.weapons.adapters.rb05pylon = 'weapons.adapters.rb05pylon' +ENUMS.Storage.weapons.shells.DEFA553_30APIT = 'weapons.shells.DEFA553_30APIT' +ENUMS.Storage.weapons.shells.Flak18_Sprgr_39 = 'weapons.shells.Flak18_Sprgr_39' +ENUMS.Storage.weapons.missiles.X_35 = 'weapons.missiles.X_35' +ENUMS.Storage.weapons.bombs.BL_755 = 'weapons.bombs.BL_755' +ENUMS.Storage.weapons.containers.ETHER = 'weapons.containers.ETHER' +ENUMS.Storage.weapons.droptanks.F4U1D_Drop_Tank_Mk5 = 'weapons.droptanks.F4U-1D_Drop_Tank_Mk5' +ENUMS.Storage.weapons.containers.CE2_SMOKE_WHITE = 'weapons.containers.{CE2_SMOKE_WHITE}' +ENUMS.Storage.weapons.bombs.Mk_82Y = 'weapons.bombs.Mk_82Y' +ENUMS.Storage.weapons.bombs.British_MC_500LB_Bomb_Mk2 = 'weapons.bombs.British_MC_500LB_Bomb_Mk2' +ENUMS.Storage.weapons.adapters.HB_ORD_SUU_7 = 'weapons.adapters.HB_ORD_SUU_7' +ENUMS.Storage.weapons.shells.MK75_76 = 'weapons.shells.MK75_76' +ENUMS.Storage.weapons.shells.M68_105_AP = 'weapons.shells.M68_105_AP' +ENUMS.Storage.weapons.missiles.SA57E6 = 'weapons.missiles.SA57E6' +ENUMS.Storage.weapons.missiles.AGM_86C = 'weapons.missiles.AGM_86C' +ENUMS.Storage.weapons.missiles.P_24T = 'weapons.missiles.P_24T' +ENUMS.Storage.weapons.adapters.OH58D_HRACK_L = 'weapons.adapters.OH58D_HRACK_L' +ENUMS.Storage.weapons.gunmounts.MK_108 = 'weapons.gunmounts.MK_108' +ENUMS.Storage.weapons.adapters.APU68 = 'weapons.adapters.APU-68' +ENUMS.Storage.weapons.shells.British303_G_Mk6z = 'weapons.shells.British303_G_Mk6z' +ENUMS.Storage.weapons.containers.aispodt50_l = 'weapons.containers.ais-pod-t50_l' +ENUMS.Storage.weapons.gunmounts.N37 = 'weapons.gunmounts.N-37' +ENUMS.Storage.weapons.missiles.X_555 = 'weapons.missiles.X_555' +ENUMS.Storage.weapons.bombs.FAB500M54 = 'weapons.bombs.FAB-500M54' +ENUMS.Storage.weapons.containers.AN_AAQ_33 = 'weapons.containers.AN_AAQ_33' +ENUMS.Storage.weapons.containers.M2KC_AAF = 'weapons.containers.{M2KC_AAF}' +ENUMS.Storage.weapons.shells.NR23_23x115_HEI_T = 'weapons.shells.NR23_23x115_HEI_T' +ENUMS.Storage.weapons.shells.KPVT_14_5_T = 'weapons.shells.KPVT_14_5_T' +ENUMS.Storage.weapons.shells.M56A3_HE_RED = 'weapons.shells.M56A3_HE_RED' +ENUMS.Storage.weapons.bombs.FAB500SL = 'weapons.bombs.FAB-500SL' +ENUMS.Storage.weapons.bombs.KAB_500S = 'weapons.bombs.KAB_500S' +ENUMS.Storage.weapons.bombs.SAMP400LD = 'weapons.bombs.SAMP400LD' +ENUMS.Storage.weapons.bombs.BDU_45B = 'weapons.bombs.BDU_45B' +ENUMS.Storage.weapons.adapters.APU73 = 'weapons.adapters.APU-73' +ENUMS.Storage.weapons.missiles._9M723_HE = 'weapons.missiles.9M723_HE' +ENUMS.Storage.weapons.bombs.GBU_15_V_31_B = 'weapons.bombs.GBU_15_V_31_B' +ENUMS.Storage.weapons.adapters.CHAP_Tu95MS_rotary_launcher = 'weapons.adapters.CHAP_Tu95MS_rotary_launcher' +ENUMS.Storage.weapons.droptanks.HB_F4E_EXT_WingTank = 'weapons.droptanks.HB_F-4E_EXT_WingTank' +ENUMS.Storage.weapons.bombs.SC_250_T1_L2 = 'weapons.bombs.SC_250_T1_L2' +ENUMS.Storage.weapons.torpedoes.mk46torp_name = 'weapons.torpedoes.mk46torp_name' +ENUMS.Storage.weapons.nurs.C_25 = 'weapons.nurs.C_25' +ENUMS.Storage.weapons.adapters.MAK79_VAR_3 = 'weapons.adapters.MAK-79_VAR_3' +ENUMS.Storage.weapons.adapters._9m120 = 'weapons.adapters.9m120' +ENUMS.Storage.weapons.shells.GSh_30_2K_HE_Tr = 'weapons.shells.GSh_30_2K_HE_Tr' +ENUMS.Storage.weapons.adapters.hf20_pod = 'weapons.adapters.hf20_pod' +ENUMS.Storage.weapons.missiles.AGM_122 = 'weapons.missiles.AGM_122' +ENUMS.Storage.weapons.missiles.P_60 = 'weapons.missiles.P_60' +ENUMS.Storage.weapons.shells.K307_155HE = 'weapons.shells.K307_155HE' +ENUMS.Storage.weapons.shells.A222_130 = 'weapons.shells.A222_130' +ENUMS.Storage.weapons.nurs.Zuni_127 = 'weapons.nurs.Zuni_127' +ENUMS.Storage.weapons.missiles.AIM9J = 'weapons.missiles.AIM-9J' +ENUMS.Storage.weapons.shells.BK_27 = 'weapons.shells.BK_27' +ENUMS.Storage.weapons.adapters.M272_AGM114 = 'weapons.adapters.M272_AGM114' +ENUMS.Storage.weapons.shells.M242_25_AP_M791 = 'weapons.shells.M242_25_AP_M791' +ENUMS.Storage.weapons.adapters.HB_F14_EXT_SHOULDER_PHX_R = 'weapons.adapters.HB_F14_EXT_SHOULDER_PHX_R' +ENUMS.Storage.weapons.gunmounts.OH58D_M3P_L100 = 'weapons.gunmounts.OH58D_M3P_L100' +ENUMS.Storage.weapons.bombs.BetAB_500ShP = 'weapons.bombs.BetAB_500ShP' +ENUMS.Storage.weapons.nurs.British_HE_60LBSAPNo2_3INCHNo1 = 'weapons.nurs.British_HE_60LBSAPNo2_3INCHNo1' +ENUMS.Storage.weapons.missiles.DWS39_MJ2 = 'weapons.missiles.DWS39_MJ2' +ENUMS.Storage.weapons.bombs.HEBOMBD = 'weapons.bombs.HEBOMBD' +ENUMS.Storage.weapons.missiles.Ataka_9M220 = 'weapons.missiles.Ataka_9M220' +ENUMS.Storage.weapons.adapters.rb04pylon = 'weapons.adapters.rb04pylon' +ENUMS.Storage.weapons.bombs.GBU_28 = 'weapons.bombs.GBU_28' +ENUMS.Storage.weapons.nurs.C_8CM_YE = 'weapons.nurs.C_8CM_YE' +ENUMS.Storage.weapons.droptanks.HB_F14_EXT_DROPTANK = 'weapons.droptanks.HB_F14_EXT_DROPTANK' +ENUMS.Storage.weapons.adapters.M2000C_LRF4 = 'weapons.adapters.M-2000C_LRF4' +ENUMS.Storage.weapons.shells.HESH_105 = 'weapons.shells.HESH_105' +ENUMS.Storage.weapons.gunmounts.CH47_PORT_M240H = 'weapons.gunmounts.{CH47_PORT_M240H}' +ENUMS.Storage.weapons.containers.SMOKE_WHITE = 'weapons.containers.{SMOKE_WHITE}' +ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk4 = 'weapons.bombs.British_GP_250LB_Bomb_Mk4' +ENUMS.Storage.weapons.gunmounts.GIAT_M621_HEAP = 'weapons.gunmounts.{GIAT_M621_HEAP}' +ENUMS.Storage.weapons.nurs.ARF8M3TPSM = 'weapons.nurs.ARF8M3TPSM' +ENUMS.Storage.weapons.nurs.M8rocket = 'weapons.nurs.M8rocket' +ENUMS.Storage.weapons.missiles.X_25MR = 'weapons.missiles.X_25MR' +ENUMS.Storage.weapons.droptanks.fueltank230 = 'weapons.droptanks.fueltank230' +ENUMS.Storage.weapons.droptanks.PTB490CMIG21 = 'weapons.droptanks.PTB-490C-MIG21' +ENUMS.Storage.weapons.droptanks.M2KC_02_RPL541 = 'weapons.droptanks.M2KC_02_RPL541' +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_GREEN = 'weapons.nurs.SNEB_TYPE254_F1B_GREEN' +ENUMS.Storage.weapons.adapters.mbd = 'weapons.adapters.mbd' +ENUMS.Storage.weapons.droptanks.HB_F4E_EXT_Center_Fuel_Tank_EMPTY = 'weapons.droptanks.HB_F-4E_EXT_Center_Fuel_Tank_EMPTY' +ENUMS.Storage.weapons.missiles.AGM_84D = 'weapons.missiles.AGM_84D' +ENUMS.Storage.weapons.bombs.M257_FLARE = 'weapons.bombs.M257_FLARE' +ENUMS.Storage.weapons.missiles.AGM_84A = 'weapons.missiles.AGM_84A' +ENUMS.Storage.weapons.gunmounts.GIAT_M621_HE = 'weapons.gunmounts.{GIAT_M621_HE}' +ENUMS.Storage.weapons.missiles.AIM_54C_Mk47 = 'weapons.missiles.AIM_54C_Mk47' +ENUMS.Storage.weapons.containers.MPS410 = 'weapons.containers.MPS-410' +ENUMS.Storage.weapons.missiles.HY2 = 'weapons.missiles.HY-2' +ENUMS.Storage.weapons.bombs.Mk_81 = 'weapons.bombs.Mk_81' +ENUMS.Storage.weapons.shells.Oerlikon_20mm_Essex = 'weapons.shells.Oerlikon_20mm_Essex' +ENUMS.Storage.weapons.adapters.PylonM71 = 'weapons.adapters.PylonM71' +ENUMS.Storage.weapons.droptanks._1100LTank = 'weapons.droptanks.1100L Tank' +ENUMS.Storage.weapons.bombs.BAP_100 = 'weapons.bombs.BAP_100' +ENUMS.Storage.weapons.gunmounts.PK3 = 'weapons.gunmounts.{PK-3}' +ENUMS.Storage.weapons.adapters.b52_CRL_mod1 = 'weapons.adapters.b-52_CRL_mod1' +ENUMS.Storage.weapons.adapters._9m120m = 'weapons.adapters.9m120m' +ENUMS.Storage.weapons.droptanks.M2KC_02_RPL541_EMPTY = 'weapons.droptanks.M2KC_02_RPL541_EMPTY' +ENUMS.Storage.weapons.bombs.BR_500 = 'weapons.bombs.BR_500' +ENUMS.Storage.weapons.adapters._9K114_Shturm = 'weapons.adapters.9K114_Shturm' +ENUMS.Storage.weapons.adapters.f4pilon = 'weapons.adapters.f4-pilon' +ENUMS.Storage.weapons.gunmounts.SPPU_22 = 'weapons.gunmounts.SPPU_22' +ENUMS.Storage.weapons.gunmounts.GSh232taildefense = 'weapons.gunmounts.GSh-23-2 tail defense' +ENUMS.Storage.weapons.bombs.FAB250M54TU = 'weapons.bombs.FAB-250M54TU' +ENUMS.Storage.weapons.nurs.HYDRA_70_M229 = 'weapons.nurs.HYDRA_70_M229' +ENUMS.Storage.weapons.shells.M185_155 = 'weapons.shells.M185_155' +ENUMS.Storage.weapons.adapters.sa342_ATAM_Tube_2x = 'weapons.adapters.sa342_ATAM_Tube_2x' +ENUMS.Storage.weapons.shells._53UBR281U = 'weapons.shells.53-UBR-281U' +ENUMS.Storage.weapons.nurs.SNEB_TYPE259E_H1 = 'weapons.nurs.SNEB_TYPE259E_H1' +ENUMS.Storage.weapons.bombs.SAB_250_200 = 'weapons.bombs.SAB_250_200' +ENUMS.Storage.weapons.missiles.ADM_141B = 'weapons.missiles.ADM_141B' +ENUMS.Storage.weapons.adapters.kmgu2 = 'weapons.adapters.kmgu-2' +ENUMS.Storage.weapons.adapters.B20 = 'weapons.adapters.B-20' +ENUMS.Storage.weapons.containers.U22A = 'weapons.containers.U22A' +ENUMS.Storage.weapons.shells.M246_20_HE_gr = 'weapons.shells.M246_20_HE_gr' +ENUMS.Storage.weapons.nurs.SNEB_TYPE251_H1 = 'weapons.nurs.SNEB_TYPE251_H1' +ENUMS.Storage.weapons.missiles.Kh25MP_PRGS1VP = 'weapons.missiles.Kh25MP_PRGS1VP' +ENUMS.Storage.weapons.adapters.BR21Gerat = 'weapons.adapters.BR21-Gerat' +ENUMS.Storage.weapons.adapters.apu13u2 = 'weapons.adapters.apu-13u-2' +ENUMS.Storage.weapons.shells.Hispano_Mk_II_MKI_HEI = 'weapons.shells.Hispano_Mk_II_MKI_HE/I' +ENUMS.Storage.weapons.nurs.FFAR_Mk61 = 'weapons.nurs.FFAR_Mk61' +ENUMS.Storage.weapons.containers.BRD4250 = 'weapons.containers.BRD-4-250' +ENUMS.Storage.weapons.containers.HB_ORD_MER = 'weapons.containers.HB_ORD_MER' +ENUMS.Storage.weapons.droptanks.PTB_1200_F1 = 'weapons.droptanks.PTB_1200_F1' +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk1 = 'weapons.bombs.British_GP_500LB_Bomb_Mk1' +ENUMS.Storage.weapons.missiles.AGM_119 = 'weapons.missiles.AGM_119' +ENUMS.Storage.weapons.shells._3BM59_125_AP = 'weapons.shells.3BM59_125_AP' +ENUMS.Storage.weapons.shells.M2_50_aero_AP = 'weapons.shells.M2_50_aero_AP' +ENUMS.Storage.weapons.adapters.LAU68 = 'weapons.adapters.LAU-68' +ENUMS.Storage.weapons.nurs.C_5 = 'weapons.nurs.C_5' +ENUMS.Storage.weapons.nurs.S24B = 'weapons.nurs.S-24B' +ENUMS.Storage.weapons.adapters.HB_F4E_LAU34 = 'weapons.adapters.HB_F-4E_LAU-34' +ENUMS.Storage.weapons.shells._2A18_122 = 'weapons.shells.2A18_122' +ENUMS.Storage.weapons.missiles.SCUD_RAKETA = 'weapons.missiles.SCUD_RAKETA' +ENUMS.Storage.weapons.adapters.b52_HSAB = 'weapons.adapters.b-52_HSAB' +ENUMS.Storage.weapons.nurs.R4M = 'weapons.nurs.R4M' +ENUMS.Storage.weapons.bombs.LYSBOMB11086 = 'weapons.bombs.LYSBOMB 11086' +ENUMS.Storage.weapons.bombs.SD_250_Stg = 'weapons.bombs.SD_250_Stg' +ENUMS.Storage.weapons.nurs.SNEB_TYPE256_F1B = 'weapons.nurs.SNEB_TYPE256_F1B' +ENUMS.Storage.weapons.missiles.AGM_84H = 'weapons.missiles.AGM_84H' +ENUMS.Storage.weapons.missiles.AIM_54 = 'weapons.missiles.AIM_54' +ENUMS.Storage.weapons.bombs.AB_500_1_SD_10A = 'weapons.bombs.AB_500_1_SD_10A' +ENUMS.Storage.weapons.containers.Eclair = 'weapons.containers.{Eclair}' +ENUMS.Storage.weapons.gunmounts.MB339_ANM3_R = 'weapons.gunmounts.{MB339_ANM3_R}' +ENUMS.Storage.weapons.shells.N37_37x155_API_T = 'weapons.shells.N37_37x155_API_T' +ENUMS.Storage.weapons.shells.MG_20x82_MGsch = 'weapons.shells.MG_20x82_MGsch' +ENUMS.Storage.weapons.containers.fullCargoSeats = 'weapons.containers.fullCargoSeats' +ENUMS.Storage.weapons.shells.British303_G_Mk1 = 'weapons.shells.British303_G_Mk1' +ENUMS.Storage.weapons.adapters.LR25 = 'weapons.adapters.LR-25' +ENUMS.Storage.weapons.gunmounts.CH47_PORT_M134D = 'weapons.gunmounts.{CH47_PORT_M134D}' +ENUMS.Storage.weapons.containers.MIG21_SMOKE_RED = 'weapons.containers.{MIG21_SMOKE_RED}' +ENUMS.Storage.weapons.shells.M53_AP_RED = 'weapons.shells.M53_AP_RED' +ENUMS.Storage.weapons.gunmounts.GIAT_M621_AP = 'weapons.gunmounts.{GIAT_M621_AP}' +ENUMS.Storage.weapons.nurs.C_8CM = 'weapons.nurs.C_8CM' +ENUMS.Storage.weapons.missiles.P_40R = 'weapons.missiles.P_40R' +ENUMS.Storage.weapons.missiles.YJ12 = 'weapons.missiles.YJ-12' +ENUMS.Storage.weapons.missiles.CM_802AKG = 'weapons.missiles.CM_802AKG' +ENUMS.Storage.weapons.missiles.SA9M38M1 = 'weapons.missiles.SA9M38M1' +ENUMS.Storage.weapons.droptanks.AV8BNA_AERO1D_EMPTY = 'weapons.droptanks.AV8BNA_AERO1D_EMPTY' +ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk5 = 'weapons.bombs.British_GP_250LB_Bomb_Mk5' +ENUMS.Storage.weapons.shells.British303_Ball_Mk7 = 'weapons.shells.British303_Ball_Mk7' +ENUMS.Storage.weapons.bombs.GBU_43 = 'weapons.bombs.GBU_43' +ENUMS.Storage.weapons.missiles.AGM_88 = 'weapons.missiles.AGM_88' +ENUMS.Storage.weapons.droptanks.droptank_110_gal = 'weapons.droptanks.droptank_110_gal' +ENUMS.Storage.weapons.missiles.GB6SFW = 'weapons.missiles.GB-6-SFW' +ENUMS.Storage.weapons.bombs.SAB_250_FLARE = 'weapons.bombs.SAB_250_FLARE' +ENUMS.Storage.weapons.adapters.ao2_5rt_block1 = 'weapons.adapters.ao-2_5rt_block1' +ENUMS.Storage.weapons.shells._7_62x51 = 'weapons.shells.7_62x51' +ENUMS.Storage.weapons.gunmounts.AKAN_NO_TRC = 'weapons.gunmounts.AKAN_NO_TRC' +ENUMS.Storage.weapons.bombs.LYSBOMB11088 = 'weapons.bombs.LYSBOMB 11088' +ENUMS.Storage.weapons.shells.PKT_7_62_T = 'weapons.shells.PKT_7_62_T' +ENUMS.Storage.weapons.gunmounts.BrowningM2 = 'weapons.gunmounts.BrowningM2' +ENUMS.Storage.weapons.containers.MIG21_SMOKE_WHITE = 'weapons.containers.{MIG21_SMOKE_WHITE}' +ENUMS.Storage.weapons.adapters.BRU_57 = 'weapons.adapters.BRU_57' +ENUMS.Storage.weapons.bombs.MK_82AIR = 'weapons.bombs.MK_82AIR' +ENUMS.Storage.weapons.missiles.R_550 = 'weapons.missiles.R_550' +ENUMS.Storage.weapons.shells.Hispano_Mk_II_APT = 'weapons.shells.Hispano_Mk_II_AP/T' +ENUMS.Storage.weapons.adapters.MAK79_VAR_1 = 'weapons.adapters.MAK-79_VAR_1' +ENUMS.Storage.weapons.nurs.GRAD_9M22U = 'weapons.nurs.GRAD_9M22U' +ENUMS.Storage.weapons.gunmounts.CH47_AFT_M240H = 'weapons.gunmounts.{CH47_AFT_M240H}' +ENUMS.Storage.weapons.shells.GSH_23_AP = 'weapons.shells.GSH_23_AP' +ENUMS.Storage.weapons.missiles.SA9M33 = 'weapons.missiles.SA9M33' +ENUMS.Storage.weapons.missiles.YJ83K = 'weapons.missiles.YJ-83K' +ENUMS.Storage.weapons.shells.MG_13x64_APT = 'weapons.shells.MG_13x64_APT' +ENUMS.Storage.weapons.missiles.AIM7P = 'weapons.missiles.AIM-7P' +ENUMS.Storage.weapons.shells._50Browning_Ball_M2_Corsair = 'weapons.shells.50Browning_Ball_M2_Corsair' +ENUMS.Storage.weapons.nurs.C_8CM_BU = 'weapons.nurs.C_8CM_BU' +ENUMS.Storage.weapons.bombs.OH58D_Yellow_Smoke_Grenade = 'weapons.bombs.OH58D_Yellow_Smoke_Grenade' +ENUMS.Storage.weapons.bombs.GBU_32_V_2B = 'weapons.bombs.GBU_32_V_2B' +ENUMS.Storage.weapons.nurs.SNEB_TYPE257_F1B = 'weapons.nurs.SNEB_TYPE257_F1B' +ENUMS.Storage.weapons.missiles.Rb04EforA_I__ = 'weapons.missiles.Rb 04E (for A.I.)' +ENUMS.Storage.weapons.containers.MB339_SMOKEPOD = 'weapons.containers.MB339_SMOKE-POD' +ENUMS.Storage.weapons.containers.HB_F14_EXT_LAU7 = 'weapons.containers.HB_F14_EXT_LAU-7' +ENUMS.Storage.weapons.missiles.P_27T = 'weapons.missiles.P_27T' +ENUMS.Storage.weapons.adapters.B1B_28store_Conventional_Bomb_Module = 'weapons.adapters.B-1B_28-store_Conventional_Bomb_Module' +ENUMS.Storage.weapons.shells.GAU8_30_TP = 'weapons.shells.GAU8_30_TP' +ENUMS.Storage.weapons.droptanks.LNS_VIG_XTANK = 'weapons.droptanks.LNS_VIG_XTANK' +ENUMS.Storage.weapons.shells._2A7_23_HE = 'weapons.shells.2A7_23_HE' +ENUMS.Storage.weapons.shells.MINGR55 = 'weapons.shells.MINGR55' +ENUMS.Storage.weapons.gunmounts.M230 = 'weapons.gunmounts.M230' +ENUMS.Storage.weapons.shells.MK45_127mm_Essex = 'weapons.shells.MK45_127mm_Essex' +ENUMS.Storage.weapons.droptanks.F15E_Drop_Tank_Empty = 'weapons.droptanks.F-15E_Drop_Tank_Empty' +ENUMS.Storage.weapons.nurs.British_HE_60LBFNo1_3INCHNo1 = 'weapons.nurs.British_HE_60LBFNo1_3INCHNo1' +ENUMS.Storage.weapons.torpedoes.LTF_5B = 'weapons.torpedoes.LTF_5B' +ENUMS.Storage.weapons.adapters.HB_F4E_LAU117 = 'weapons.adapters.HB_F4E_LAU117' +ENUMS.Storage.weapons.containers.HB_ORD_Missile_Well_Adapter = 'weapons.containers.HB_ORD_Missile_Well_Adapter' +ENUMS.Storage.weapons.bombs.SC_500_J = 'weapons.bombs.SC_500_J' +ENUMS.Storage.weapons.adapters.AKU58 = 'weapons.adapters.AKU-58' +ENUMS.Storage.weapons.missiles.PL8A = 'weapons.missiles.PL-8A' +ENUMS.Storage.weapons.gunmounts.MB339_DEFA553_L = 'weapons.gunmounts.{MB339_DEFA553_L}' +ENUMS.Storage.weapons.adapters.UB1657UMP = 'weapons.adapters.UB-16-57UMP' +ENUMS.Storage.weapons.droptanks.fuel_tank_230 = 'weapons.droptanks.fuel_tank_230' +ENUMS.Storage.weapons.nurs.SNEB_TYPE257_H1 = 'weapons.nurs.SNEB_TYPE257_H1' +ENUMS.Storage.weapons.missiles.RB75B = 'weapons.missiles.RB75B' +ENUMS.Storage.weapons.shells.NR30_30x155_HEI_T = 'weapons.shells.NR30_30x155_HEI_T' +ENUMS.Storage.weapons.adapters.apu68um3 = 'weapons.adapters.apu-68um3' +ENUMS.Storage.weapons.missiles.R_550_M1 = 'weapons.missiles.R_550_M1' +ENUMS.Storage.weapons.adapters.OH58D_SRACK_L = 'weapons.adapters.OH58D_SRACK_L' +ENUMS.Storage.weapons.gunmounts.M61 = 'weapons.gunmounts.M-61' +ENUMS.Storage.weapons.missiles.X_41 = 'weapons.missiles.X_41' +ENUMS.Storage.weapons.gunmounts.GSH_23 = 'weapons.gunmounts.GSH_23' +ENUMS.Storage.weapons.missiles.R_530F_EM = 'weapons.missiles.R_530F_EM' +ENUMS.Storage.weapons.containers.kg600 = 'weapons.containers.kg600' +ENUMS.Storage.weapons.missiles.M31 = 'weapons.missiles.M31' +ENUMS.Storage.weapons.bombs._2502 = 'weapons.bombs.250-2' +ENUMS.Storage.weapons.gunmounts.M134_SIDE_L = 'weapons.gunmounts.M134_SIDE_L' +ENUMS.Storage.weapons.missiles.AGM_65B = 'weapons.missiles.AGM_65B' +ENUMS.Storage.weapons.adapters.BRD4250 = 'weapons.adapters.BRD-4-250' +ENUMS.Storage.weapons.bombs.SAMP250LD = 'weapons.bombs.SAMP250LD' +ENUMS.Storage.weapons.containers.AAQ28_LITENING = 'weapons.containers.AAQ-28_LITENING' +ENUMS.Storage.weapons.droptanks.Mosquito_Drop_Tank_50gal = 'weapons.droptanks.Mosquito_Drop_Tank_50gal' +ENUMS.Storage.weapons.shells._7_92x57_Smkl = 'weapons.shells.7_92x57_Smkl' +ENUMS.Storage.weapons.shells.M68_105_HE = 'weapons.shells.M68_105_HE' +ENUMS.Storage.weapons.containers.SPRD_99Twin = 'weapons.containers.SPRD_99Twin' +ENUMS.Storage.weapons.missiles.HBAIM7E = 'weapons.missiles.HB-AIM-7E' +ENUMS.Storage.weapons.shells.M2_12_7_TG = 'weapons.shells.M2_12_7_TG' +ENUMS.Storage.weapons.torpedoes.YU6 = 'weapons.torpedoes.YU-6' +ENUMS.Storage.weapons.bombs.British_MC_250LB_Bomb_Mk2 = 'weapons.bombs.British_MC_250LB_Bomb_Mk2' +ENUMS.Storage.weapons.droptanks.PTB_120_F86F35 = 'weapons.droptanks.PTB_120_F86F35' +ENUMS.Storage.weapons.shells.M256_120_AP_L55 = 'weapons.shells.M256_120_AP_L55' +ENUMS.Storage.weapons.gunmounts.GUV_YakB_GSHP = 'weapons.gunmounts.GUV_YakB_GSHP' +ENUMS.Storage.weapons.bombs.GBU_29 = 'weapons.bombs.GBU_29' +ENUMS.Storage.weapons.gunmounts.GIAT_M261 = 'weapons.gunmounts.GIAT_M261' +ENUMS.Storage.weapons.missiles.R3S = 'weapons.missiles.R-3S' +ENUMS.Storage.weapons.adapters.LAU131 = 'weapons.adapters.LAU-131' +ENUMS.Storage.weapons.gunmounts.KORD_12_7 = 'weapons.gunmounts.KORD_12_7' +ENUMS.Storage.weapons.shells.M230_ADEMDEFA = 'weapons.shells.M230_ADEM/DEFA' +ENUMS.Storage.weapons.missiles.SM_2 = 'weapons.missiles.SM_2' +ENUMS.Storage.weapons.gunmounts.CH47_STBD_M134D = 'weapons.gunmounts.{CH47_STBD_M134D}' +ENUMS.Storage.weapons.missiles.P_27TE = 'weapons.missiles.P_27TE' +ENUMS.Storage.weapons.missiles.X_25ML = 'weapons.missiles.X_25ML' +ENUMS.Storage.weapons.containers.lau105 = 'weapons.containers.lau-105' +ENUMS.Storage.weapons.droptanks.FPU_8A = 'weapons.droptanks.FPU_8A' +ENUMS.Storage.weapons.bombs.BLG66 = 'weapons.bombs.BLG66' +ENUMS.Storage.weapons.shells._2A33_152 = 'weapons.shells.2A33_152' +ENUMS.Storage.weapons.nurs.MO_10104M = 'weapons.nurs.MO_10104M' +ENUMS.Storage.weapons.shells.M825A1_155_SM = 'weapons.shells.M825A1_155_SM' +ENUMS.Storage.weapons.gunmounts.AKAN = 'weapons.gunmounts.AKAN' +ENUMS.Storage.weapons.gunmounts.Browning303MkII = 'weapons.gunmounts.Browning303MkII' +ENUMS.Storage.weapons.nurs.URAGAN_9M27F = 'weapons.nurs.URAGAN_9M27F' +ENUMS.Storage.weapons.nurs.FFARMk5HEAT = 'weapons.nurs.FFAR Mk5 HEAT' +ENUMS.Storage.weapons.nurs.ARF8M3API = 'weapons.nurs.ARF8M3API' +ENUMS.Storage.weapons.shells._3UBM11_100mm_AP = 'weapons.shells.3UBM11_100mm_AP' +ENUMS.Storage.weapons.containers.ASO2 = 'weapons.containers.ASO-2' +ENUMS.Storage.weapons.shells.DEFA552_30 = 'weapons.shells.DEFA552_30' +ENUMS.Storage.weapons.gunmounts.DEFA_553 = 'weapons.gunmounts.DEFA_553' +ENUMS.Storage.weapons.missiles.AGM_45A = 'weapons.missiles.AGM_45A' +ENUMS.Storage.weapons.missiles.Super_530D = 'weapons.missiles.Super_530D' +ENUMS.Storage.weapons.adapters.mbd3u668 = 'weapons.adapters.mbd3-u6-68' +ENUMS.Storage.weapons.adapters.BRU_55 = 'weapons.adapters.BRU_55' +ENUMS.Storage.weapons.adapters.SA342_Telson8 = 'weapons.adapters.SA342_Telson8' +ENUMS.Storage.weapons.adapters.c25pu = 'weapons.adapters.c-25pu' +ENUMS.Storage.weapons.bombs.FAB500TA = 'weapons.bombs.FAB-500TA' +ENUMS.Storage.weapons.bombs.SAMP125LD = 'weapons.bombs.SAMP125LD' +ENUMS.Storage.weapons.bombs.LYSBOMB_CANDLE = 'weapons.bombs.LYSBOMB_CANDLE' +ENUMS.Storage.weapons.missiles.AGM_65F = 'weapons.missiles.AGM_65F' +ENUMS.Storage.weapons.shells._50Browning_AP_M2 = 'weapons.shells.50Browning_AP_M2' +ENUMS.Storage.weapons.shells._5_56x45 = 'weapons.shells.5_56x45' +ENUMS.Storage.weapons.adapters.MatraF1Rocket = 'weapons.adapters.Matra-F1-Rocket' +ENUMS.Storage.weapons.missiles.LS_6_500 = 'weapons.missiles.LS_6_500' +ENUMS.Storage.weapons.missiles.SA9M311 = 'weapons.missiles.SA9M311' +ENUMS.Storage.weapons.shells.AK100_100 = 'weapons.shells.AK100_100' +ENUMS.Storage.weapons.bombs.BLG66_BELOUGA = 'weapons.bombs.BLG66_BELOUGA' +ENUMS.Storage.weapons.bombs.BIN_200 = 'weapons.bombs.BIN_200' +ENUMS.Storage.weapons.containers.pl5eii = 'weapons.containers.pl5eii' +ENUMS.Storage.weapons.gunmounts.CH47_STBD_M240H = 'weapons.gunmounts.{CH47_STBD_M240H}' +ENUMS.Storage.weapons.droptanks.Spitfire_slipper_tank = 'weapons.droptanks.Spitfire_slipper_tank' +ENUMS.Storage.weapons.missiles.HOT3_MBDA = 'weapons.missiles.HOT3_MBDA' +ENUMS.Storage.weapons.shells._53UOR281U = 'weapons.shells.53-UOR-281U' +ENUMS.Storage.weapons.bombs.BDU_50LGB = 'weapons.bombs.BDU_50LGB' +ENUMS.Storage.weapons.gunmounts.SHKAS_GUN = 'weapons.gunmounts.SHKAS_GUN' +ENUMS.Storage.weapons.shells.British303_W_Mk1z = 'weapons.shells.British303_W_Mk1z' +ENUMS.Storage.weapons.adapters.J11A_twinpylon_r = 'weapons.adapters.J-11A_twinpylon_r' +ENUMS.Storage.weapons.missiles.P_700 = 'weapons.missiles.P_700' +ENUMS.Storage.weapons.missiles.SA5V28 = 'weapons.missiles.SA5V28' +ENUMS.Storage.weapons.missiles.MIM_72G = 'weapons.missiles.MIM_72G' +ENUMS.Storage.weapons.adapters.CLB_4 = 'weapons.adapters.CLB_4' +ENUMS.Storage.weapons.droptanks.PTB_200_F86F35 = 'weapons.droptanks.PTB_200_F86F35' +ENUMS.Storage.weapons.shells.Mauser7_92x57_SmK_Lspurgelb = "weapons.shells.Mauser7.92x57_S.m.K._L'spur(gelb)" +ENUMS.Storage.weapons.droptanks.PTB_1500_MIG29A = 'weapons.droptanks.PTB_1500_MIG29A' +ENUMS.Storage.weapons.bombs.GBU_31 = 'weapons.bombs.GBU_31' +ENUMS.Storage.weapons.missiles.Kh66_Grom = 'weapons.missiles.Kh-66_Grom' +ENUMS.Storage.weapons.containers.HB_ALE_40_15_90 = 'weapons.containers.HB_ALE_40_15_90' +ENUMS.Storage.weapons.containers.U22 = 'weapons.containers.U22' +ENUMS.Storage.weapons.adapters.Spitfire_pilon1 = 'weapons.adapters.Spitfire_pilon1' +ENUMS.Storage.weapons.bombs.OH58D_Violet_Smoke_Grenade = 'weapons.bombs.OH58D_Violet_Smoke_Grenade' +ENUMS.Storage.weapons.adapters.adapter_gdj_yj83k = 'weapons.adapters.adapter_gdj_yj83k' +ENUMS.Storage.weapons.adapters.M299 = 'weapons.adapters.M299' +ENUMS.Storage.weapons.adapters.HB_ORD_MER = 'weapons.adapters.HB_ORD_MER' +ENUMS.Storage.weapons.shells.Mauser7_92x57_SmKH = 'weapons.shells.Mauser7.92x57_S.m.K.H.' +ENUMS.Storage.weapons.gunmounts.HMP400 = 'weapons.gunmounts.HMP400' +ENUMS.Storage.weapons.containers.F15E_AXQ14_DATALINK = 'weapons.containers.F-15E_AXQ-14_DATALINK' +ENUMS.Storage.weapons.adapters._9m114_pylon2 = 'weapons.adapters.9m114_pylon2' +ENUMS.Storage.weapons.bombs.BEER_BOMB = 'weapons.bombs.BEER_BOMB' +ENUMS.Storage.weapons.nurs.C_8OFP2 = 'weapons.nurs.C_8OFP2' +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_RED = 'weapons.nurs.SNEB_TYPE254_F1B_RED' +ENUMS.Storage.weapons.nurs.C_8OM = 'weapons.nurs.C_8OM' +ENUMS.Storage.weapons.shells.M61_20_HE_INVIS = 'weapons.shells.M61_20_HE_INVIS' +ENUMS.Storage.weapons.droptanks.HB_F4E_EXT_WingTank_R = 'weapons.droptanks.HB_F-4E_EXT_WingTank_R' +ENUMS.Storage.weapons.missiles.CATM_65K = 'weapons.missiles.CATM_65K' +ENUMS.Storage.weapons.nurs.FFARM156WP = 'weapons.nurs.FFAR M156 WP' +ENUMS.Storage.weapons.bombs.MK_82SNAKEYE = 'weapons.bombs.MK_82SNAKEYE' +ENUMS.Storage.weapons.shells.Rh202_20_AP = 'weapons.shells.Rh202_20_AP' +ENUMS.Storage.weapons.adapters.M261 = 'weapons.adapters.M261' +ENUMS.Storage.weapons.bombs.KAB_1500T = 'weapons.bombs.KAB_1500T' +ENUMS.Storage.weapons.shells.M339_120mm_HEAT_MP_T = 'weapons.shells.M339_120mm_HEAT_MP_T' +ENUMS.Storage.weapons.shells.UOF_17_100HE = 'weapons.shells.UOF_17_100HE' +ENUMS.Storage.weapons.nurs.SNEB_TYPE259E_F1B = 'weapons.nurs.SNEB_TYPE259E_F1B' +ENUMS.Storage.weapons.shells._5_45x39_NOtr = 'weapons.shells.5_45x39_NOtr' +ENUMS.Storage.weapons.gunmounts.CH47_AFT_M3M = 'weapons.gunmounts.{CH47_AFT_M3M}' +ENUMS.Storage.weapons.containers.Fantasm = 'weapons.containers.Fantasm' +ENUMS.Storage.weapons.missiles.AGM_12C_ED = 'weapons.missiles.AGM_12C_ED' +ENUMS.Storage.weapons.droptanks.PTB760_MIG19 = 'weapons.droptanks.PTB760_MIG19' +ENUMS.Storage.weapons.missiles.SA9M330 = 'weapons.missiles.SA9M330' +ENUMS.Storage.weapons.missiles.BK90_MJ1_MJ2 = 'weapons.missiles.BK90_MJ1_MJ2' +ENUMS.Storage.weapons.containers.HB_F14_EXT_AN_APQ167 = 'weapons.containers.HB_F14_EXT_AN_APQ-167' +ENUMS.Storage.weapons.containers.MB339_TravelPod = 'weapons.containers.MB339_TravelPod' +ENUMS.Storage.weapons.gunmounts.OH58D_M3P_L200 = 'weapons.gunmounts.OH58D_M3P_L200' +ENUMS.Storage.weapons.adapters.B1B_10store_Conventional_Bomb_Module = 'weapons.adapters.B-1B_10-store_Conventional_Bomb_Module' +ENUMS.Storage.weapons.shells.GSH23_23_HE_T = 'weapons.shells.GSH23_23_HE_T' +ENUMS.Storage.weapons.containers.TANGAZH = 'weapons.containers.TANGAZH' +ENUMS.Storage.weapons.nurs.HYDRA_70_MK5 = 'weapons.nurs.HYDRA_70_MK5' +ENUMS.Storage.weapons.bombs.FAB_100M = 'weapons.bombs.FAB_100M' +ENUMS.Storage.weapons.gunmounts.CH47_PORT_M60D = 'weapons.gunmounts.{CH47_PORT_M60D}' +ENUMS.Storage.weapons.missiles.M48 = 'weapons.missiles.M48' +ENUMS.Storage.weapons.shells.MAUZER30_30 = 'weapons.shells.MAUZER30_30' +ENUMS.Storage.weapons.adapters.tu22m3mbd = 'weapons.adapters.tu-22m3-mbd' +ENUMS.Storage.weapons.gunmounts.DEFA554 = 'weapons.gunmounts.DEFA 554' +ENUMS.Storage.weapons.droptanks.F4U1D_Drop_Tank_Mk6 = 'weapons.droptanks.F4U-1D_Drop_Tank_Mk6' +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_YELLOW = 'weapons.containers.{US_M10_SMOKE_TANK_YELLOW}' +ENUMS.Storage.weapons.bombs.HEBOMB = 'weapons.bombs.HEBOMB' +ENUMS.Storage.weapons.nurs.Rkt_901_HE = 'weapons.nurs.Rkt_90-1_HE' +ENUMS.Storage.weapons.adapters.HB_F14_EXT_BRU42 = 'weapons.adapters.HB_F14_EXT_BRU42' +ENUMS.Storage.weapons.missiles.YJ62 = 'weapons.missiles.YJ-62' +ENUMS.Storage.weapons.shells.KDA_35_HE = 'weapons.shells.KDA_35_HE' +ENUMS.Storage.weapons.shells._2A7_23_AP = 'weapons.shells.2A7_23_AP' +ENUMS.Storage.weapons.adapters.SA342_LAU_HOT3_1x = 'weapons.adapters.SA342_LAU_HOT3_1x' +ENUMS.Storage.weapons.missiles.P_9M117 = 'weapons.missiles.P_9M117' +ENUMS.Storage.weapons.adapters.MBD267U = 'weapons.adapters.MBD-2-67U' +ENUMS.Storage.weapons.shells.AK630_30_HE = 'weapons.shells.AK630_30_HE' +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk5 = 'weapons.bombs.British_GP_500LB_Bomb_Mk5' +ENUMS.Storage.weapons.bombs.LUU_2AB = 'weapons.bombs.LUU_2AB' +ENUMS.Storage.weapons.missiles.BK90_MJ2 = 'weapons.missiles.BK90_MJ2' +ENUMS.Storage.weapons.shells.British303_B_Mk4z = 'weapons.shells.British303_B_Mk4z' +ENUMS.Storage.weapons.adapters.BRU_41A = 'weapons.adapters.BRU_41A' +ENUMS.Storage.weapons.bombs.BDU_45 = 'weapons.bombs.BDU_45' +ENUMS.Storage.weapons.adapters.b20 = 'weapons.adapters.b-20' +ENUMS.Storage.weapons.missiles.Rapier = 'weapons.missiles.Rapier' +ENUMS.Storage.weapons.missiles.P_24R = 'weapons.missiles.P_24R' +ENUMS.Storage.weapons.missiles.AGM_84S = 'weapons.missiles.AGM_84S' +ENUMS.Storage.weapons.adapters.C25PU = 'weapons.adapters.C-25PU' +ENUMS.Storage.weapons.containers.BOZ100 = 'weapons.containers.BOZ-100' +ENUMS.Storage.weapons.missiles.AGM_65E = 'weapons.missiles.AGM_65E' +ENUMS.Storage.weapons.adapters._9M120_pylon2 = 'weapons.adapters.9M120_pylon2' +ENUMS.Storage.weapons.shells.YakB_12_7_T = 'weapons.shells.YakB_12_7_T' +ENUMS.Storage.weapons.containers.IRDeflector = 'weapons.containers.IRDeflector' +ENUMS.Storage.weapons.missiles.AIM9P = 'weapons.missiles.AIM-9P' +ENUMS.Storage.weapons.missiles.SA5B27 = 'weapons.missiles.SA5B27' +ENUMS.Storage.weapons.bombs.SC_500_L2 = 'weapons.bombs.SC_500_L2' +ENUMS.Storage.weapons.containers.HB_F14_EXT_ECA = 'weapons.containers.HB_F14_EXT_ECA' +ENUMS.Storage.weapons.bombs.SAMP400HD = 'weapons.bombs.SAMP400HD' +ENUMS.Storage.weapons.adapters.ARAKM70B = 'weapons.adapters.ARAKM70B' +ENUMS.Storage.weapons.adapters.M260 = 'weapons.adapters.M260' +ENUMS.Storage.weapons.shells.Mauser7_92x57_PmK = 'weapons.shells.Mauser7.92x57_P.m.K.' +ENUMS.Storage.weapons.missiles.RB75T = 'weapons.missiles.RB75T' +ENUMS.Storage.weapons.missiles.YJ82 = 'weapons.missiles.YJ-82' +ENUMS.Storage.weapons.bombs.FAB500M54TU = 'weapons.bombs.FAB-500M54TU' +ENUMS.Storage.weapons.bombs.OH58D_White_Smoke_Grenade = 'weapons.bombs.OH58D_White_Smoke_Grenade' +ENUMS.Storage.weapons.missiles.X_29TE = 'weapons.missiles.X_29TE' +ENUMS.Storage.weapons.missiles.S_25L = 'weapons.missiles.S_25L' +ENUMS.Storage.weapons.nurs.British_AP_25LBNo1_3INCHNo1 = 'weapons.nurs.British_AP_25LBNo1_3INCHNo1' +ENUMS.Storage.weapons.adapters.lau105 = 'weapons.adapters.lau-105' +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_WHITE = 'weapons.containers.{US_M10_SMOKE_TANK_WHITE}' +ENUMS.Storage.weapons.bombs.Mk_82 = 'weapons.bombs.Mk_82' +ENUMS.Storage.weapons.adapters.BRU42_LS_SUU25 = 'weapons.adapters.BRU-42_LS_(SUU-25)' --- Kiowa -ENUMS.Storage.weapons.OH58.FIM92 = {4,4,7,449} -ENUMS.Storage.weapons.OH58.MG_M3P100 = {4,15,46,2611} -ENUMS.Storage.weapons.OH58.MG_M3P200 = {4,15,46,2610} -ENUMS.Storage.weapons.OH58.MG_M3P300 = {4,15,46,2609} -ENUMS.Storage.weapons.OH58.MG_M3P400 = {4,15,46,2608} -ENUMS.Storage.weapons.OH58.MG_M3P500 = {4,15,46,2607} -ENUMS.Storage.weapons.OH58.Smk_Grenade_Blue = {4,5,9,488} -ENUMS.Storage.weapons.OH58.Smk_Grenade_Green = {4,5,9,489} -ENUMS.Storage.weapons.OH58.Smk_Grenade_Red = {4,5,9,487} -ENUMS.Storage.weapons.OH58.Smk_Grenade_Violet = {4,5,9,490} -ENUMS.Storage.weapons.OH58.Smk_Grenade_White = {4,5,9,492} -ENUMS.Storage.weapons.OH58.Smk_Grenade_Yellow = {4,5,9,491} --- Apache -ENUMS.Storage.weapons.AH64D.AN_APG78 = {4,15,44,2114} -ENUMS.Storage.weapons.AH64D.Internal_Aux_FuelTank = {1,3,43,1700} --- Other - but cannot set or track those. Harrier stuff? -ENUMS.Storage.weapons.droptanks.FuelTank_610gal = {1,3,43,10} -ENUMS.Storage.weapons.droptanks.FuelTank_370gal = {1,3,43,11} -ENUMS.Storage.weapons.containers.AV8BNA_GAU_12_AP_M79 = {4,15,46,824} -ENUMS.Storage.weapons.containers.AV8BNA_GAU_12_HE_M792 = {4,15,46,825} -ENUMS.Storage.weapons.containers.AV8BNA_GAU_12_SAPHEI_T = {4,15,46,300} +-- UH-60L Mod +ENUMS.Storage.weapons.gunmounts.UH60LGAU19 = 'weapons.gunmounts.UH-60L GAU-19' +ENUMS.Storage.weapons.gunmounts.UH60L_M134 = 'weapons.gunmounts.UH60L_M134' +ENUMS.Storage.weapons.gunmounts.UH60_M134 = 'weapons.gunmounts.UH60_M134' +ENUMS.Storage.weapons.adapters.uh60l_lwl12 = 'weapons.adapters.uh60l_lwl12' +ENUMS.Storage.weapons.droptanks.uh60l_iafts = 'weapons.droptanks.uh60l_iafts' +ENUMS.Storage.weapons.gunmounts.UH60_GAU19_LEFT = 'weapons.gunmounts.{UH60_GAU19_LEFT}' +ENUMS.Storage.weapons.gunmounts.UH60_GAU19_RIGHT = 'weapons.gunmounts.{UH60_GAU19_RIGHT}' +ENUMS.Storage.weapons.gunmounts.UH60_M134_LEFT = 'weapons.gunmounts.{UH60_M134_LEFT}' +ENUMS.Storage.weapons.gunmounts.UH60_M134_RIGHT = 'weapons.gunmounts.{UH60_M134_RIGHT}' +ENUMS.Storage.weapons.gunmounts.UH60L_M134_GUNNER = 'weapons.gunmounts.{UH60L_M134_GUNNER}' +ENUMS.Storage.weapons.gunmounts.UH60L_M60_GUNNER = 'weapons.gunmounts.{UH60L_M60_GUNNER}' +ENUMS.Storage.weapons.gunmounts.UH60L_M2_GUNNER = 'weapons.gunmounts.{UH60L_M2_GUNNER}' +ENUMS.Storage.weapons.gunmounts.UH60_M230_LEFT = 'weapons.gunmounts.{UH60_M230_LEFT}' +ENUMS.Storage.weapons.gunmounts.UH60_M230_RIGHT = 'weapons.gunmounts.{UH60_M230_RIGHT}' --- -- @type ENUMS.FARPType diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index a6c393484..3b9e62e69 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -4271,18 +4271,56 @@ function UTILS.SpawnFARPAndFunctionalStatics(Name,Coordinate,FARPType,Coalition, local FarpVec2 = Coordinate:GetVec2() if NumberPads > 1 then - local Grid = UTILS.GenerateGridPoints(FarpVec2, NumberPads, SpacingX, SpacingY) + local Grid = UTILS.GenerateGridPoints(FarpVec2, NumberPads, SpacingX, SpacingY) + local groupData = { + ["visible"] = true, + ["hidden"] = false, + ["units"] = {}, + ["y"] = 0, -- Group center latitude + ["x"] = 0, -- Group center longitude + ["name"] = Name, + } + local unitData = { + ["category"] = "Heliports", + ["type"] = STypeName, -- FARP type + ["y"] = 0, -- Latitude coordinate (meters) + ["x"] = 0, -- Longitude coordinate (meters) + ["name"] = Name, + ["heading"] = 0, -- Heading in radians + ["heliport_modulation"] = mod, -- 0 = AM, 1 = FM + ["heliport_frequency"] = freq, -- Radio frequency in MHz + ["heliport_callsign_id"] = callsign, -- Callsign ID + ["dead"] = false, + ["shape_name"] = SShapeName, + ["dynamicSpawn"] = DynamicSpawns, + ["allowHotStart"] = HotStart, + } for id,gridpoint in ipairs(Grid) do -- Spawn FARP - local location = COORDINATE:NewFromVec2(gridpoint) - local newfarp = SPAWNSTATIC:NewFromType(STypeName,"Heliports",Country) -- "Invisible FARP" "FARP" - newfarp:InitShape(SShapeName) -- "invisiblefarp" "FARPS" - newfarp:InitFARP(callsign,freq,mod,DynamicSpawns,HotStart) - local spawnedfarp = newfarp:SpawnFromCoordinate(location,0,Name.."-"..id) - table.insert(ReturnObjects,spawnedfarp) - - PopulateStorage(Name.."-"..id,liquids,equip,airframes) - end + local UnitTemplate = UTILS.DeepCopy(unitData) + UnitTemplate.x = gridpoint.x + UnitTemplate.y = gridpoint.y + if id > 1 then UnitTemplate.name = Name.."-"..id end + table.insert(groupData.units,UnitTemplate) + if id==1 then + groupData.x = gridpoint.x + groupData.y = gridpoint.y + end + end + --BASE:I("Spawning FARP") + --UTILS.PrintTableToLog(groupData,1) + local Static=coalition.addGroup(Country, -1, groupData) + -- Currently DCS >= 2.8 does not trigger birth events if FARPS are spawned! + -- We create such an event. The airbase is registered in Core.Event + local Event = { + id = EVENTS.Birth, + time = timer.getTime(), + initiator = Static + } + -- Create BIRTH event. + world.onEvent(Event) + + PopulateStorage(Name.."-1",liquids,equip,airframes) else -- Spawn FARP local newfarp = SPAWNSTATIC:NewFromType(STypeName,"Heliports",Country) -- "Invisible FARP" "FARP" diff --git a/Moose Development/Moose/Wrapper/DynamicCargo.lua b/Moose Development/Moose/Wrapper/DynamicCargo.lua index eb033972e..8c4987f72 100644 --- a/Moose Development/Moose/Wrapper/DynamicCargo.lua +++ b/Moose Development/Moose/Wrapper/DynamicCargo.lua @@ -108,8 +108,9 @@ DYNAMICCARGO.State = { -- @type DYNAMICCARGO.AircraftTypes DYNAMICCARGO.AircraftTypes = { ["CH-47Fbl1"] = "CH-47Fbl1", - ["Mi-8MTV2"] = "CH-47Fbl1", - ["Mi-8MT"] = "CH-47Fbl1", + ["Mi-8MTV2"] = "Mi-8MTV2", + ["Mi-8MT"] = "Mi-8MT", + ["C-130J-30"] = "C-130J-30", } --- Helo types possible. @@ -122,23 +123,29 @@ DYNAMICCARGO.AircraftDimensions = { ["length"] = 11, ["ropelength"] = 30, }, - ["Mi-8MTV2"] = { + ["Mi-8MTV2"] = { ["width"] = 6, ["height"] = 6, ["length"] = 15, ["ropelength"] = 30, }, - ["Mi-8MT"] = { + ["Mi-8MT"] = { ["width"] = 6, ["height"] = 6, ["length"] = 15, ["ropelength"] = 30, }, + ["C-130J-30"] = { + ["width"] = 4, + ["height"] = 12, + ["length"] = 35, + ["ropelength"] = 0, + }, } --- DYNAMICCARGO class version. -- @field #string version -DYNAMICCARGO.version="0.0.9" +DYNAMICCARGO.version="0.1.0" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 37b120863..ad7afeef1 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -1058,9 +1058,12 @@ function GROUP:GetTypeName() local DCSGroup = self:GetDCSObject() if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - --self:T3( GroupTypeName ) - return( GroupTypeName ) + local unit = DCSGroup:getUnit(1) + if unit then + local GroupTypeName = unit:getTypeName() + --self:T3( GroupTypeName ) + return( GroupTypeName ) + end end return nil @@ -1075,9 +1078,12 @@ function GROUP:GetNatoReportingName() local DCSGroup = self:GetDCSObject() if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - --self:T3( GroupTypeName ) - return UTILS.GetReportingName(GroupTypeName) + local unit = DCSGroup:getUnit(1) + if unit then + local GroupTypeName = unit:getTypeName() + --self:T3( GroupTypeName ) + return UTILS.GetReportingName(GroupTypeName) + end end return "Bogey" @@ -1093,9 +1099,12 @@ function GROUP:GetPlayerName() local DCSGroup = self:GetDCSObject() if DCSGroup then - local PlayerName = DCSGroup:getUnit(1):getPlayerName() - --self:T3( PlayerName ) - return( PlayerName ) + local unit = DCSGroup:getUnit(1) + if unit then + local PlayerName = unit:getPlayerName() + --self:T3( PlayerName ) + return( PlayerName ) + end end return nil @@ -1111,9 +1120,12 @@ function GROUP:GetCallsign() local DCSGroup = self:GetDCSObject() if DCSGroup then - local GroupCallSign = DCSGroup:getUnit(1):getCallsign() - --self:T3( GroupCallSign ) - return GroupCallSign + local unit = DCSGroup:getUnit(1) + if unit then + local GroupCallSign = unit:getCallsign() + --self:T3( GroupCallSign ) + return GroupCallSign + end end BASE:E( { "Cannot GetCallsign", Positionable = self, Alive = self:IsAlive() } ) diff --git a/Moose Development/Moose/Wrapper/Identifiable.lua b/Moose Development/Moose/Wrapper/Identifiable.lua index 8561d5b2b..4f2928cb5 100644 --- a/Moose Development/Moose/Wrapper/Identifiable.lua +++ b/Moose Development/Moose/Wrapper/Identifiable.lua @@ -170,6 +170,27 @@ function IDENTIFIABLE:GetCoalition() return nil end +--- Returns true if identifiable is of RED coalition. +-- @param #IDENTIFIABLE self +-- @return #boolean If the identifiable is red. +function IDENTIFIABLE:IsRed() + return self:GetCoalition() == coalition.side.RED +end + +--- Returns true if identifiable is of BLUE coalition. +-- @param #IDENTIFIABLE self +-- @return #boolean If the identifiable is blue. +function IDENTIFIABLE:IsBlue() + return self:GetCoalition() == coalition.side.BLUE +end + +--- Returns true if identifiable is of NEUTRAL coalition. +-- @param #IDENTIFIABLE self +-- @return #boolean If the identifiable is neutral. +function IDENTIFIABLE:IsNeutral() + return self:GetCoalition() == coalition.side.NEUTRAL +end + --- Returns the name of the coalition of the Identifiable. -- @param #IDENTIFIABLE self -- @return #string The name of the coalition. diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index 3e980c0ab..69c949429 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -1923,6 +1923,7 @@ do -- Cargo ["HL_DSHK"] = 6*POSITIONABLE.DefaultInfantryWeight, ["CCKW_353"] = 16*POSITIONABLE.DefaultInfantryWeight, --GMC CCKW 2½-ton 6×6 truck, estimating 16 soldiers, ["MaxxPro_MRAP"] = 7*POSITIONABLE.DefaultInfantryWeight, + ["Sd_Kfz_251"] = 10*POSITIONABLE.DefaultInfantryWeight, } }