diff --git a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD_Init_DualCoalitions.lua b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD_Init_DualCoalitions.lua index b93a660..3285970 100644 --- a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD_Init_DualCoalitions.lua +++ b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD_Init_DualCoalitions.lua @@ -25,13 +25,24 @@ local blueCfg = { 'UH-1H','Mi-8MTV2','Mi-24P','SA342M','SA342L','SA342Minigun','UH-60L','CH-47Fbl1','CH-47F','Mi-17','GazelleAI' }, -- Optional: drive zone activation from mission flags (preferred: set per-zone below via flag/activeWhen) - - MapDraw = { - Enabled = true, - DrawMASHZones = true, -- Enable MASH zone drawing - }, - - Zones = { + + MEDEVAC = { + Enabled = true, + InitialSalvage = 25, -- Starting salvage points for this coalition + MobileMASH = { + Enabled = true, + ZoneRadius = 300, + BeaconFrequency = '32.0 FM', + AnnouncementInterval = 300, -- Announce position every 5 minutes + }, + }, + + MapDraw = { + Enabled = true, + DrawMASHZones = true, -- Enable MASH zone drawing + }, + + Zones = { PickupZones = { { name = 'S1', flag = 9001, activeWhen = 0 }, { name = "S2", flag = 9004, activeWhen = 0 }, { name = "S3", flag = 9005, activeWhen = 0 }, @@ -50,6 +61,7 @@ if blueCfg.Zones and blueCfg.Zones.MASHZones and blueCfg.Zones.MASHZones[1] then env.info('[DEBUG] blueCfg.Zones.MASHZones[1].name: ' .. tostring(blueCfg.Zones.MASHZones[1].name)) end ctldBlue = _MOOSE_CTLD:New(blueCfg) +env.info('[CTLD_INIT] After BLUE init, salvage = ' .. tostring((CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.BLUE]) or 'nil')) local redCfg = { CoalitionSide = coalition.side.RED, @@ -60,12 +72,23 @@ local redCfg = { }, -- Optional: drive zone activation for RED via per-zone flag/activeWhen - MapDraw = { - Enabled = true, - DrawMASHZones = true, -- Enable MASH zone drawing - }, - - Zones = { + MEDEVAC = { + Enabled = true, + InitialSalvage = 25, -- Starting salvage points for this coalition + MobileMASH = { + Enabled = true, + ZoneRadius = 300, + BeaconFrequency = '30.0 FM', + AnnouncementInterval = 1800, -- Announce position every 30 minutes + }, + }, + + MapDraw = { + Enabled = true, + DrawMASHZones = true, -- Enable MASH zone drawing + }, + + Zones = { PickupZones = { { name = 'RedLoadZone1', flag = 9101, activeWhen = 0 }, { name = "RedLoadZone2", flag = 9104, activeWhen = 0 }, { name = "RedLoadZone3", flag = 9105, activeWhen = 0 }, @@ -85,6 +108,7 @@ if redCfg.Zones and redCfg.Zones.MASHZones and redCfg.Zones.MASHZones[1] then env.info('[DEBUG] redCfg.Zones.MASHZones[1].name: ' .. tostring(redCfg.Zones.MASHZones[1].name)) end ctldRed = _MOOSE_CTLD:New(redCfg) +env.info('[CTLD_INIT] After RED init, salvage = ' .. tostring((CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.RED]) or 'nil')) -- Merge catalog into both CTLD instances if catalog was loaded env.info('[init_mission_dual_coalition] Checking for catalog: '..((_CTLD_EXTRACTED_CATALOG and 'FOUND') or 'NOT FOUND')) @@ -104,6 +128,7 @@ else env.info('[init_mission_dual_coalition] WARNING: _CTLD_EXTRACTED_CATALOG not found - catalog not loaded!') env.info('[init_mission_dual_coalition] Available globals: '..((_G._CTLD_EXTRACTED_CATALOG and 'in _G') or 'not in _G')) end +env.info('[CTLD_INIT] End of init - BLUE salvage: ' .. tostring(CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.BLUE] or 'nil') .. ', RED salvage: ' .. tostring(CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.RED] or 'nil')) else env.info('[init_mission_dual_coalition] Moose or CTLD missing; skipping CTLD init') end diff --git a/DCS_Kola/Operation_Polar_Shield/Moose_CTLD_Init_DualCoalitions.lua b/DCS_Kola/Operation_Polar_Shield/Moose_CTLD_Init_DualCoalitions.lua index 96bfdb6..f0642b6 100644 --- a/DCS_Kola/Operation_Polar_Shield/Moose_CTLD_Init_DualCoalitions.lua +++ b/DCS_Kola/Operation_Polar_Shield/Moose_CTLD_Init_DualCoalitions.lua @@ -25,7 +25,18 @@ local blueCfg = { 'UH-1H','Mi-8MTV2','Mi-24P','SA342M','SA342L','SA342Minigun','UH-60L','CH-47Fbl1','CH-47F','Mi-17','GazelleAI' }, -- Optional: drive zone activation from mission flags (preferred: set per-zone below via flag/activeWhen) - + + MEDEVAC = { + Enabled = true, + InitialSalvage = 25, -- Starting salvage points for this coalition + MobileMASH = { + Enabled = true, + ZoneRadius = 300, + BeaconFrequency = '32.0 FM', + AnnouncementInterval = 300, -- Announce position every 5 minutes + }, + }, + MapDraw = { Enabled = true, DrawMASHZones = true, -- Enable MASH zone drawing @@ -59,6 +70,7 @@ if blueCfg.Zones and blueCfg.Zones.MASHZones and blueCfg.Zones.MASHZones[1] then env.info('[DEBUG] blueCfg.Zones.MASHZones[1].name: ' .. tostring(blueCfg.Zones.MASHZones[1].name)) end ctldBlue = _MOOSE_CTLD:New(blueCfg) +env.info('[CTLD_INIT] After BLUE init, salvage = ' .. tostring((CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.BLUE]) or 'nil')) local redCfg = { CoalitionSide = coalition.side.RED, @@ -69,6 +81,17 @@ local redCfg = { }, -- Optional: drive zone activation for RED via per-zone flag/activeWhen + MEDEVAC = { + Enabled = true, + InitialSalvage = 25, -- Starting salvage points for this coalition + MobileMASH = { + Enabled = true, + ZoneRadius = 300, + BeaconFrequency = '30.0 FM', + AnnouncementInterval = 1800, -- Announce position every 30 minutes + }, + }, + MapDraw = { Enabled = true, DrawMASHZones = true, -- Enable MASH zone drawing @@ -94,6 +117,7 @@ if redCfg.Zones and redCfg.Zones.MASHZones and redCfg.Zones.MASHZones[1] then env.info('[DEBUG] redCfg.Zones.MASHZones[1].name: ' .. tostring(redCfg.Zones.MASHZones[1].name)) end ctldRed = _MOOSE_CTLD:New(redCfg) +env.info('[CTLD_INIT] After RED init, salvage = ' .. tostring((CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.RED]) or 'nil')) -- Merge catalog into both CTLD instances if catalog was loaded env.info('[init_mission_dual_coalition] Checking for catalog: '..((_CTLD_EXTRACTED_CATALOG and 'FOUND') or 'NOT FOUND')) @@ -113,6 +137,7 @@ else env.info('[init_mission_dual_coalition] WARNING: _CTLD_EXTRACTED_CATALOG not found - catalog not loaded!') env.info('[init_mission_dual_coalition] Available globals: '..((_G._CTLD_EXTRACTED_CATALOG and 'in _G') or 'not in _G')) end +env.info('[CTLD_INIT] End of init - BLUE salvage: ' .. tostring(CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.BLUE] or 'nil') .. ', RED salvage: ' .. tostring(CTLD._salvagePoints and CTLD._salvagePoints[coalition.side.RED] or 'nil')) else env.info('[init_mission_dual_coalition] Moose or CTLD missing; skipping CTLD init') end diff --git a/Moose_.lua b/Moose_.lua index 2678209..02ece3c 100644 --- a/Moose_.lua +++ b/Moose_.lua @@ -1,4 +1,4 @@ -env.info('*** MOOSE GITHUB Commit Hash ID: 2025-11-27T18:07:18+01:00-0abb0db2a3e46a509bf3f05ec4960fa84a6fb43c ***') +env.info('*** MOOSE GITHUB Commit Hash ID: 2025-11-28T12:49:54+01:00-7fa360f32c58b62a7c65f093054f17ba638adc80 ***') if not MOOSE_DEVELOPMENT_FOLDER then MOOSE_DEVELOPMENT_FOLDER='Scripts' end @@ -37135,7 +37135,6 @@ TargetIsScenery=true TargetType="Scenery" TargetSceneryObject=TargetUNIT self:T("***** Target is Scenery and TargetUNIT is SCENERY object!") -UTILS.PrintTableToLog(TargetSceneryObject) end TargetUnitCoalition=_SCORINGCoalition[TargetCoalition] TargetUnitCategory=_SCORINGCategory[TargetCategory] @@ -37294,6 +37293,7 @@ local Score=ScoreZoneData.Score if TargetUNIT and ScoreZone:IsVec2InZone(TargetUNIT:GetVec2())then local PlayerName=Event.IniPlayerName or"Ghost" local Player=self.Players[PlayerName] +if Player then Player.Score=Player.Score+Score Player.Score=Player.Score+self.ScoreIncrementOnHit MESSAGE:NewType(self.DisplayMessagePrefix.."hit in zone '"..ScoreZone:GetName().."'.".. @@ -37306,6 +37306,7 @@ end end end end +end function SCORING:_EventOnDeadOrCrash(Event) self:F({Event}) local TargetUnit=nil @@ -72457,7 +72458,7 @@ self.helo=Spawn UsesAliveGroup=true delay=1 else -local Spawn=SPAWN:NewWithAlias(self.helogroupname,self.alias) +Spawn=SPAWN:NewWithAlias(self.helogroupname,self.alias) Spawn:InitModex(self.modex) end if UsesAliveGroup==false and self.takeoff==SPAWN.Takeoff.Air then @@ -72477,6 +72478,7 @@ else self:E(string.format("ERROR: No uncontrolled (alive) rescue helo group with name %s could be found!",self.helogroupname)) return end +end elseif UsesAliveGroup==false then self.helo=Spawn:SpawnAtAirbase(self.airbase,self.takeoff,nil,AIRBASE.TerminalType.HelicopterUsable) if self.takeoff==SPAWN.Takeoff.Runway then @@ -72487,7 +72489,6 @@ elseif self.takeoff==SPAWN.Takeoff.Cold then delay=60 end end -end self.followset=SET_GROUP:New() self.followset:AddGroup(self.helo) self.HeloFuel0=self.helo:GetFuel() @@ -74951,7 +74952,7 @@ CTLD.FixedWingTypes={ ["Mosquito"]="Mosquito", ["C-130J-30"]="C-130J-30", } -CTLD.version="1.3.39" +CTLD.version="1.3.40" function CTLD:New(Coalition,Prefixes,Alias) local self=BASE:Inherit(self,FSM:New()) BASE:T({Coalition,Prefixes,Alias}) @@ -75308,6 +75309,12 @@ if cargo.Name==Name then return cargo end end +for _,_cargo in pairs(self.Cargo_Statics)do +local cargo=_cargo +if cargo.Name==Name then +return cargo +end +end return nil end function CTLD:AddAllowedFixedWingType(typename) @@ -75737,14 +75744,16 @@ self:_GetCrates(Group,Unit,cargoObj,total,false,false,true) return self end function CTLD:_AddCrateQuantityMenus(Group,Unit,parentMenu,cargoObj,stockSummary) +self:T("_AddCrateQuantityMenus "..cargoObj.Name) local needed=cargoObj:GetCratesNeeded()or 1 local stockEntry=self:_GetCrateStockEntry(cargoObj,stockSummary) -local stock=nil +local stock=0 if stockEntry and type(stockEntry.Stock)=="number"then stock=stockEntry.Stock else stock=cargoObj:GetStock() end +self:T("_AddCrateQuantityMenus "..cargoObj.Name.." Stock: "..tostring(stock)) local maxQuantity=self.maxCrateMenuQuantity or 1 local availableSets=nil if type(stock)=="number"and stock>=0 then @@ -75758,6 +75767,7 @@ maxQuantity=availableSets end end maxQuantity=math.floor(maxQuantity) +self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity) if maxQuantity<1 then return self end @@ -75793,6 +75803,7 @@ allowLoad=false maxQuantity=1 end end +self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad)) local maxMassSets=nil if Unit then local maxload=self:_GetMaxLoadableMass(Unit) @@ -75808,10 +75819,12 @@ maxQuantity=maxMassSets end end end +self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad)) if maxQuantity<1 then return self end if maxQuantity==1 then +self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." Menu for MaxQ=1 ".."parentMenu.MenuText = "..parentMenu.MenuText) 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 @@ -75825,10 +75838,13 @@ msg="Crate limit reached" end MENU_GROUP_COMMAND:New(Group,msg,parentMenu,self._SendMessage,self,msg,10,false,Group) end +parentMenu:Refresh() return self end for quantity=1,maxQuantity do +self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." Menu for MaxQ>1") local label=tostring(quantity) +self:T("_AddCrateQuantityMenus Label "..label) 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)) @@ -77618,7 +77634,12 @@ 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) +local txt +if needed>1 then +txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +else +txt=string.format("%s (%dkg)",cargoObj.Name,cargoObj.PerCrateMass or 0) +end if cargoObj.Location then txt=txt.."[R]"end if self.showstockinmenuitems then local suffix=self:_FormatCrateStockSuffix(cargoObj,crateStockSummary) @@ -77628,7 +77649,7 @@ 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 +if self.usesubcats==true then local subcatmenus={} for catName,_ in pairs(self.subcats)do subcatmenus[catName]=MENU_GROUP:New(_group,catName,cratesmenu) @@ -77656,7 +77677,12 @@ 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) +local txt +if needed>1 then +txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +else +txt=string.format("%s (%dkg)",cargoObj.Name,cargoObj.PerCrateMass or 0) +end if cargoObj.Location then txt=txt.."[R]"end local stock=cargoObj:GetStock() if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end @@ -77666,7 +77692,12 @@ 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) +local txt +if needed>1 then +txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +else +txt=string.format("%s (%dkg)",cargoObj.Name,cargoObj.PerCrateMass or 0) +end if cargoObj.Location then txt=txt.."[R]"end local stock=cargoObj:GetStock() if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end @@ -77677,7 +77708,12 @@ 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) +local txt +if needed>1 then +txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +else +txt=string.format("%s (%dkg)",cargoObj.Name,cargoObj.PerCrateMass or 0) +end if cargoObj.Location then txt=txt.."[R]"end local stock=cargoObj:GetStock() if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end @@ -77687,7 +77723,12 @@ 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) +local txt +if needed>1 then +txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +else +txt=string.format("%s (%dkg)",cargoObj.Name,cargoObj.PerCrateMass or 0) +end if cargoObj.Location then txt=txt.."[R]"end local stock=cargoObj:GetStock() if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end