mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
Update CTLD.lua
Option to unload single cargo items by @lekaa
This commit is contained in:
parent
1156971d94
commit
f74d25b31c
@ -2356,6 +2356,7 @@ function CTLD:_LoadTroops(Group, Unit, Cargotype, Inject)
|
|||||||
table.insert(loaded.Cargo,loadcargotype)
|
table.insert(loaded.Cargo,loadcargotype)
|
||||||
self.Loaded_Cargo[unitname] = loaded
|
self.Loaded_Cargo[unitname] = loaded
|
||||||
self:_SendMessage("Troops boarded!", 10, false, Group)
|
self:_SendMessage("Troops boarded!", 10, false, Group)
|
||||||
|
self:_RefreshDropTroopsMenu(Group,Unit)
|
||||||
self:__TroopsPickedUp(1,Group, Unit, Cargotype)
|
self:__TroopsPickedUp(1,Group, Unit, Cargotype)
|
||||||
self:_UpdateUnitCargoMass(Unit)
|
self:_UpdateUnitCargoMass(Unit)
|
||||||
Cargotype:RemoveStock()
|
Cargotype:RemoveStock()
|
||||||
@ -2590,6 +2591,7 @@ end
|
|||||||
self.Loaded_Cargo[unitname] = loaded
|
self.Loaded_Cargo[unitname] = loaded
|
||||||
self:ScheduleOnce(running,self._SendMessage,self,"Troops boarded!", 10, false, Group)
|
self:ScheduleOnce(running,self._SendMessage,self,"Troops boarded!", 10, false, Group)
|
||||||
self:_SendMessage("Troops boarding!", 10, false, Group)
|
self:_SendMessage("Troops boarding!", 10, false, Group)
|
||||||
|
self:_RefreshDropTroopsMenu(Group,Unit)
|
||||||
self:_UpdateUnitCargoMass(Unit)
|
self:_UpdateUnitCargoMass(Unit)
|
||||||
local groupname = nearestGroup:GetName()
|
local groupname = nearestGroup:GetName()
|
||||||
self:__TroopsExtracted(running,Group, Unit, nearestGroup, groupname)
|
self:__TroopsExtracted(running,Group, Unit, nearestGroup, groupname)
|
||||||
@ -3639,6 +3641,7 @@ function CTLD:_UnloadTroops(Group, Unit)
|
|||||||
end
|
end
|
||||||
self.Loaded_Cargo[unitname] = nil
|
self.Loaded_Cargo[unitname] = nil
|
||||||
self.Loaded_Cargo[unitname] = loaded
|
self.Loaded_Cargo[unitname] = loaded
|
||||||
|
self:_RefreshDropTroopsMenu(Group,Unit)
|
||||||
self:_UpdateUnitCargoMass(Unit)
|
self:_UpdateUnitCargoMass(Unit)
|
||||||
else
|
else
|
||||||
if IsHerc then
|
if IsHerc then
|
||||||
@ -3721,6 +3724,7 @@ function CTLD:_UnloadCrates(Group, Unit)
|
|||||||
self.Loaded_Cargo[unitname] = loaded
|
self.Loaded_Cargo[unitname] = loaded
|
||||||
|
|
||||||
self:_UpdateUnitCargoMass(Unit)
|
self:_UpdateUnitCargoMass(Unit)
|
||||||
|
self:_RefreshDropCratesMenu(Group,Unit)
|
||||||
else
|
else
|
||||||
if IsHerc then
|
if IsHerc then
|
||||||
self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group)
|
self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group)
|
||||||
@ -4093,24 +4097,24 @@ end
|
|||||||
-- @return #CTLD self
|
-- @return #CTLD self
|
||||||
function CTLD:_RefreshF10Menus()
|
function CTLD:_RefreshF10Menus()
|
||||||
self:T(self.lid .. " _RefreshF10Menus")
|
self:T(self.lid .. " _RefreshF10Menus")
|
||||||
local PlayerSet = self.PilotGroups -- Core.Set#SET_GROUP
|
|
||||||
local PlayerTable = PlayerSet:GetSetObjects() -- #table of #GROUP objects
|
-- 1) Gather all the pilot groups from our Set
|
||||||
-- rebuild units table
|
local PlayerSet = self.PilotGroups
|
||||||
|
local PlayerTable = PlayerSet:GetSetObjects()
|
||||||
|
|
||||||
|
-- 2) Rebuild the self.CtldUnits table
|
||||||
local _UnitList = {}
|
local _UnitList = {}
|
||||||
for _key, _group in pairs (PlayerTable) do
|
for _, groupObj in pairs(PlayerTable) do
|
||||||
local _unit = _group:GetFirstUnitAlive() -- Wrapper.Unit#UNIT Asume that there is only one unit in the flight for players
|
local firstUnit = groupObj:GetFirstUnitAlive()
|
||||||
if _unit then
|
if firstUnit then
|
||||||
if _unit:IsAlive() and _unit:IsPlayer() then
|
if firstUnit:IsPlayer() then
|
||||||
if _unit:IsHelicopter() or (self:IsHercules(_unit) and self.enableHercules) then --ensure no stupid unit entries here
|
if firstUnit:IsHelicopter() or (self.enableHercules and self:IsHercules(firstUnit)) then
|
||||||
local unitName = _unit:GetName()
|
local _unit = firstUnit:GetName()
|
||||||
_UnitList[unitName] = unitName
|
_UnitList[_unit] = _unit
|
||||||
else
|
end
|
||||||
local unitName = _unit:GetName()
|
end
|
||||||
_UnitList[unitName] = nil
|
end
|
||||||
end
|
end
|
||||||
end -- end isAlive
|
|
||||||
end -- end if _unit
|
|
||||||
end -- end for
|
|
||||||
self.CtldUnits = _UnitList
|
self.CtldUnits = _UnitList
|
||||||
|
|
||||||
-- subcats?
|
-- subcats?
|
||||||
@ -4135,207 +4139,555 @@ function CTLD:_RefreshF10Menus()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- build unit menus
|
|
||||||
local menucount = 0
|
local menucount = 0
|
||||||
local menus = {}
|
local menus = {}
|
||||||
for _, _unitName in pairs(self.CtldUnits) do
|
for _, _unitName in pairs(self.CtldUnits) do
|
||||||
if (not self.MenusDone[_unitName]) or (self.showstockinmenuitems == true) then
|
if (not self.MenusDone[_unitName]) or (self.showstockinmenuitems == true) then
|
||||||
local _unit = UNIT:FindByName(_unitName) -- Wrapper.Unit#UNIT
|
local _unit = UNIT:FindByName(_unitName)
|
||||||
if _unit then
|
if _unit and _unit:IsAlive() then
|
||||||
local _group = _unit:GetGroup() -- Wrapper.Group#GROUP
|
local _group = _unit:GetGroup()
|
||||||
if _group then
|
if _group then
|
||||||
-- get chopper capabilities
|
local capabilities = self:_GetUnitCapabilities(_unit)
|
||||||
local unittype = _unit:GetTypeName()
|
|
||||||
local capabilities = self:_GetUnitCapabilities(_unit) -- #CTLD.UnitTypeCapabilities
|
|
||||||
local cantroops = capabilities.troops
|
local cantroops = capabilities.troops
|
||||||
local cancrates = capabilities.crates
|
local cancrates = capabilities.crates
|
||||||
|
local unittype = _unit:GetTypeName()
|
||||||
local isHook = self:IsHook(_unit)
|
local isHook = self:IsHook(_unit)
|
||||||
--local nohookswitch = not (isHook and self.enableChinookGCLoading)
|
|
||||||
local nohookswitch = true
|
local nohookswitch = true
|
||||||
-- top menu
|
--local nohookswitch = not (isHook and self.enableChinookGCLoading)
|
||||||
|
-- Clear old topmenu if it existed
|
||||||
if _group.CTLDTopmenu then
|
if _group.CTLDTopmenu then
|
||||||
_group.CTLDTopmenu:Remove()
|
_group.CTLDTopmenu:Remove()
|
||||||
_group.CTLDTopmenu = nil
|
_group.CTLDTopmenu = nil
|
||||||
end
|
end
|
||||||
local topmenu = MENU_GROUP:New(_group,"CTLD",nil)
|
|
||||||
_group.CTLDTopmenu = topmenu
|
|
||||||
local toptroops = nil
|
local toptroops = nil
|
||||||
local topcrates = nil
|
local topcrates = nil
|
||||||
|
local topmenu = MENU_GROUP:New(_group, "CTLD", nil)
|
||||||
|
_group.CTLDTopmenu = topmenu
|
||||||
|
|
||||||
if cantroops then
|
if cantroops then
|
||||||
toptroops = MENU_GROUP:New(_group,"Manage Troops",topmenu)
|
local toptroops = MENU_GROUP:New(_group, "Manage Troops", topmenu)
|
||||||
end
|
|
||||||
if cancrates then
|
|
||||||
topcrates = MENU_GROUP:New(_group,"Manage Crates",topmenu)
|
|
||||||
end
|
|
||||||
local listmenu = MENU_GROUP_COMMAND:New(_group,"List boarded cargo",topmenu, self._ListCargo, self, _group, _unit)
|
|
||||||
local invtry = MENU_GROUP_COMMAND:New(_group,"Inventory",topmenu, self._ListInventory, self, _group, _unit)
|
|
||||||
local rbcns = MENU_GROUP_COMMAND:New(_group,"List active zone beacons",topmenu, self._ListRadioBeacons, self, _group, _unit)
|
|
||||||
local smoketopmenu = MENU_GROUP:New(_group,"Smokes, Flares, Beacons",topmenu)
|
|
||||||
local smokemenu = MENU_GROUP_COMMAND:New(_group,"Smoke zones nearby",smoketopmenu, self.SmokeZoneNearBy, self, _unit, false)
|
|
||||||
local smokeself = MENU_GROUP:New(_group,"Drop smoke now",smoketopmenu)
|
|
||||||
local smokeselfred = MENU_GROUP_COMMAND:New(_group,"Red smoke",smokeself, self.SmokePositionNow, self, _unit, false,SMOKECOLOR.Red)
|
|
||||||
local smokeselfblue = MENU_GROUP_COMMAND:New(_group,"Blue smoke",smokeself, self.SmokePositionNow, self, _unit, false,SMOKECOLOR.Blue)
|
|
||||||
local smokeselfgreen = MENU_GROUP_COMMAND:New(_group,"Green smoke",smokeself, self.SmokePositionNow, self, _unit, false,SMOKECOLOR.Green)
|
|
||||||
local smokeselforange = MENU_GROUP_COMMAND:New(_group,"Orange smoke",smokeself, self.SmokePositionNow, self, _unit, false,SMOKECOLOR.Orange)
|
|
||||||
local smokeselfwhite = MENU_GROUP_COMMAND:New(_group,"White smoke",smokeself, self.SmokePositionNow, self, _unit, false,SMOKECOLOR.White)
|
|
||||||
local flaremenu = MENU_GROUP_COMMAND:New(_group,"Flare zones nearby",smoketopmenu, self.SmokeZoneNearBy, self, _unit, true)
|
|
||||||
local flareself = MENU_GROUP_COMMAND:New(_group,"Fire flare now",smoketopmenu, self.SmokePositionNow, self, _unit, true)
|
|
||||||
local beaconself = MENU_GROUP_COMMAND:New(_group,"Drop beacon now",smoketopmenu, self.DropBeaconNow, self, _unit):Refresh()
|
|
||||||
-- sub menus
|
|
||||||
-- sub menu troops management
|
|
||||||
if cantroops then
|
|
||||||
local troopsmenu = MENU_GROUP:New(_group, "Load troops", toptroops)
|
local troopsmenu = MENU_GROUP:New(_group, "Load troops", toptroops)
|
||||||
if self.usesubcats then
|
_group.MyTopTroopsMenu = toptroops
|
||||||
local subcatmenus = {}
|
|
||||||
for _name,_entry in pairs(self.subcatsTroop) do
|
|
||||||
subcatmenus[_name] = MENU_GROUP:New(_group,_name,troopsmenu)
|
|
||||||
end
|
|
||||||
for _,_entry in pairs(self.Cargo_Troops) do
|
|
||||||
local entry = _entry -- #CTLD_CARGO
|
|
||||||
local subcat = entry.Subcategory
|
|
||||||
local noshow = entry.DontShowInMenu
|
|
||||||
local stock = _entry:GetStock()
|
|
||||||
if not noshow then
|
|
||||||
menucount = menucount + 1
|
|
||||||
local menutext = entry.Name
|
|
||||||
if stock >= 0 and self.showstockinmenuitems == true then
|
|
||||||
menutext = menutext.." ["..stock.."]"
|
|
||||||
end
|
|
||||||
menus[menucount] = MENU_GROUP_COMMAND:New(_group,menutext,subcatmenus[subcat],self._LoadTroops, self, _group, _unit, entry)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
for _,_entry in pairs(self.Cargo_Troops) do
|
|
||||||
local entry = _entry -- #CTLD_CARGO
|
|
||||||
local noshow = entry.DontShowInMenu
|
|
||||||
local stock = _entry:GetStock()
|
|
||||||
if not noshow then
|
|
||||||
menucount = menucount + 1
|
|
||||||
local menutext = entry.Name
|
|
||||||
if stock >= 0 and self.showstockinmenuitems == true then
|
|
||||||
menutext = menutext.." ["..stock.."]"
|
|
||||||
end
|
|
||||||
menus[menucount] = MENU_GROUP_COMMAND:New(_group,menutext,troopsmenu,self._LoadTroops, self, _group, _unit, entry)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local unloadmenu1 = MENU_GROUP_COMMAND:New(_group,"Drop troops",toptroops, self._UnloadTroops, self, _group, _unit):Refresh()
|
|
||||||
local extractMenu1 = MENU_GROUP_COMMAND:New(_group, "Extract troops", toptroops, self._ExtractTroops, self, _group, _unit):Refresh()
|
|
||||||
end
|
|
||||||
-- sub menu crates management
|
|
||||||
if cancrates then
|
|
||||||
if nohookswitch then
|
|
||||||
local loadmenu = MENU_GROUP_COMMAND:New(_group,"Load crates",topcrates, self._LoadCratesNearby, self, _group, _unit)
|
|
||||||
end
|
|
||||||
local cratesmenu = MENU_GROUP:New(_group,"Get Crates",topcrates)
|
|
||||||
local packmenu = MENU_GROUP_COMMAND:New(_group, "Pack crates", topcrates, self._PackCratesNearby, self, _group, _unit)
|
|
||||||
local removecratesmenu = MENU_GROUP:New(_group, "Remove crates", topcrates)
|
|
||||||
|
|
||||||
if self.usesubcats then
|
if self.usesubcats then
|
||||||
local subcatmenus = {}
|
local subcatmenus = {}
|
||||||
for _name,_entry in pairs(self.subcats) do
|
for catName, _ in pairs(self.subcatsTroop) do
|
||||||
subcatmenus[_name] = MENU_GROUP:New(_group,_name,cratesmenu)
|
subcatmenus[catName] = MENU_GROUP:New(_group, catName, troopsmenu)
|
||||||
end
|
end
|
||||||
for _,_entry in pairs(self.Cargo_Crates) do
|
for _, cargoObj in pairs(self.Cargo_Troops) do
|
||||||
local entry = _entry -- #CTLD_CARGO
|
if not cargoObj.DontShowInMenu then
|
||||||
local subcat = entry.Subcategory
|
local stock = cargoObj:GetStock()
|
||||||
local noshow = entry.DontShowInMenu
|
local menutext = cargoObj.Name
|
||||||
local zone = entry.Location
|
if (stock >= 0) and (self.showstockinmenuitems == true) then menutext = menutext.." ["..stock.."]" end
|
||||||
local stock = _entry:GetStock()
|
MENU_GROUP_COMMAND:New(_group, menutext, subcatmenus[cargoObj.Subcategory], self._LoadTroops, self, _group, _unit, cargoObj)
|
||||||
if not noshow then
|
|
||||||
menucount = menucount + 1
|
|
||||||
local menutext = string.format("Crate %s (%dkg)",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
if zone then
|
|
||||||
menutext = string.format("Crate %s (%dkg)[R]",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
end
|
|
||||||
if stock >= 0 and self.showstockinmenuitems == true then
|
|
||||||
menutext = menutext.."["..stock.."]"
|
|
||||||
end
|
|
||||||
menus[menucount] = MENU_GROUP_COMMAND:New(_group,menutext,subcatmenus[subcat],self._GetCrates, self, _group, _unit, entry)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for _,_entry in pairs(self.Cargo_Statics) do
|
|
||||||
local entry = _entry -- #CTLD_CARGO
|
|
||||||
local subcat = entry.Subcategory
|
|
||||||
local noshow = entry.DontShowInMenu
|
|
||||||
local zone = entry.Location
|
|
||||||
local stock = _entry:GetStock()
|
|
||||||
if not noshow then
|
|
||||||
menucount = menucount + 1
|
|
||||||
local menutext = string.format("Crate %s (%dkg)",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
if zone then
|
|
||||||
menutext = string.format("Crate %s (%dkg)[R]",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
end
|
|
||||||
if stock >= 0 and self.showstockinmenuitems == true then
|
|
||||||
menutext = menutext.."["..stock.."]"
|
|
||||||
end
|
|
||||||
menus[menucount] = MENU_GROUP_COMMAND:New(_group,menutext,subcatmenus[subcat],self._GetCrates, self, _group, _unit, entry)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
for _,_entry in pairs(self.Cargo_Crates) do
|
for _, cargoObj in pairs(self.Cargo_Troops) do
|
||||||
local entry = _entry -- #CTLD_CARGO
|
if not cargoObj.DontShowInMenu then
|
||||||
local noshow = entry.DontShowInMenu
|
local stock = cargoObj:GetStock()
|
||||||
local zone = entry.Location
|
local menutext = cargoObj.Name
|
||||||
local stock = _entry:GetStock()
|
if (stock >= 0) and (self.showstockinmenuitems == true) then menutext = menutext.." ["..stock.."]" end
|
||||||
if not noshow then
|
MENU_GROUP_COMMAND:New(_group, menutext, troopsmenu, self._LoadTroops, self, _group, _unit, cargoObj)
|
||||||
menucount = menucount + 1
|
|
||||||
local menutext = string.format("Crate %s (%dkg)",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
if zone then
|
|
||||||
menutext = string.format("Crate %s (%dkg)[R]",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
end
|
|
||||||
if stock >= 0 and self.showstockinmenuitems == true then
|
|
||||||
menutext = menutext.."["..stock.."]"
|
|
||||||
end
|
|
||||||
menus[menucount] = MENU_GROUP_COMMAND:New(_group,menutext,cratesmenu,self._GetCrates, self, _group, _unit, entry)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for _,_entry in pairs(self.Cargo_Statics) do
|
|
||||||
local entry = _entry -- #CTLD_CARGO
|
|
||||||
local noshow = entry.DontShowInMenu
|
|
||||||
local zone = entry.Location
|
|
||||||
local stock = _entry:GetStock()
|
|
||||||
if not noshow then
|
|
||||||
menucount = menucount + 1
|
|
||||||
local menutext = string.format("Crate %s (%dkg)",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
if zone then
|
|
||||||
menutext = string.format("Crate %s (%dkg)[R]",entry.Name,entry.PerCrateMass or 0)
|
|
||||||
end
|
|
||||||
if stock >= 0 and self.showstockinmenuitems == true then
|
|
||||||
menutext = menutext.."["..stock.."]"
|
|
||||||
end
|
|
||||||
menus[menucount] = MENU_GROUP_COMMAND:New(_group,menutext,cratesmenu,self._GetCrates, self, _group, _unit, entry)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
listmenu = MENU_GROUP_COMMAND:New(_group,"List crates nearby",topcrates, self._ListCratesNearby, self, _group, _unit)
|
local dropTroopsMenu=MENU_GROUP:New(_group,"Drop Troops",toptroops):Refresh()
|
||||||
local removecrates = MENU_GROUP_COMMAND:New(_group,"Remove crates nearby",removecratesmenu, self._RemoveCratesNearby, self, _group, _unit)
|
MENU_GROUP_COMMAND:New(_group,"Drop ALL troops",dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh()
|
||||||
local unloadmenu
|
MENU_GROUP_COMMAND:New(_group,"Extract troops",toptroops,self._ExtractTroops,self,_group,_unit):Refresh()
|
||||||
if nohookswitch then
|
local uName=_unit:GetName()
|
||||||
unloadmenu = MENU_GROUP_COMMAND:New(_group,"Drop crates",topcrates, self._UnloadCrates, self, _group, _unit)
|
local loadedData=self.Loaded_Cargo[uName]
|
||||||
|
if loadedData and loadedData.Cargo then
|
||||||
|
for i,cargoObj in ipairs(loadedData.Cargo) do
|
||||||
|
if cargoObj and (cargoObj:GetType()==CTLD_CARGO.Enum.TROOPS or cargoObj:GetType()==CTLD_CARGO.Enum.ENGINEERS) and not cargoObj:WasDropped() then
|
||||||
|
local name=cargoObj:GetName() or "Unknown"
|
||||||
|
local needed=cargoObj:GetCratesNeeded() or 1
|
||||||
|
local cID=cargoObj:GetID()
|
||||||
|
local line=string.format("Drop: %s",name,needed,cID)
|
||||||
|
MENU_GROUP_COMMAND:New(_group,line,dropTroopsMenu,self._UnloadSingleTroopByID,self,_group,_unit,cID):Refresh()
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if cancrates then
|
||||||
|
local topcrates = MENU_GROUP:New(_group, "Manage Crates", topmenu)
|
||||||
|
local cratesmenu = MENU_GROUP:New(_group, "Get Crates", topcrates)
|
||||||
|
_group.MyTopCratesMenu = topcrates
|
||||||
|
|
||||||
|
-- Show "Load crates" on 1 line
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Load crates", topcrates, self._LoadCratesNearby, self, _group, _unit)
|
||||||
|
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Pack crates", topcrates, self._PackCratesNearby, self, _group, _unit)
|
||||||
|
local removecratesmenu = MENU_GROUP:New(_group, "Remove crates", topcrates)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Remove crates nearby", removecratesmenu, self._RemoveCratesNearby, self, _group, _unit)
|
||||||
|
|
||||||
|
-- Build the “Get Crates” sub-menu items
|
||||||
|
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 txt = string.format("Crate %s (%dkg)", 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
|
||||||
|
MENU_GROUP_COMMAND:New(_group, txt, subcatmenus[cargoObj.Subcategory], self._GetCrates, self, _group, _unit, cargoObj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _, cargoObj in pairs(self.Cargo_Statics) do
|
||||||
|
if not cargoObj.DontShowInMenu then
|
||||||
|
local txt = string.format("Crate %s (%dkg)", 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
|
||||||
|
MENU_GROUP_COMMAND:New(_group, txt, subcatmenus[cargoObj.Subcategory], self._GetCrates, self, _group, _unit, cargoObj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for _, cargoObj in pairs(self.Cargo_Crates) do
|
||||||
|
if not cargoObj.DontShowInMenu then
|
||||||
|
local txt = string.format("Crate %s (%dkg)", 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
|
||||||
|
MENU_GROUP_COMMAND:New(_group, txt, cratesmenu, self._GetCrates, self, _group, _unit, cargoObj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _, cargoObj in pairs(self.Cargo_Statics) do
|
||||||
|
if not cargoObj.DontShowInMenu then
|
||||||
|
local txt = string.format("Crate %s (%dkg)", 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
|
||||||
|
MENU_GROUP_COMMAND:New(_group, txt, cratesmenu, self._GetCrates, self, _group, _unit, cargoObj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "List crates nearby", topcrates, self._ListCratesNearby, self, _group, _unit)
|
||||||
|
|
||||||
if not self.nobuildmenu then
|
if not self.nobuildmenu then
|
||||||
local buildmenu = MENU_GROUP_COMMAND:New(_group,"Build crates",topcrates, self._BuildCrates, self, _group, _unit)
|
MENU_GROUP_COMMAND:New(_group, "Repair", topcrates, self._RepairCrates, self, _group, _unit):Refresh()
|
||||||
local repairmenu = MENU_GROUP_COMMAND:New(_group,"Repair",topcrates, self._RepairCrates, self, _group, _unit):Refresh()
|
MENU_GROUP_COMMAND:New(_group, "Build crates", topcrates, self._BuildCrates, self, _group, _unit)
|
||||||
elseif unloadmenu then
|
end
|
||||||
unloadmenu:Refresh()
|
-- Drop Crates sub-menu
|
||||||
|
local dropCratesMenu = MENU_GROUP:New(_group, "Drop Crates", topcrates)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Drop ALL crates", dropCratesMenu, self._UnloadCrates, self, _group, _unit)
|
||||||
|
|
||||||
|
local uName = _unit:GetName()
|
||||||
|
local loadedData = self.Loaded_Cargo[uName]
|
||||||
|
if loadedData and loadedData.Cargo then
|
||||||
|
local cargoByName = {}
|
||||||
|
for _, cgo in pairs(loadedData.Cargo) do
|
||||||
|
if cgo and (not cgo:WasDropped()) then
|
||||||
|
local cname = cgo:GetName()
|
||||||
|
local cneeded = cgo:GetCratesNeeded()
|
||||||
|
cargoByName[cname] = cargoByName[cname] or { count=0, needed=cneeded }
|
||||||
|
cargoByName[cname].count = cargoByName[cname].count + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
for name, info in pairs(cargoByName) do
|
||||||
|
local line = string.format("Drop %s (%d/%d)", name, info.count, info.needed)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, line, dropCratesMenu, self._UnloadSingleCrate, self, _group, _unit, name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-----------------------------------------------------
|
||||||
|
-- Misc sub‐menus
|
||||||
|
-----------------------------------------------------
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "List boarded cargo", topmenu, self._ListCargo, self, _group, _unit)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Inventory", topmenu, self._ListInventory, self, _group, _unit)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "List active zone beacons", topmenu, self._ListRadioBeacons, self, _group, _unit)
|
||||||
|
|
||||||
|
local smoketopmenu = MENU_GROUP:New(_group, "Smokes, Flares, Beacons", topmenu)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Smoke zones nearby", smoketopmenu, self.SmokeZoneNearBy, self, _unit, false)
|
||||||
|
local smokeself = MENU_GROUP:New(_group, "Drop smoke now", smoketopmenu)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Red smoke", smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Red)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Blue smoke", smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Blue)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Green smoke", smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Green)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Orange smoke", smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.Orange)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "White smoke", smokeself, self.SmokePositionNow, self, _unit, false, SMOKECOLOR.White)
|
||||||
|
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Flare zones nearby", smoketopmenu, self.SmokeZoneNearBy, self, _unit, true)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Fire flare now", smoketopmenu, self.SmokePositionNow, self, _unit, true)
|
||||||
|
MENU_GROUP_COMMAND:New(_group, "Drop beacon now", smoketopmenu, self.DropBeaconNow, self, _unit):Refresh()
|
||||||
|
|
||||||
if self:IsHercules(_unit) then
|
if self:IsHercules(_unit) then
|
||||||
local hoverpars = MENU_GROUP_COMMAND:New(_group,"Show flight parameters",topmenu, self._ShowFlightParams, self, _group, _unit):Refresh()
|
MENU_GROUP_COMMAND:New(_group, "Show flight parameters", topmenu, self._ShowFlightParams, self, _group, _unit):Refresh()
|
||||||
else
|
else
|
||||||
local hoverpars = MENU_GROUP_COMMAND:New(_group,"Show hover parameters",topmenu, self._ShowHoverParams, self, _group, _unit):Refresh()
|
MENU_GROUP_COMMAND:New(_group, "Show hover parameters", topmenu, self._ShowHoverParams, self, _group, _unit):Refresh()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Mark we built the menu
|
||||||
self.MenusDone[_unitName] = true
|
self.MenusDone[_unitName] = true
|
||||||
end -- end group
|
|
||||||
end -- end unit
|
end -- if _group
|
||||||
else -- menu build check
|
end -- if _unit
|
||||||
|
else
|
||||||
self:T(self.lid .. " Menus already done for this group!")
|
self:T(self.lid .. " Menus already done for this group!")
|
||||||
end -- end menu build check
|
end
|
||||||
end -- end for
|
end -- for all pilot units
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function CTLD:_UnloadSingleCrate(Group, Unit, CrateName)
|
||||||
|
if not self.dropcratesanywhere then
|
||||||
|
local inzone, zoneName, zone, distance = self:IsUnitInZone(Unit, CTLD.CargoZoneType.DROP)
|
||||||
|
if not inzone then
|
||||||
|
self:_SendMessage("You are not close enough to a drop zone!", 10, false, Group)
|
||||||
|
if not self.debug then
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then
|
||||||
|
self:_SendMessage("You need to open the door(s) to drop cargo!", 10, false, Group)
|
||||||
|
if not self.debug then return self end
|
||||||
|
end
|
||||||
|
local grounded = not self:IsUnitInAir(Unit)
|
||||||
|
local hoverunload = self:IsCorrectHover(Unit)
|
||||||
|
local isHerc = self:IsHercules(Unit)
|
||||||
|
local isHook = self:IsHook(Unit)
|
||||||
|
if isHerc and not isHook then
|
||||||
|
hoverunload = self:IsCorrectFlightParameters(Unit)
|
||||||
|
end
|
||||||
|
if not grounded and not hoverunload then
|
||||||
|
if isHerc then
|
||||||
|
self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group)
|
||||||
|
else
|
||||||
|
self:_SendMessage("Nothing loaded or not hovering within parameters!", 10, false, Group)
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
local unitName = Unit:GetName()
|
||||||
|
local loadedData = self.Loaded_Cargo[unitName]
|
||||||
|
if not loadedData or not loadedData.Cargo then
|
||||||
|
self:_SendMessage("Nothing loaded!", 10, false, Group)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
local cargoList = loadedData.Cargo
|
||||||
|
local needed = 0
|
||||||
|
for _, cObj in ipairs(cargoList) do
|
||||||
|
if cObj:GetName() == CrateName and not cObj:WasDropped() then
|
||||||
|
needed = cObj:GetCratesNeeded() or 1
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if needed < 1 then
|
||||||
|
self:_SendMessage(string.format("No %s crate found or already dropped!", CrateName), 10, false, Group)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
local matched = {}
|
||||||
|
for _, cObj in ipairs(cargoList) do
|
||||||
|
local t = cObj:GetType()
|
||||||
|
if t ~= CTLD_CARGO.Enum.TROOPS
|
||||||
|
and t ~= CTLD_CARGO.Enum.ENGINEERS
|
||||||
|
and t ~= CTLD_CARGO.Enum.GCLOADABLE
|
||||||
|
and (not cObj:WasDropped() or self.allowcratepickupagain)
|
||||||
|
and cObj:GetName() == CrateName
|
||||||
|
then
|
||||||
|
table.insert(matched, cObj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #matched < needed then
|
||||||
|
self:_SendMessage(string.format("You only have %d of %d %s crates needed!", #matched, needed, CrateName), 10, false, Group)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
local crateToUse = matched[1]
|
||||||
|
self:_GetCrates(Group, Unit, crateToUse, needed, true)
|
||||||
|
local used = 0
|
||||||
|
for _, cObj in ipairs(matched) do
|
||||||
|
if used < needed then
|
||||||
|
used = used + 1
|
||||||
|
cObj:SetWasDropped(true)
|
||||||
|
cObj:SetHasMoved(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local newList = {}
|
||||||
|
local newCratesCount = 0
|
||||||
|
for _, cObj in ipairs(cargoList) do
|
||||||
|
if not cObj:WasDropped() then
|
||||||
|
table.insert(newList, cObj)
|
||||||
|
local ct = cObj:GetType()
|
||||||
|
if ct ~= CTLD_CARGO.Enum.TROOPS and ct ~= CTLD_CARGO.Enum.ENGINEERS then
|
||||||
|
newCratesCount = newCratesCount + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
loadedData.Cargo = newList
|
||||||
|
loadedData.Cratesloaded = newCratesCount
|
||||||
|
self.Loaded_Cargo[unitName] = loadedData
|
||||||
|
self:_UpdateUnitCargoMass(Unit)
|
||||||
|
self:_RefreshDropCratesMenu(Group,Unit)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function CTLD:_RefreshDropCratesMenu(Group, Unit)
|
||||||
|
local theGroup = Group
|
||||||
|
local theUnit = Unit
|
||||||
|
if not theGroup.CTLDTopmenu then return end
|
||||||
|
local topCrates = theGroup.MyTopCratesMenu
|
||||||
|
if not topCrates then return end
|
||||||
|
if topCrates.DropCratesMenu then topCrates.DropCratesMenu:Remove() end
|
||||||
|
local dropCratesMenu = MENU_GROUP:New(theGroup, "Drop Crates", topCrates)
|
||||||
|
topCrates.DropCratesMenu = dropCratesMenu
|
||||||
|
MENU_GROUP_COMMAND:New(theGroup, "Drop ALL crates", dropCratesMenu, self._UnloadCrates, self, theGroup, theUnit)
|
||||||
|
local loadedData = self.Loaded_Cargo[Unit:GetName()]
|
||||||
|
if loadedData and loadedData.Cargo then
|
||||||
|
local cargoByName = {}
|
||||||
|
for _, cargoObj in pairs(loadedData.Cargo) do
|
||||||
|
if cargoObj and not cargoObj:WasDropped() then
|
||||||
|
local ctype = cargoObj:GetType()
|
||||||
|
if ctype ~= CTLD_CARGO.Enum.TROOPS and ctype ~= CTLD_CARGO.Enum.ENGINEERS and ctype ~= CTLD_CARGO.Enum.GCLOADABLE then
|
||||||
|
local cName = cargoObj:GetName()
|
||||||
|
local needed = cargoObj:GetCratesNeeded() or 1
|
||||||
|
if not cargoByName[cName] then
|
||||||
|
cargoByName[cName] = {count = 0, needed = needed}
|
||||||
|
end
|
||||||
|
cargoByName[cName].count = cargoByName[cName].count + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for name, info in pairs(cargoByName) do
|
||||||
|
local line = string.format("Drop %s (%d/%d)", name, info.count, info.needed)
|
||||||
|
MENU_GROUP_COMMAND:New(theGroup, line, dropCratesMenu, self._UnloadSingleCrate, self, theGroup, theUnit, name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function CTLD:_UnloadSingleTroopByID(Group, Unit, cargoID)
|
||||||
|
self:T(self.lid .. " _UnloadSingleTroopByID for cargo ID " .. tostring(cargoID))
|
||||||
|
|
||||||
|
-- check if we are in LOAD zone
|
||||||
|
local droppingatbase = false
|
||||||
|
local canunload = true
|
||||||
|
|
||||||
|
-- Door check
|
||||||
|
if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then
|
||||||
|
self:_SendMessage("You need to open the door(s) to unload troops!", 10, false, Group)
|
||||||
|
if not self.debug then return self end
|
||||||
|
end
|
||||||
|
|
||||||
|
local inzone, zonename, zone, distance = self:IsUnitInZone(Unit, CTLD.CargoZoneType.LOAD)
|
||||||
|
if not inzone then
|
||||||
|
inzone, zonename, zone, distance = self:IsUnitInZone(Unit, CTLD.CargoZoneType.SHIP)
|
||||||
|
end
|
||||||
|
if inzone then
|
||||||
|
droppingatbase = true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check for hover unload
|
||||||
|
local hoverunload = self:IsCorrectHover(Unit) -- if true we\'re hovering in parameters
|
||||||
|
local IsHerc = self:IsHercules(Unit)
|
||||||
|
local IsHook = self:IsHook(Unit)
|
||||||
|
if IsHerc and (not IsHook) then
|
||||||
|
-- no hover but airdrop here
|
||||||
|
hoverunload = self:IsCorrectFlightParameters(Unit)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check if we\'re landed
|
||||||
|
local grounded = not self:IsUnitInAir(Unit)
|
||||||
|
-- Get what we have loaded
|
||||||
|
local unitname = Unit:GetName()
|
||||||
|
|
||||||
|
if self.Loaded_Cargo[unitname] and (grounded or hoverunload) then
|
||||||
|
if not droppingatbase or self.debug then
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
-- (NEW CODE FOR SINGLE DROP)
|
||||||
|
-- Instead of dropping ALL troop cargo, we only drop the one matching cargoID.
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
local loadedCargoData = self.Loaded_Cargo[unitname] or {} -- #CTLD.LoadedCargo
|
||||||
|
local cargoList = loadedCargoData.Cargo or {}
|
||||||
|
|
||||||
|
local foundCargo = nil
|
||||||
|
for _, cargoObj in ipairs(cargoList) do
|
||||||
|
if (cargoObj:GetType() == CTLD_CARGO.Enum.TROOPS or cargoObj:GetType() == CTLD_CARGO.Enum.ENGINEERS)
|
||||||
|
and not cargoObj:WasDropped()
|
||||||
|
and (cargoObj:GetID() == cargoID)
|
||||||
|
then
|
||||||
|
foundCargo = cargoObj
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if foundCargo then
|
||||||
|
local cType = foundCargo:GetType()
|
||||||
|
local name = foundCargo:GetName() or "none"
|
||||||
|
local temptable = foundCargo:GetTemplates() or {}
|
||||||
|
local zoneradius = self.troopdropzoneradius or 100 -- drop zone radius
|
||||||
|
local factor = 1
|
||||||
|
if IsHerc then
|
||||||
|
factor = foundCargo:GetCratesNeeded() or 1 -- spread a bit more if airdropping
|
||||||
|
zoneradius = Unit:GetVelocityMPS() or 100
|
||||||
|
end
|
||||||
|
local zone = ZONE_GROUP:New(string.format("Unload zone-%s",unitname), Group, zoneradius * factor)
|
||||||
|
local randomcoord = zone:GetRandomCoordinate(10, 30 * factor)
|
||||||
|
local heading = Group:GetHeading() or 0
|
||||||
|
-- Spawn troops left from us, closer when hovering, further off when landed
|
||||||
|
if hoverunload or grounded then
|
||||||
|
randomcoord = Group:GetCoordinate()
|
||||||
|
-- slightly left from us
|
||||||
|
local Angle = (heading + 270) % 360
|
||||||
|
if IsHerc or IsHook then Angle = (heading + 180) % 360 end
|
||||||
|
local offset = hoverunload and self.TroopUnloadDistHover or self.TroopUnloadDistGround
|
||||||
|
if IsHerc then offset = self.TroopUnloadDistGroundHerc or 25 end
|
||||||
|
if IsHook then
|
||||||
|
offset = self.TroopUnloadDistGroundHook or 15
|
||||||
|
if hoverunload and self.TroopUnloadDistHoverHook then
|
||||||
|
offset = self.TroopUnloadDistHoverHook or 5
|
||||||
|
end
|
||||||
|
end
|
||||||
|
randomcoord:Translate(offset, Angle, nil, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local tempcount = 0
|
||||||
|
if IsHook then tempcount = self.ChinookTroopCircleRadius or 5 end -- 10m circle for the Chinook
|
||||||
|
for _, _template in pairs(temptable) do
|
||||||
|
self.TroopCounter = self.TroopCounter + 1
|
||||||
|
tempcount = tempcount + 1
|
||||||
|
local alias = string.format("%s-%d", _template, math.random(1,100000))
|
||||||
|
local rad = 2.5 + (tempcount * 2)
|
||||||
|
local Positions = self:_GetUnitPositions(randomcoord, rad, heading, _template)
|
||||||
|
|
||||||
|
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template, alias)
|
||||||
|
:InitDelayOff()
|
||||||
|
:InitSetUnitAbsolutePositions(Positions)
|
||||||
|
:OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end)
|
||||||
|
:SpawnFromVec2(randomcoord:GetVec2())
|
||||||
|
|
||||||
|
self:__TroopsDeployed(1, Group, Unit, self.DroppedTroops[self.TroopCounter], cType)
|
||||||
|
end
|
||||||
|
foundCargo:SetWasDropped(true)
|
||||||
|
if cType == CTLD_CARGO.Enum.ENGINEERS then
|
||||||
|
self.Engineers = self.Engineers + 1
|
||||||
|
local grpname = self.DroppedTroops[self.TroopCounter]:GetName()
|
||||||
|
self.EngineersInField[self.Engineers] = CTLD_ENGINEERING:New(name, grpname)
|
||||||
|
self:_SendMessage(string.format("Dropped Engineers %s into action!", name), 10, false, Group)
|
||||||
|
else
|
||||||
|
self:_SendMessage(string.format("Dropped Troops %s into action!", name), 10, false, Group)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- We did not find any troop cargo with that ID
|
||||||
|
self:_SendMessage(string.format("No troop cargo with ID %d found or already dropped!", cargoID), 10, false, Group)
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
-- droppingatbase logic
|
||||||
|
self:_SendMessage("Troops have returned to base!", 10, false, Group)
|
||||||
|
self:__TroopsRTB(1, Group, Unit, zonename, zone)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
-- (NEW CODE FOR SINGLE DROP AT BASE)
|
||||||
|
-- If you want to return only the single cargo item with cargoID to stock
|
||||||
|
-- instead of returning all, you can do something similar here:
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
local loadedCargoData = self.Loaded_Cargo[unitname] or {}
|
||||||
|
local cargoList = loadedCargoData.Cargo or {}
|
||||||
|
for _, cObj in ipairs(cargoList) do
|
||||||
|
if (cObj:GetType() == CTLD_CARGO.Enum.TROOPS or cObj:GetType() == CTLD_CARGO.Enum.ENGINEERS)
|
||||||
|
and (cObj:GetID() == cargoID)
|
||||||
|
then
|
||||||
|
-- Return this one cargo to stock
|
||||||
|
local cName = cObj:GetName()
|
||||||
|
local gentroops = self.Cargo_Troops
|
||||||
|
for _id, _troop in pairs(gentroops) do
|
||||||
|
if _troop.Name == cName then
|
||||||
|
local st = _troop:GetStock()
|
||||||
|
if st and tonumber(st) >= 0 then
|
||||||
|
_troop:AddStock()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Mark it as dropped so we remove it from the loaded cargo
|
||||||
|
cObj:SetWasDropped(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
-- cleanup load list
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
local cargoList = self.Loaded_Cargo[unitname].Cargo
|
||||||
|
|
||||||
|
-- 1) Remove all dropped cargo (iterate backward for table.remove)
|
||||||
|
for i = #cargoList, 1, -1 do
|
||||||
|
if cargoList[i]:WasDropped() then
|
||||||
|
table.remove(cargoList, i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 2) Recount
|
||||||
|
local troopsLoaded = 0
|
||||||
|
local cratesLoaded = 0
|
||||||
|
for _, cargo in ipairs(cargoList) do
|
||||||
|
local cType = cargo:GetType()
|
||||||
|
if cType == CTLD_CARGO.Enum.TROOPS or cType == CTLD_CARGO.Enum.ENGINEERS then
|
||||||
|
-- If each cargo item represents just 1 group (or “1 load of troops”):
|
||||||
|
troopsLoaded = troopsLoaded + 1
|
||||||
|
-- If you track “troops loaded” by `CratesNeeded()`,
|
||||||
|
-- then do: troopsLoaded = troopsLoaded + cargo:GetCratesNeeded()
|
||||||
|
else
|
||||||
|
cratesLoaded = cratesLoaded + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.Loaded_Cargo[unitname].Troopsloaded = troopsLoaded
|
||||||
|
self.Loaded_Cargo[unitname].Cratesloaded = cratesLoaded
|
||||||
|
|
||||||
|
self:_RefreshDropTroopsMenu(Group, Unit)
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
if IsHerc then
|
||||||
|
self:_SendMessage("Nothing loaded or not within airdrop parameters!", 10, false, Group)
|
||||||
|
else
|
||||||
|
self:_SendMessage("Nothing loaded or not hovering within parameters!", 10, false, Group)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------
|
||||||
|
function CTLD:_RefreshDropTroopsMenu(Group, Unit)
|
||||||
|
local theGroup=Group
|
||||||
|
local theUnit=Unit
|
||||||
|
if not theGroup.CTLDTopmenu then return end
|
||||||
|
local topTroops=theGroup.MyTopTroopsMenu
|
||||||
|
if not topTroops then return end
|
||||||
|
if topTroops.DropTroopsMenu then topTroops.DropTroopsMenu:Remove() end
|
||||||
|
local dropTroopsMenu=MENU_GROUP:New(theGroup,"Drop Troops",topTroops)
|
||||||
|
topTroops.DropTroopsMenu=dropTroopsMenu
|
||||||
|
MENU_GROUP_COMMAND:New(theGroup,"Drop ALL troops",dropTroopsMenu,self._UnloadTroops,self,theGroup,theUnit)
|
||||||
|
local loadedData=self.Loaded_Cargo[theUnit:GetName()]
|
||||||
|
if loadedData and loadedData.Cargo then
|
||||||
|
for i,cargoObj in ipairs(loadedData.Cargo) do
|
||||||
|
if cargoObj and (cargoObj:GetType()==CTLD_CARGO.Enum.TROOPS or cargoObj:GetType()==CTLD_CARGO.Enum.ENGINEERS)
|
||||||
|
and not cargoObj:WasDropped()
|
||||||
|
then
|
||||||
|
local name=cargoObj:GetName()or"Unknown"
|
||||||
|
local size=cargoObj:GetCratesNeeded()or 1
|
||||||
|
local cID=cargoObj:GetID()
|
||||||
|
local index = i
|
||||||
|
local line = string.format("Drop: %s (#%d)", name, index)
|
||||||
|
MENU_GROUP_COMMAND:New(theGroup,line,dropTroopsMenu,self._UnloadSingleTroopByID,self,theGroup,theUnit,cID)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- [Internal] Function to check if a template exists in the mission.
|
--- [Internal] Function to check if a template exists in the mission.
|
||||||
-- @param #CTLD self
|
-- @param #CTLD self
|
||||||
-- @param #table temptable Table of string names
|
-- @param #table temptable Table of string names
|
||||||
@ -5367,9 +5719,8 @@ end
|
|||||||
-- }
|
-- }
|
||||||
function CTLD:_CountStockPlusInHeloPlusAliveGroups(Restock,Threshold)
|
function CTLD:_CountStockPlusInHeloPlusAliveGroups(Restock,Threshold)
|
||||||
local Troopstable = {}
|
local Troopstable = {}
|
||||||
-- generics
|
|
||||||
for _id, _cargo in pairs(self.Cargo_Crates) do
|
for _id, _cargo in pairs(self.Cargo_Crates) do
|
||||||
local generic = _cargo -- #CTLD_CARGO
|
local generic = _cargo
|
||||||
local genname = generic:GetName()
|
local genname = generic:GetName()
|
||||||
if generic and generic:GetStock0() > 0 and not Troopstable[genname] then
|
if generic and generic:GetStock0() > 0 and not Troopstable[genname] then
|
||||||
Troopstable[genname] = {
|
Troopstable[genname] = {
|
||||||
@ -5378,6 +5729,7 @@ end
|
|||||||
StockR = generic:GetRelativeStock(),
|
StockR = generic:GetRelativeStock(),
|
||||||
Infield = 0,
|
Infield = 0,
|
||||||
Inhelo = 0,
|
Inhelo = 0,
|
||||||
|
CratesInfield = 0,
|
||||||
Sum = generic:GetStock(),
|
Sum = generic:GetStock(),
|
||||||
}
|
}
|
||||||
if Restock == true then
|
if Restock == true then
|
||||||
@ -5385,9 +5737,8 @@ end
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
---
|
|
||||||
for _id, _cargo in pairs(self.Cargo_Troops) do
|
for _id, _cargo in pairs(self.Cargo_Troops) do
|
||||||
local generic = _cargo -- #CTLD_CARGO
|
local generic = _cargo
|
||||||
local genname = generic:GetName()
|
local genname = generic:GetName()
|
||||||
if generic and generic:GetStock0() > 0 and not Troopstable[genname] then
|
if generic and generic:GetStock0() > 0 and not Troopstable[genname] then
|
||||||
Troopstable[genname] = {
|
Troopstable[genname] = {
|
||||||
@ -5396,6 +5747,7 @@ end
|
|||||||
StockR = generic:GetRelativeStock(),
|
StockR = generic:GetRelativeStock(),
|
||||||
Infield = 0,
|
Infield = 0,
|
||||||
Inhelo = 0,
|
Inhelo = 0,
|
||||||
|
CratesInfield = 0,
|
||||||
Sum = generic:GetStock(),
|
Sum = generic:GetStock(),
|
||||||
}
|
}
|
||||||
if Restock == true then
|
if Restock == true then
|
||||||
@ -5403,15 +5755,14 @@ end
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Troops & Built Crates
|
|
||||||
for _index, _group in pairs(self.DroppedTroops) do
|
for _index, _group in pairs(self.DroppedTroops) do
|
||||||
if _group and _group:IsAlive() then
|
if _group and _group:IsAlive() then
|
||||||
self:T("Looking at " .. _group:GetName() .. " in the field")
|
self:T("Looking at " .. _group:GetName() .. " in the field")
|
||||||
local generic = self:GetGenericCargoObjectFromGroupName(_group:GetName()) -- #CTLD_CARGO
|
local generic = self:GetGenericCargoObjectFromGroupName(_group:GetName())
|
||||||
if generic then
|
if generic then
|
||||||
local genname = generic:GetName()
|
local genname = generic:GetName()
|
||||||
self:T("Found Generic " .. genname .. " in the field. Adding.")
|
self:T("Found Generic " .. genname .. " in the field. Adding.")
|
||||||
if generic:GetStock0() > 0 then -- don't count unlimited stock
|
if generic:GetStock0() > 0 then
|
||||||
Troopstable[genname].Infield = Troopstable[genname].Infield + 1
|
Troopstable[genname].Infield = Troopstable[genname].Infield + 1
|
||||||
Troopstable[genname].Sum = Troopstable[genname].Infield + Troopstable[genname].Stock + Troopstable[genname].Inhelo
|
Troopstable[genname].Sum = Troopstable[genname].Infield + Troopstable[genname].Stock + Troopstable[genname].Inhelo
|
||||||
end
|
end
|
||||||
@ -5420,27 +5771,24 @@ end
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Helos
|
|
||||||
for _unitname, _loaded in pairs(self.Loaded_Cargo) do
|
for _unitname, _loaded in pairs(self.Loaded_Cargo) do
|
||||||
local _unit = UNIT:FindByName(_unitname)
|
local _unit = UNIT:FindByName(_unitname)
|
||||||
if _unit and _unit:IsAlive() then
|
if _unit and _unit:IsAlive() then
|
||||||
local unitname = _unit:GetName()
|
local unitname = _unit:GetName()
|
||||||
local loadedcargo = self.Loaded_Cargo[unitname].Cargo or {}
|
local loadedcargo = self.Loaded_Cargo[unitname].Cargo or {}
|
||||||
for _, _cgo in pairs(loadedcargo) do
|
for _, _cgo in pairs(loadedcargo) do
|
||||||
local cargo = _cgo -- #CTLD_CARGO
|
local cargo = _cgo
|
||||||
local type = cargo.CargoType
|
local type = cargo.CargoType
|
||||||
local gname = cargo.Name
|
local gname = cargo.Name
|
||||||
local gcargo = self:_FindCratesCargoObject(gname) or self:_FindTroopsCargoObject(gname)
|
local gcargo = self:_FindCratesCargoObject(gname) or self:_FindTroopsCargoObject(gname)
|
||||||
self:T("Looking at " .. gname .. " in the helo - type = " .. type)
|
self:T("Looking at " .. gname .. " in the helo - type = " .. type)
|
||||||
if (type == CTLD_CARGO.Enum.TROOPS or type == CTLD_CARGO.Enum.ENGINEERS or type == CTLD_CARGO.Enum.VEHICLE or type == CTLD_CARGO.Enum.FOB) then
|
if (type == CTLD_CARGO.Enum.TROOPS or type == CTLD_CARGO.Enum.ENGINEERS or type == CTLD_CARGO.Enum.VEHICLE or type == CTLD_CARGO.Enum.FOB) then
|
||||||
-- valid troops/engineers
|
if gcargo and gcargo:GetStock0() > 0 then
|
||||||
if gcargo and gcargo:GetStock0() > 0 then -- don't count unlimited stock
|
|
||||||
self:T("Adding " .. gname .. " in the helo - type = " .. type)
|
self:T("Adding " .. gname .. " in the helo - type = " .. type)
|
||||||
if (type == CTLD_CARGO.Enum.TROOPS or type == CTLD_CARGO.Enum.ENGINEERS) then
|
if (type == CTLD_CARGO.Enum.TROOPS or type == CTLD_CARGO.Enum.ENGINEERS) then
|
||||||
Troopstable[gname].Inhelo = Troopstable[gname].Inhelo + 1
|
Troopstable[gname].Inhelo = Troopstable[gname].Inhelo + 1
|
||||||
end
|
end
|
||||||
if (type == CTLD_CARGO.Enum.VEHICLE or type == CTLD_CARGO.Enum.FOB) then
|
if (type == CTLD_CARGO.Enum.VEHICLE or type == CTLD_CARGO.Enum.FOB) then
|
||||||
-- maybe multiple crates of the same type
|
|
||||||
local counting = gcargo.CratesNeeded
|
local counting = gcargo.CratesNeeded
|
||||||
local added = 1
|
local added = 1
|
||||||
if counting > 1 then
|
if counting > 1 then
|
||||||
@ -5448,13 +5796,51 @@ end
|
|||||||
end
|
end
|
||||||
Troopstable[gname].Inhelo = Troopstable[gname].Inhelo + added
|
Troopstable[gname].Inhelo = Troopstable[gname].Inhelo + added
|
||||||
end
|
end
|
||||||
Troopstable[gname].Sum = Troopstable[gname].Infield + Troopstable[gname].Stock + Troopstable[gname].Inhelo
|
Troopstable[gname].Sum = Troopstable[gname].Infield + Troopstable[gname].Stock + Troopstable[gname].Inhelo + Troopstable[gname].CratesInfield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if self.Spawned_Cargo then
|
||||||
|
-- First pass: just add fractional amounts for each crate on the ground
|
||||||
|
for i = #self.Spawned_Cargo, 1, -1 do
|
||||||
|
local cargo = self.Spawned_Cargo[i]
|
||||||
|
if cargo and cargo:GetPositionable() and cargo:GetPositionable():IsAlive() then
|
||||||
|
local genname = cargo:GetName()
|
||||||
|
local gcargo = self:_FindCratesCargoObject(genname)
|
||||||
|
if Troopstable[genname] and gcargo and gcargo:GetStock0() > 0 then
|
||||||
|
local needed = gcargo.CratesNeeded or 1
|
||||||
|
local added = 1
|
||||||
|
if needed > 1 then
|
||||||
|
added = added / needed
|
||||||
|
end
|
||||||
|
Troopstable[genname].CratesInfield = Troopstable[genname].CratesInfield + added
|
||||||
|
Troopstable[genname].Sum = Troopstable[genname].Infield + Troopstable[genname].Stock
|
||||||
|
+ Troopstable[genname].Inhelo + Troopstable[genname].CratesInfield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i = #self.Spawned_Cargo, 1, -1 do
|
||||||
|
local cargo = self.Spawned_Cargo[i]
|
||||||
|
if cargo and cargo:GetPositionable() and cargo:GetPositionable():IsAlive() then
|
||||||
|
local genname = cargo:GetName()
|
||||||
|
if Troopstable[genname] then
|
||||||
|
if Troopstable[genname].Inhelo == 0 and Troopstable[genname].CratesInfield < 1 then
|
||||||
|
Troopstable[genname].CratesInfield = 0
|
||||||
|
Troopstable[genname].Sum = Troopstable[genname].Stock
|
||||||
|
cargo:GetPositionable():Destroy(false)
|
||||||
|
table.remove(self.Spawned_Cargo, i)
|
||||||
|
local leftover = Troopstable[genname].Stock0 - (Troopstable[genname].Infield + Troopstable[genname].Inhelo + Troopstable[genname].CratesInfield)
|
||||||
|
if leftover < Troopstable[genname].Stock then
|
||||||
|
Troopstable[genname].Stock = leftover
|
||||||
|
end
|
||||||
|
Troopstable[genname].Sum = Troopstable[genname].Stock + Troopstable[genname].Infield + Troopstable[genname].Inhelo + Troopstable[genname].CratesInfield
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Restock?
|
|
||||||
if Restock == true then
|
if Restock == true then
|
||||||
local threshold = Threshold or 75
|
local threshold = Threshold or 75
|
||||||
for _name,_data in pairs(Troopstable) do
|
for _name,_data in pairs(Troopstable) do
|
||||||
@ -5465,7 +5851,6 @@ end
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Return
|
|
||||||
return Troopstable
|
return Troopstable
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user