Update CTLD.lua

Added:
OnAfrerGetCrates, Only triggers when player uses "Get"

Added:
OnAfterRemoveCratedNearBy, Only triggers when player actively uses Remove crates near by or remove units near by.

Added: 
Partial load. currently, if a player land 3 crates (Farp) and want to partially load another farp, even though it can not fit, some want to load partially, this allows for it. 
Player will be able to see what actually fits in the menu, but if they want, they can open the menu again, select the item, then it will say "Get" "Crates limit reached" and "Partially load"

Added:
AddStaticsCargo can now accept a last parms, UnitType, this parm will make the cargo only visible in the menu to that passed unitType.

Removed Get and Load from CH-47 for the statics if enableChinookGCLoading is enabled. This will make it less confusing, as it didn't allow players do load anything except Ground crew for statics.
This commit is contained in:
leka1986
2025-12-19 18:44:13 +01:00
committed by GitHub
parent 8d8b886ad6
commit 6a13e593ec
+183 -33
View File
@@ -1045,6 +1045,25 @@ do
-- ... your code here ... -- ... your code here ...
-- end -- end
-- --
-- ## 3.5 A OnAfterGetCrates
--
-- This function is called after a player has spawned crates via the "Get" menu (but not when using "Get and Load"):
--
-- function my_ctld:OnAfterGetCrates(From, Event, To, Group, Unit, Cargotable)
-- ... your code here ...
-- end
--
-- ## 3.5 b OnAfterRemoveCratesNearby
--
-- This function is called after a player has removed things nearby via CTLD “Remove … nearby”.
-- It can be triggered from:
-- - Removing crates (“Remove crates nearby” menu)
-- - Removing C-130 managed unit-groups (“Remove units nearby”)
--
-- function my_ctld:OnAfterRemoveCratesNearby(From, Event, To, Group, Unit, Cargotable)
-- ... your code here ...
-- end
--
-- ## 3.6 A OnAfterHelicopterLost -- ## 3.6 A OnAfterHelicopterLost
-- --
-- This function is called when a player has left the helicopter or crashed/died: -- This function is called when a player has left the helicopter or crashed/died:
@@ -1557,6 +1576,7 @@ function CTLD:New(Coalition, Prefixes, Alias)
self:AddTransition("*", "TroopsDeployed", "*") -- CTLD deploy event. self:AddTransition("*", "TroopsDeployed", "*") -- CTLD deploy event.
self:AddTransition("*", "TroopsRTB", "*") -- CTLD deploy event. self:AddTransition("*", "TroopsRTB", "*") -- CTLD deploy event.
self:AddTransition("*", "CratesDropped", "*") -- CTLD deploy event. self:AddTransition("*", "CratesDropped", "*") -- CTLD deploy event.
self:AddTransition("*", "GetCrates", "*") -- CTLD getcrates event.
self:AddTransition("*", "CratesBuild", "*") -- CTLD build event. self:AddTransition("*", "CratesBuild", "*") -- CTLD build event.
self:AddTransition("*", "UnitsSpawn", "*") -- CTLD Unit spawned. self:AddTransition("*", "UnitsSpawn", "*") -- CTLD Unit spawned.
self:AddTransition("*", "CratesRepaired", "*") -- CTLD repair event. self:AddTransition("*", "CratesRepaired", "*") -- CTLD repair event.
@@ -1564,6 +1584,7 @@ function CTLD:New(Coalition, Prefixes, Alias)
self:AddTransition("*", "CratesRepairStarted", "*") -- CTLD repair event. self:AddTransition("*", "CratesRepairStarted", "*") -- CTLD repair event.
self:AddTransition("*", "CratesPacked", "*") -- CTLD repack event. self:AddTransition("*", "CratesPacked", "*") -- CTLD repack event.
self:AddTransition("*", "HelicopterLost", "*") -- CTLD lost event. self:AddTransition("*", "HelicopterLost", "*") -- CTLD lost event.
self:AddTransition("*", "RemoveCratesNearby", "*") -- CTLD players remove crates or units nearby.
self:AddTransition("*", "Load", "*") -- CTLD load event. self:AddTransition("*", "Load", "*") -- CTLD load event.
self:AddTransition("*", "Loaded", "*") -- CTLD load event. self:AddTransition("*", "Loaded", "*") -- CTLD load event.
self:AddTransition("*", "Save", "*") -- CTLD save event. self:AddTransition("*", "Save", "*") -- CTLD save event.
@@ -1934,6 +1955,28 @@ function CTLD:New(Coalition, Prefixes, Alias)
-- @param #table Cargotable Table of #CTLD_CARGO objects dropped. Can be a Wrapper.DynamicCargo#DYNAMICCARGO object, if ground crew unloaded! -- @param #table Cargotable Table of #CTLD_CARGO objects dropped. Can be a Wrapper.DynamicCargo#DYNAMICCARGO object, if ground crew unloaded!
-- @return #CTLD self -- @return #CTLD self
--- FSM Function OnAfterGetCrates.
-- @function [parent=#CTLD] OnAfterGetCrates
-- @param #CTLD self
-- @param #string From State.
-- @param #string Event Trigger.
-- @param #string To State.
-- @param Wrapper.Group#GROUP Group Group Object.
-- @param Wrapper.Unit#UNIT Unit Unit Object.
-- @param #table Cargotable Table of #CTLD_CARGO objects spawned via "Get".
-- @return #CTLD self
--- FSM Function OnAfterRemoveCratesNearby.
-- @function [parent=#CTLD] OnAfterRemoveCratesNearby
-- @param #CTLD self
-- @param #string From State.
-- @param #string Event Trigger.
-- @param #string To State.
-- @param Wrapper.Group#GROUP Group Group Object.
-- @param Wrapper.Unit#UNIT Unit Unit Object.
-- @param #table Cargotable Table of #CTLD_CARGO objects removed nearby.
-- @return #CTLD self
--- FSM Function OnAfterCratesBuild. --- FSM Function OnAfterCratesBuild.
-- @function [parent=#CTLD] OnAfterCratesBuild -- @function [parent=#CTLD] OnAfterCratesBuild
-- @param #CTLD self -- @param #CTLD self
@@ -2948,7 +2991,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
self:T("_AddCrateQuantityMenus "..cargoObj.Name) self:T("_AddCrateQuantityMenus "..cargoObj.Name)
local needed = cargoObj:GetCratesNeeded() or 1 local needed = cargoObj:GetCratesNeeded() or 1
local stockEntry = self:_GetCrateStockEntry(cargoObj, stockSummary) local stockEntry = self:_GetCrateStockEntry(cargoObj, stockSummary)
local stock = 0 local stock = nil
if stockEntry and type(stockEntry.Stock) == "number" then if stockEntry and type(stockEntry.Stock) == "number" then
stock = stockEntry.Stock stock = stockEntry.Stock
else else
@@ -2973,6 +3016,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
return self return self
end end
local capacitySets = nil local capacitySets = nil
local capacityCrates = nil
if Unit then if Unit then
local capabilities = self:_GetUnitCapabilities(Unit) local capabilities = self:_GetUnitCapabilities(Unit)
local capacity = capabilities and capabilities.cratelimit or 0 local capacity = capabilities and capabilities.cratelimit or 0
@@ -2989,6 +3033,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
if space < 0 then if space < 0 then
space = 0 space = 0
end end
capacityCrates = space
local perSet = needed > 0 and needed or 1 local perSet = needed > 0 and needed or 1
capacitySets = math.floor(space / perSet) capacitySets = math.floor(space / perSet)
end end
@@ -3006,6 +3051,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
end end
self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad)) self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad))
local maxMassSets = nil local maxMassSets = nil
local maxMassCrates = nil
if Unit then if Unit then
local maxload = self:_GetMaxLoadableMass(Unit) local maxload = self:_GetMaxLoadableMass(Unit)
local perCrateMass = (cargoObj.GetMass and cargoObj:GetMass()) or cargoObj.PerCrateMass or 0 local perCrateMass = (cargoObj.GetMass and cargoObj:GetMass()) or cargoObj.PerCrateMass or 0
@@ -3019,8 +3065,11 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
maxQuantity = maxMassSets maxQuantity = maxMassSets
end end
end end
if type(maxload)=="number"and maxload>0 and perCrateMass>0 then
maxMassCrates=math.floor(maxload/perCrateMass)
end
end end
self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad)) self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad))
if maxQuantity < 1 then if maxQuantity < 1 then
return self return self
end end
@@ -3031,20 +3080,28 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
MENU_GROUP_COMMAND:New(Group, "Get", parentMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, 1) 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)) local canLoad = (allowLoad and (not capacitySets or capacitySets >= 1) and (not maxMassSets or maxMassSets >= 1))
local isHerc = self:IsC130J(Unit) local isHerc = self:IsC130J(Unit)
if canLoad and not isHerc then local isHook = self:IsHook(Unit)
local cgotype = cargoObj:GetType() or nil
local suppressGetAndLoad = (self.enableChinookGCLoading == true) and isHook and (cgotype == CTLD_CARGO.Enum.STATIC)
local canPartiallyLoad=((not capacityCrates or capacityCrates>=1)and(not maxMassCrates or maxMassCrates>=1))
if canLoad and not isHerc and not suppressGetAndLoad then
MENU_GROUP_COMMAND:New(Group, "Get and Load", parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1) MENU_GROUP_COMMAND:New(Group, "Get and Load", parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1)
else else
local msg local msg
if not isHerc then if not isHerc and not suppressGetAndLoad then
if maxMassSets and (not capacitySets or capacitySets >= 1) and maxMassSets < 1 then if maxMassSets and (not capacitySets or capacitySets >= 1) and maxMassSets < 1 then
msg = "Weight limit reached" msg = "Weight limit reached"
else else
msg = "Crate limit reached" msg = "Crate limit reached"
end end
MENU_GROUP_COMMAND:New(Group, msg, parentMenu, self._SendMessage, self, msg, 10, false, Group) MENU_GROUP_COMMAND:New(Group, msg, parentMenu, self._SendMessage, self, msg, 10, false, Group)
if canPartiallyLoad and (cgotype ~= CTLD_CARGO.Enum.STATIC) and (not suppressGetAndLoad) then
MENU_GROUP_COMMAND:New(Group, "Partially load", parentMenu, self._GetAndLoad, self, Group, Unit, cargoObj, 1,true)
end
end end
end end
parentMenu:Refresh()
return self return self
end end
@@ -3056,17 +3113,24 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
MENU_GROUP_COMMAND:New(Group, "Get", qMenu, self._GetCrateQuantity, self, Group, Unit, cargoObj, quantity) 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)) local canLoad = (allowLoad and (not capacitySets or capacitySets >= quantity) and (not maxMassSets or maxMassSets >= quantity))
local isHerc = self:IsC130J(Unit) local isHerc = self:IsC130J(Unit)
if canLoad and not isHerc then local isHook = self:IsHook(Unit)
local cgotype = cargoObj:GetType() or nil
local suppressGetAndLoad = (self.enableChinookGCLoading == true) and isHook and (cgotype == CTLD_CARGO.Enum.STATIC)
local canPartiallyLoad=((not capacityCrates or capacityCrates>=1)and(not maxMassCrates or maxMassCrates>=1))
if canLoad and not isHerc and not suppressGetAndLoad then
MENU_GROUP_COMMAND:New(Group, "Get and Load", qMenu, self._GetAndLoad, self, Group, Unit, cargoObj, quantity) MENU_GROUP_COMMAND:New(Group, "Get and Load", qMenu, self._GetAndLoad, self, Group, Unit, cargoObj, quantity)
else else
local msg local msg
if not isHerc then if not isHerc and not suppressGetAndLoad then
if maxMassSets and (not capacitySets or capacitySets >= quantity) and maxMassSets < quantity then if maxMassSets and (not capacitySets or capacitySets >= quantity) and maxMassSets < quantity then
msg = "Weight limit reached" msg = "Weight limit reached"
else else
msg = "Crate limit reached" msg = "Crate limit reached"
end end
MENU_GROUP_COMMAND:New(Group, msg, qMenu, self._SendMessage, self, msg, 10, false, Group) MENU_GROUP_COMMAND:New(Group, msg, qMenu, self._SendMessage, self, msg, 10, false, Group)
if canPartiallyLoad and (cgotype ~= CTLD_CARGO.Enum.STATIC) and (not suppressGetAndLoad) then
MENU_GROUP_COMMAND:New(Group, "Partially load", qMenu, self._GetAndLoad, self, Group, Unit, cargoObj, quantity, true)
end
end end
end end
end end
@@ -3200,7 +3264,7 @@ end
-- @param #number number Number of crates to generate (for dropping) -- @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 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 -- @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, quiet) function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppressGetEvent)
self:T(self.lid .. " _GetCrates") self:T(self.lid .. " _GetCrates")
-- check if we have stock -- check if we have stock
@@ -3228,6 +3292,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet)
-- check if we are in LOAD zone -- check if we are in LOAD zone
local inzone = false local inzone = false
local drop = drop or false local drop = drop or false
local suppressGetEvent = suppressGetEvent or false
local ship = nil local ship = nil
local width = 20 local width = 20
local distance = nil local distance = nil
@@ -3298,6 +3363,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet)
local heading = Unit:GetHeading() + 1 local heading = Unit:GetHeading() + 1
local height = Unit:GetHeight() local height = Unit:GetHeight()
local droppedcargo = {} local droppedcargo = {}
local obtainedcargo = {}
local cratedistance = 0 local cratedistance = 0
local rheading = 0 local rheading = 0
local angleOffNose = 0 local angleOffNose = 0
@@ -3416,6 +3482,9 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet)
realcargo:SetWasDropped(true,true) -- we mark here that the crates was dropped even though we just got them because of the herc. realcargo:SetWasDropped(true,true) -- we mark here that the crates was dropped even though we just got them because of the herc.
end end
end end
if not drop and not pack then
table.insert(obtainedcargo, realcargo)
end
local CCat4, CType4, CShape4 = cargotype:GetStaticTypeAndShape() local CCat4, CType4, CShape4 = cargotype:GetStaticTypeAndShape()
realcargo:SetStaticTypeAndShape(CCat4,CType4,CShape4) realcargo:SetStaticTypeAndShape(CCat4,CType4,CShape4)
table.insert(self.Spawned_Cargo, realcargo) table.insert(self.Spawned_Cargo, realcargo)
@@ -3433,6 +3502,9 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet)
if not quiet then if not quiet then
self:_SendMessage(text, 10, false, Group) self:_SendMessage(text, 10, false, Group)
end end
if not pack and not suppressGetEvent and #obtainedcargo > 0 then
self:__GetCrates(1, Group, Unit, obtainedcargo)
end
end end
self:_RefreshLoadCratesMenu(Group, Unit) self:_RefreshLoadCratesMenu(Group, Unit)
return true return true
@@ -3574,6 +3646,7 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit)
local zone = ZONE_RADIUS:New("CTLD_C130RemoveZone",location:GetVec2(),finddist,false) local zone = ZONE_RADIUS:New("CTLD_C130RemoveZone",location:GetVec2(),finddist,false)
local nearestGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({zone}):FilterOnce() local nearestGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({zone}):FilterOnce()
local removedAny = false local removedAny = false
local removedTable = {}
for _, gr in pairs(nearestGroups.Set) do for _, gr in pairs(nearestGroups.Set) do
local gc = gr:GetCoordinate() local gc = gr:GetCoordinate()
if gc then if gc then
@@ -3588,6 +3661,7 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit)
for _, tName in pairs(templ) do for _, tName in pairs(templ) do
if string.match(gr:GetName(),tName) then if string.match(gr:GetName(),tName) then
local cname = cfg.Name or "Unit" local cname = cfg.Name or "Unit"
table.insert(removedTable, { groupName = gr:GetName(), name = cname, template = tName, coordinate = gr:GetCoordinate() })
gr:Destroy(false) gr:Destroy(false)
self:_SendMessage(cname.." have been removed",10,false,_group) self:_SendMessage(cname.." have been removed",10,false,_group)
removedAny = true removedAny = true
@@ -3602,6 +3676,9 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit)
end end
if not removedAny then if not removedAny then
self:_SendMessage("Nothing to remove at this distance pilot!",10,false,_group) self:_SendMessage("Nothing to remove at this distance pilot!",10,false,_group)
else
-- Trigger FSM event for removed units (C-130 managed groups).
self:__RemoveCratesNearby(1, _group, _unit, removedTable)
end end
return self return self
end end
@@ -3623,8 +3700,11 @@ function CTLD:_RemoveCratesNearby(_group, _unit)
local entry=_entry local entry=_entry
local name=entry:GetName()or"none" local name=entry:GetName()or"none"
text:Add(string.format("Crate for %s, %dkg removed",name,entry.PerCrateMass)) text:Add(string.format("Crate for %s, %dkg removed",name,entry.PerCrateMass))
if entry:GetPositionable()then local pos = entry:GetPositionable()
entry:GetPositionable():Destroy(false) if pos then
-- Store removal position before destroying so callbacks can use it.
entry.coordinate = pos:GetCoordinate()
pos:Destroy(false)
end end
table.insert(removedIDs,entry:GetID()) table.insert(removedIDs,entry:GetID())
end end
@@ -3643,6 +3723,9 @@ function CTLD:_RemoveCratesNearby(_group, _unit)
end end
end end
self:_RefreshLoadCratesMenu(_group,_unit) self:_RefreshLoadCratesMenu(_group,_unit)
-- Trigger FSM event for removed crates.
self:__RemoveCratesNearby(1, _group, _unit, crates)
else else
self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group) self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group)
end end
@@ -4977,7 +5060,7 @@ end
-- @param Wrapper.Unit#UNIT Unit The calling unit -- @param Wrapper.Unit#UNIT Unit The calling unit
-- @param #CTLD_CARGO cargoObj -- @param #CTLD_CARGO cargoObj
-- @param #number quantity -- @param #number quantity
function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity) function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity, LoadAnyWay)
if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName()) then 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) self:_SendMessage("You need to open the door(s) to load cargo!", 10, false, Group)
return self return self
@@ -4994,20 +5077,25 @@ function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity)
if space < 0 then space = 0 end if space < 0 then space = 0 end
local perSet = needed > 0 and needed or 1 local perSet = needed > 0 and needed or 1
capacitySets = math.floor(space / perSet) capacitySets = math.floor(space / perSet)
if capacitySets < 1 then if capacitySets < 1 and not LoadAnyWay then
self:_SendMessage("No capacity to load more now!", 10, false, Group) self:_SendMessage("No capacity to load more now!", 10, false, Group)
return self return self
end end
if count > capacitySets then count = capacitySets end if capacitySets < 1 and LoadAnyWay then
count = 1
elseif count > capacitySets then
count = capacitySets
end
end end
local total = needed * count local total = needed * count
local ok = self:_GetCrates(Group, Unit, cargoObj, total, false, false, true) local ok = self:_GetCrates(Group, Unit, cargoObj, total, false, false, true, true)
if ok then if ok then
local uname = Unit:GetName() local uname = Unit:GetName()
self._batchCrateLoad = self._batchCrateLoad or {} self._batchCrateLoad = self._batchCrateLoad or {}
self._batchCrateLoad[uname] = { remaining = count, group = Group, cname = cargoObj.Name, loaded = 0, partials = 0 } self._batchCrateLoad[uname] = { remaining = count, group = Group, cname = cargoObj.Name, loaded = 0, partials = 0 }
local details = (LoadAnyWay == true)
for i = 1, count do for i = 1, count do
timer.scheduleFunction(function() self:_LoadSingleCrateSet(Group, Unit, cargoObj.Name) end, {}, timer.getTime() + 0.2 * i) timer.scheduleFunction(function() self:_LoadSingleCrateSet(Group, Unit, cargoObj.Name, details) end, {}, timer.getTime() + 0.2 * i)
end end
end end
return self return self
@@ -5443,11 +5531,34 @@ function CTLD:_RefreshF10Menus()
crateStockSummary = self:_CountStockPlusInHeloPlusAliveGroups(false) crateStockSummary = self:_CountStockPlusInHeloPlusAliveGroups(false)
end end
local function addCrateMenuEntry(cargoObj,parentMenu) local function addCrateMenuEntry(cargoObj,parentMenu,subcatmenus)
if cargoObj.DontShowInMenu then if cargoObj.DontShowInMenu then
return return
end end
local isStaticCargo = false
if (cargoObj.GetType and cargoObj:GetType() == CTLD_CARGO.Enum.STATIC) or cargoObj.CargoType == CTLD_CARGO.Enum.STATIC then
isStaticCargo = true
end
-- Only restrict CTLD menu visibility by unit type for STATIC cargo.
-- Crates/troops should remain visible "as-is" like before.
if isStaticCargo and cargoObj.UnitCanCarry and not cargoObj:UnitCanCarry(_unit) then
return
end
-- If sub-categories are enabled, create the sub-menu only when we actually add something to it.
local parent = parentMenu
if subcatmenus and cargoObj.Subcategory then
parent = subcatmenus[cargoObj.Subcategory]
if not parent then
parent = MENU_GROUP:New(_group, cargoObj.Subcategory, cratesmenu)
subcatmenus[cargoObj.Subcategory] = parent
end
end
local needed = cargoObj:GetCratesNeeded() or 1 local needed = cargoObj:GetCratesNeeded() or 1
local txt local txt
if needed > 1 then if needed > 1 then
txt = string.format("%d crate%s %s (%dkg)",needed,needed==1 and "" or "s",cargoObj.Name,cargoObj.PerCrateMass or 0) txt = string.format("%d crate%s %s (%dkg)",needed,needed==1 and "" or "s",cargoObj.Name,cargoObj.PerCrateMass or 0)
@@ -5459,21 +5570,21 @@ function CTLD:_RefreshF10Menus()
local suffix = self:_FormatCrateStockSuffix(cargoObj,crateStockSummary) local suffix = self:_FormatCrateStockSuffix(cargoObj,crateStockSummary)
if suffix then txt = txt..suffix end if suffix then txt = txt..suffix end
end end
local mSet = MENU_GROUP:New(_group,txt,parentMenu) local mSet = MENU_GROUP:New(_group,txt,parent)
_group.CTLD_CrateMenus[cargoObj.Name] = mSet _group.CTLD_CrateMenus[cargoObj.Name] = mSet
self:_AddCrateQuantityMenus(_group,_unit,mSet,cargoObj,crateStockSummary) self:_AddCrateQuantityMenus(_group,_unit,mSet,cargoObj,crateStockSummary)
end end
if self.usesubcats == true then if self.usesubcats then
local subcatmenus = {} 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 for _,cargoObj in pairs(self.Cargo_Crates) do
addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory] or cratesmenu) addCrateMenuEntry(cargoObj,cratesmenu,subcatmenus)
end end
for _,cargoObj in pairs(self.Cargo_Statics) do for _,cargoObj in pairs(self.Cargo_Statics) do
addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory] or cratesmenu) addCrateMenuEntry(cargoObj,cratesmenu,subcatmenus)
end end
else else
for _,cargoObj in pairs(self.Cargo_Crates) do for _,cargoObj in pairs(self.Cargo_Crates) do
@@ -5486,8 +5597,12 @@ function CTLD:_RefreshF10Menus()
else else
if self.usesubcats == true then if self.usesubcats == true then
local subcatmenus = {} local subcatmenus = {}
for catName, _ in pairs(self.subcats) do local function getSubcatMenu(catName)
subcatmenus[catName] = MENU_GROUP:New(_group, catName, cratesmenu) -- fixed variable case if not catName then return cratesmenu end
if not subcatmenus[catName] then
subcatmenus[catName] = MENU_GROUP:New(_group, catName, cratesmenu)
end
return subcatmenus[catName]
end end
for _, cargoObj in pairs(self.Cargo_Crates) do for _, cargoObj in pairs(self.Cargo_Crates) do
if not cargoObj.DontShowInMenu then if not cargoObj.DontShowInMenu then
@@ -5501,11 +5616,11 @@ function CTLD:_RefreshF10Menus()
if cargoObj.Location then txt = txt.."[R]" end if cargoObj.Location then txt = txt.."[R]" end
local stock = cargoObj:GetStock() local stock = cargoObj:GetStock()
if stock >= 0 and self.showstockinmenuitems then txt = txt.."["..stock.."]" end 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) MENU_GROUP_COMMAND:New(_group, txt, getSubcatMenu(cargoObj.Subcategory), self._GetCrates, self, _group, _unit, cargoObj)
end end
end end
for _, cargoObj in pairs(self.Cargo_Statics) do for _, cargoObj in pairs(self.Cargo_Statics) do
if not cargoObj.DontShowInMenu then if (not cargoObj.DontShowInMenu) and (not cargoObj.UnitCanCarry or cargoObj:UnitCanCarry(_unit)) then
local needed = cargoObj:GetCratesNeeded() or 1 local needed = cargoObj:GetCratesNeeded() or 1
local txt local txt
if needed > 1 then if needed > 1 then
@@ -5516,7 +5631,7 @@ function CTLD:_RefreshF10Menus()
if cargoObj.Location then txt = txt.."[R]" end if cargoObj.Location then txt = txt.."[R]" end
local stock = cargoObj:GetStock() local stock = cargoObj:GetStock()
if stock >= 0 and self.showstockinmenuitems then txt = txt.."["..stock.."]" end 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) MENU_GROUP_COMMAND:New(_group, txt, getSubcatMenu(cargoObj.Subcategory), self._GetCrates, self, _group, _unit, cargoObj)
end end
end end
else else
@@ -5536,7 +5651,7 @@ function CTLD:_RefreshF10Menus()
end end
end end
for _, cargoObj in pairs(self.Cargo_Statics) do for _, cargoObj in pairs(self.Cargo_Statics) do
if not cargoObj.DontShowInMenu then if (not cargoObj.DontShowInMenu) and (not cargoObj.UnitCanCarry or cargoObj:UnitCanCarry(_unit)) then
local needed = cargoObj:GetCratesNeeded() or 1 local needed = cargoObj:GetCratesNeeded() or 1
local txt local txt
if needed > 1 then if needed > 1 then
@@ -5735,7 +5850,7 @@ function CTLD:_RefreshLoadCratesMenu(Group,Unit)
-- @param Wrapper.Group#GROUP Group -- @param Wrapper.Group#GROUP Group
-- @param Wrapper.Unit#UNIT Unit -- @param Wrapper.Unit#UNIT Unit
-- @param #string cargoName The cargo name, e.g. "Ammo Truck" -- @param #string cargoName The cargo name, e.g. "Ammo Truck"
function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName) function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName, details)
self:T(self.lid .. " _LoadSingleCrateSet cargoName=" .. (cargoName or "nil")) self:T(self.lid .. " _LoadSingleCrateSet cargoName=" .. (cargoName or "nil"))
-- 1) Must be landed or hovering -- 1) Must be landed or hovering
@@ -5776,7 +5891,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
local found = #matchingCrates local found = #matchingCrates
local batch = self._batchCrateLoad and self._batchCrateLoad[Unit:GetName()] or nil local batch = self._batchCrateLoad and self._batchCrateLoad[Unit:GetName()] or nil
local prevSuppress = self.suppressmessages local prevSuppress = self.suppressmessages
if batch and batch.cname == cargoName then self.suppressmessages = true end if batch and (not details) and batch.cname == cargoName then self.suppressmessages = true end
-- 4) Check capacity -- 4) Check capacity
local unitName = Unit:GetName() local unitName = Unit:GetName()
@@ -5785,6 +5900,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
local capacity = capabilities.cratelimit or 0 local capacity = capabilities.cratelimit or 0
if loadedData.Cratesloaded >= capacity then if loadedData.Cratesloaded >= capacity then
self:_SendMessage("No more capacity to load crates!", 10, false, Group) self:_SendMessage("No more capacity to load crates!", 10, false, Group)
self.suppressmessages = prevSuppress
return self return self
end end
@@ -5793,6 +5909,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
local toLoad = math.min(found, needed, spaceLeft) local toLoad = math.min(found, needed, spaceLeft)
if toLoad < 1 then if toLoad < 1 then
self:_SendMessage("Cannot load crates: either none found or no capacity left.", 10, false, Group) self:_SendMessage("Cannot load crates: either none found or no capacity left.", 10, false, Group)
self.suppressmessages = prevSuppress
return self return self
end end
@@ -5831,7 +5948,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
-- 7) Show final message, including a special note if capacity is now reached -- 7) Show final message, including a special note if capacity is now reached
local loadedHere = toLoad local loadedHere = toLoad
if not batch then if details or (not batch) then
if loadedHere < needed and loadedData.Cratesloaded >= capacity 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) self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s. Cargo limit is now reached!", loadedHere, needed, cargoName), 10, false, Group)
else else
@@ -5862,11 +5979,13 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
batch.remaining = (batch.remaining or 1) - 1 batch.remaining = (batch.remaining or 1) - 1
if batch.remaining <= 0 then if batch.remaining <= 0 then
self.suppressmessages = prevSuppress self.suppressmessages = prevSuppress
if not details then
local txt = string.format("Loaded %d %s.", batch.loaded, cargoName) local txt = string.format("Loaded %d %s.", batch.loaded, cargoName)
if batch.partials and batch.partials > 0 then if batch.partials and batch.partials > 0 then
txt = txt .. " Some sets could not be fully loaded." txt = txt .. " Some sets could not be fully loaded."
end end
self:_SendMessage(txt, 10, false, batch.group) self:_SendMessage(txt, 10, false, batch.group)
end
self._batchCrateLoad[Unit:GetName()] = nil self._batchCrateLoad[Unit:GetName()] = nil
else else
self.suppressmessages = prevSuppress self.suppressmessages = prevSuppress
@@ -6660,7 +6779,7 @@ end
-- @param #boolean DontShowInMenu (optional) If set to "true" this won't show up in the menu. -- @param #boolean DontShowInMenu (optional) If set to "true" this won't show up in the menu.
-- @param Core.Zone#ZONE Location (optional) If set, the cargo item is **only** available here. Can be a #ZONE object or the name of a zone as #string. -- @param Core.Zone#ZONE Location (optional) If set, the cargo item is **only** available here. Can be a #ZONE object or the name of a zone as #string.
-- @return #CTLD_CARGO CargoObject -- @return #CTLD_CARGO CargoObject
function CTLD:AddStaticsCargo(Name,Mass,Stock,SubCategory,DontShowInMenu,Location) function CTLD:AddStaticsCargo(Name,Mass,Stock,SubCategory,DontShowInMenu,Location,UnitTypes)
self:T(self.lid .. " AddStaticsCargo") self:T(self.lid .. " AddStaticsCargo")
self.CargoCounter = self.CargoCounter + 1 self.CargoCounter = self.CargoCounter + 1
local type = CTLD_CARGO.Enum.STATIC local type = CTLD_CARGO.Enum.STATIC
@@ -6672,6 +6791,9 @@ function CTLD:AddStaticsCargo(Name,Mass,Stock,SubCategory,DontShowInMenu,Locatio
end end
-- Crates are not directly loadable -- Crates are not directly loadable
local cargo = CTLD_CARGO:New(self.CargoCounter,Name,template,type,false,false,1,nil,nil,Mass,Stock,SubCategory,DontShowInMenu,Location) local cargo = CTLD_CARGO:New(self.CargoCounter,Name,template,type,false,false,1,nil,nil,Mass,Stock,SubCategory,DontShowInMenu,Location)
if UnitTypes then
cargo:AddUnitTypeName(UnitTypes)
end
cargo:SetStaticResourceMap(ResourceMap) cargo:SetStaticResourceMap(ResourceMap)
table.insert(self.Cargo_Statics,cargo) table.insert(self.Cargo_Statics,cargo)
if SubCategory and self.usesubcats ~= true then self.usesubcats=true end if SubCategory and self.usesubcats ~= true then self.usesubcats=true end
@@ -8805,6 +8927,34 @@ end
return self return self
end end
--- (Internal) FSM Function onafterGetCrates.
-- @param #CTLD self
-- @param #string From State.
-- @param #string Event Trigger.
-- @param #string To State.
-- @param Wrapper.Group#GROUP Group Group Object.
-- @param Wrapper.Unit#UNIT Unit Unit Object.
-- @param #table Cargotable Table of #CTLD_CARGO objects spawned via "Get".
-- @return #CTLD self
function CTLD:onaftergetcrates(From, Event, To, Group, Unit, Cargotable)
self:T({From, Event, To})
return self
end
--- (Internal) FSM Function onafterGetCrates.
-- @param #CTLD self
-- @param #string From State.
-- @param #string Event Trigger.
-- @param #string To State.
-- @param Wrapper.Group#GROUP Group Group Object.
-- @param Wrapper.Unit#UNIT Unit Unit Object.
-- @param #table Cargotable Table of #CTLD_CARGO objects spawned via "Get".
-- @return #CTLD self
function CTLD:onafterremovecratesnearby(From, Event, To, Group, Unit, Cargotable)
self:T({From, Event, To})
return self
end
--- (Internal) FSM Function onbeforeCratesBuild. --- (Internal) FSM Function onbeforeCratesBuild.
-- @param #CTLD self -- @param #CTLD self
-- @param #string From State. -- @param #string From State.