mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-12 04:31:09 +00:00
@@ -1045,6 +1045,25 @@ do
|
||||
-- ... your code here ...
|
||||
-- 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
|
||||
--
|
||||
-- This function is called when a player has left the helicopter or crashed/died:
|
||||
@@ -1556,7 +1575,8 @@ function CTLD:New(Coalition, Prefixes, Alias)
|
||||
self:AddTransition("*", "CratesPickedUp", "*") -- CTLD pickup event.
|
||||
self:AddTransition("*", "TroopsDeployed", "*") -- 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("*", "UnitsSpawn", "*") -- CTLD Unit spawned.
|
||||
self:AddTransition("*", "CratesRepaired", "*") -- CTLD repair event.
|
||||
@@ -1564,6 +1584,7 @@ function CTLD:New(Coalition, Prefixes, Alias)
|
||||
self:AddTransition("*", "CratesRepairStarted", "*") -- CTLD repair event.
|
||||
self:AddTransition("*", "CratesPacked", "*") -- CTLD repack 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("*", "Loaded", "*") -- CTLD load 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!
|
||||
-- @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.
|
||||
-- @function [parent=#CTLD] OnAfterCratesBuild
|
||||
-- @param #CTLD self
|
||||
@@ -2948,7 +2991,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
|
||||
self:T("_AddCrateQuantityMenus "..cargoObj.Name)
|
||||
local needed = cargoObj:GetCratesNeeded() or 1
|
||||
local stockEntry = self:_GetCrateStockEntry(cargoObj, stockSummary)
|
||||
local stock = 0
|
||||
local stock = nil
|
||||
if stockEntry and type(stockEntry.Stock) == "number" then
|
||||
stock = stockEntry.Stock
|
||||
else
|
||||
@@ -2973,6 +3016,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
|
||||
return self
|
||||
end
|
||||
local capacitySets = nil
|
||||
local capacityCrates = nil
|
||||
if Unit then
|
||||
local capabilities = self:_GetUnitCapabilities(Unit)
|
||||
local capacity = capabilities and capabilities.cratelimit or 0
|
||||
@@ -2989,6 +3033,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
|
||||
if space < 0 then
|
||||
space = 0
|
||||
end
|
||||
capacityCrates = space
|
||||
local perSet = needed > 0 and needed or 1
|
||||
capacitySets = math.floor(space / perSet)
|
||||
end
|
||||
@@ -3006,6 +3051,7 @@ function CTLD:_AddCrateQuantityMenus(Group, Unit, parentMenu, cargoObj, stockSum
|
||||
end
|
||||
self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad))
|
||||
local maxMassSets = nil
|
||||
local maxMassCrates = nil
|
||||
if Unit then
|
||||
local maxload = self:_GetMaxLoadableMass(Unit)
|
||||
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
|
||||
end
|
||||
end
|
||||
if type(maxload)=="number"and maxload>0 and perCrateMass>0 then
|
||||
maxMassCrates=math.floor(maxload/perCrateMass)
|
||||
end
|
||||
end
|
||||
self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad))
|
||||
self:T("_AddCrateQuantityMenus maxQuantity "..maxQuantity.." allowLoad "..tostring(allowLoad))
|
||||
if maxQuantity < 1 then
|
||||
return self
|
||||
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)
|
||||
local canLoad = (allowLoad and (not capacitySets or capacitySets >= 1) and (not maxMassSets or maxMassSets >= 1))
|
||||
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)
|
||||
else
|
||||
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
|
||||
msg = "Weight limit reached"
|
||||
else
|
||||
msg = "Crate limit reached"
|
||||
end
|
||||
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
|
||||
parentMenu:Refresh()
|
||||
|
||||
return self
|
||||
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)
|
||||
local canLoad = (allowLoad and (not capacitySets or capacitySets >= quantity) and (not maxMassSets or maxMassSets >= quantity))
|
||||
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)
|
||||
else
|
||||
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
|
||||
msg = "Weight limit reached"
|
||||
else
|
||||
msg = "Crate limit reached"
|
||||
end
|
||||
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
|
||||
@@ -3200,7 +3264,7 @@ end
|
||||
-- @param #number number Number of crates to generate (for dropping)
|
||||
-- @param #boolean drop If true we\'re dropping from heli rather than loading.
|
||||
-- @param #boolean pack If true we\'re packing crates from a template rather than loading or dropping
|
||||
function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet)
|
||||
function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppressGetEvent)
|
||||
self:T(self.lid .. " _GetCrates")
|
||||
|
||||
-- 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
|
||||
local inzone = false
|
||||
local drop = drop or false
|
||||
local suppressGetEvent = suppressGetEvent or false
|
||||
local ship = nil
|
||||
local width = 20
|
||||
local distance = nil
|
||||
@@ -3298,6 +3363,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet)
|
||||
local heading = Unit:GetHeading() + 1
|
||||
local height = Unit:GetHeight()
|
||||
local droppedcargo = {}
|
||||
local obtainedcargo = {}
|
||||
local cratedistance = 0
|
||||
local rheading = 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.
|
||||
end
|
||||
end
|
||||
if not drop and not pack then
|
||||
table.insert(obtainedcargo, realcargo)
|
||||
end
|
||||
local CCat4, CType4, CShape4 = cargotype:GetStaticTypeAndShape()
|
||||
realcargo:SetStaticTypeAndShape(CCat4,CType4,CShape4)
|
||||
table.insert(self.Spawned_Cargo, realcargo)
|
||||
@@ -3433,6 +3502,9 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet)
|
||||
if not quiet then
|
||||
self:_SendMessage(text, 10, false, Group)
|
||||
end
|
||||
if not pack and not suppressGetEvent and #obtainedcargo > 0 then
|
||||
self:__GetCrates(1, Group, Unit, obtainedcargo)
|
||||
end
|
||||
end
|
||||
self:_RefreshLoadCratesMenu(Group, Unit)
|
||||
return true
|
||||
@@ -3574,6 +3646,7 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit)
|
||||
local zone = ZONE_RADIUS:New("CTLD_C130RemoveZone",location:GetVec2(),finddist,false)
|
||||
local nearestGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({zone}):FilterOnce()
|
||||
local removedAny = false
|
||||
local removedTable = {}
|
||||
for _, gr in pairs(nearestGroups.Set) do
|
||||
local gc = gr:GetCoordinate()
|
||||
if gc then
|
||||
@@ -3588,6 +3661,7 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit)
|
||||
for _, tName in pairs(templ) do
|
||||
if string.match(gr:GetName(),tName) then
|
||||
local cname = cfg.Name or "Unit"
|
||||
table.insert(removedTable, { groupName = gr:GetName(), name = cname, template = tName, coordinate = gr:GetCoordinate() })
|
||||
gr:Destroy(false)
|
||||
self:_SendMessage(cname.." have been removed",10,false,_group)
|
||||
removedAny = true
|
||||
@@ -3602,6 +3676,9 @@ function CTLD:_C130RemoveUnitsNearby(_group,_unit)
|
||||
end
|
||||
if not removedAny then
|
||||
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
|
||||
return self
|
||||
end
|
||||
@@ -3623,8 +3700,11 @@ function CTLD:_RemoveCratesNearby(_group, _unit)
|
||||
local entry=_entry
|
||||
local name=entry:GetName()or"none"
|
||||
text:Add(string.format("Crate for %s, %dkg removed",name,entry.PerCrateMass))
|
||||
if entry:GetPositionable()then
|
||||
entry:GetPositionable():Destroy(false)
|
||||
local pos = entry:GetPositionable()
|
||||
if pos then
|
||||
-- Store removal position before destroying so callbacks can use it.
|
||||
entry.coordinate = pos:GetCoordinate()
|
||||
pos:Destroy(false)
|
||||
end
|
||||
table.insert(removedIDs,entry:GetID())
|
||||
end
|
||||
@@ -3643,6 +3723,9 @@ function CTLD:_RemoveCratesNearby(_group, _unit)
|
||||
end
|
||||
end
|
||||
self:_RefreshLoadCratesMenu(_group,_unit)
|
||||
|
||||
-- Trigger FSM event for removed crates.
|
||||
self:__RemoveCratesNearby(1, _group, _unit, crates)
|
||||
else
|
||||
self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group)
|
||||
end
|
||||
@@ -4977,7 +5060,7 @@ end
|
||||
-- @param Wrapper.Unit#UNIT Unit The calling unit
|
||||
-- @param #CTLD_CARGO cargoObj
|
||||
-- @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
|
||||
self:_SendMessage("You need to open the door(s) to load cargo!", 10, false, Group)
|
||||
return self
|
||||
@@ -4994,20 +5077,25 @@ function CTLD:_GetAndLoad(Group, Unit, cargoObj, quantity)
|
||||
if space < 0 then space = 0 end
|
||||
local perSet = needed > 0 and needed or 1
|
||||
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)
|
||||
return self
|
||||
end
|
||||
if count > capacitySets then count = capacitySets end
|
||||
if capacitySets < 1 and LoadAnyWay then
|
||||
count = 1
|
||||
elseif count > capacitySets then
|
||||
count = capacitySets
|
||||
end
|
||||
end
|
||||
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
|
||||
local uname = Unit:GetName()
|
||||
self._batchCrateLoad = self._batchCrateLoad or {}
|
||||
self._batchCrateLoad[uname] = { remaining = count, group = Group, cname = cargoObj.Name, loaded = 0, partials = 0 }
|
||||
local details = (LoadAnyWay == true)
|
||||
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
|
||||
return self
|
||||
@@ -5443,11 +5531,34 @@ function CTLD:_RefreshF10Menus()
|
||||
crateStockSummary = self:_CountStockPlusInHeloPlusAliveGroups(false)
|
||||
end
|
||||
|
||||
local function addCrateMenuEntry(cargoObj,parentMenu)
|
||||
local function addCrateMenuEntry(cargoObj,parentMenu,subcatmenus)
|
||||
if cargoObj.DontShowInMenu then
|
||||
return
|
||||
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 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)
|
||||
@@ -5459,21 +5570,21 @@ function CTLD:_RefreshF10Menus()
|
||||
local suffix = self:_FormatCrateStockSuffix(cargoObj,crateStockSummary)
|
||||
if suffix then txt = txt..suffix end
|
||||
end
|
||||
local mSet = MENU_GROUP:New(_group,txt,parentMenu)
|
||||
local mSet = MENU_GROUP:New(_group,txt,parent)
|
||||
_group.CTLD_CrateMenus[cargoObj.Name] = mSet
|
||||
self:_AddCrateQuantityMenus(_group,_unit,mSet,cargoObj,crateStockSummary)
|
||||
end
|
||||
|
||||
if self.usesubcats == true then
|
||||
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
|
||||
addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory] or cratesmenu)
|
||||
addCrateMenuEntry(cargoObj,cratesmenu,subcatmenus)
|
||||
end
|
||||
for _,cargoObj in pairs(self.Cargo_Statics) do
|
||||
addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory] or cratesmenu)
|
||||
addCrateMenuEntry(cargoObj,cratesmenu,subcatmenus)
|
||||
end
|
||||
else
|
||||
for _,cargoObj in pairs(self.Cargo_Crates) do
|
||||
@@ -5486,8 +5597,12 @@ function CTLD:_RefreshF10Menus()
|
||||
else
|
||||
if self.usesubcats == true then
|
||||
local subcatmenus = {}
|
||||
for catName, _ in pairs(self.subcats) do
|
||||
subcatmenus[catName] = MENU_GROUP:New(_group, catName, cratesmenu) -- fixed variable case
|
||||
local function getSubcatMenu(catName)
|
||||
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
|
||||
for _, cargoObj in pairs(self.Cargo_Crates) do
|
||||
if not cargoObj.DontShowInMenu then
|
||||
@@ -5501,11 +5616,11 @@ function CTLD:_RefreshF10Menus()
|
||||
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)
|
||||
MENU_GROUP_COMMAND:New(_group, txt, getSubcatMenu(cargoObj.Subcategory), self._GetCrates, self, _group, _unit, cargoObj)
|
||||
end
|
||||
end
|
||||
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 txt
|
||||
if needed > 1 then
|
||||
@@ -5516,7 +5631,7 @@ function CTLD:_RefreshF10Menus()
|
||||
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)
|
||||
MENU_GROUP_COMMAND:New(_group, txt, getSubcatMenu(cargoObj.Subcategory), self._GetCrates, self, _group, _unit, cargoObj)
|
||||
end
|
||||
end
|
||||
else
|
||||
@@ -5536,7 +5651,7 @@ function CTLD:_RefreshF10Menus()
|
||||
end
|
||||
end
|
||||
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 txt
|
||||
if needed > 1 then
|
||||
@@ -5735,7 +5850,7 @@ function CTLD:_RefreshLoadCratesMenu(Group,Unit)
|
||||
-- @param Wrapper.Group#GROUP Group
|
||||
-- @param Wrapper.Unit#UNIT Unit
|
||||
-- @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"))
|
||||
|
||||
-- 1) Must be landed or hovering
|
||||
@@ -5776,7 +5891,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
|
||||
local found = #matchingCrates
|
||||
local batch = self._batchCrateLoad and self._batchCrateLoad[Unit:GetName()] or nil
|
||||
local prevSuppress = self.suppressmessages
|
||||
if batch and batch.cname == cargoName then self.suppressmessages = true end
|
||||
if batch and (not details) and batch.cname == cargoName then self.suppressmessages = true end
|
||||
|
||||
-- 4) Check capacity
|
||||
local unitName = Unit:GetName()
|
||||
@@ -5785,6 +5900,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
|
||||
local capacity = capabilities.cratelimit or 0
|
||||
if loadedData.Cratesloaded >= capacity then
|
||||
self:_SendMessage("No more capacity to load crates!", 10, false, Group)
|
||||
self.suppressmessages = prevSuppress
|
||||
return self
|
||||
end
|
||||
|
||||
@@ -5793,6 +5909,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
|
||||
local toLoad = math.min(found, needed, spaceLeft)
|
||||
if toLoad < 1 then
|
||||
self:_SendMessage("Cannot load crates: either none found or no capacity left.", 10, false, Group)
|
||||
self.suppressmessages = prevSuppress
|
||||
return self
|
||||
end
|
||||
|
||||
@@ -5831,7 +5948,7 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
|
||||
|
||||
-- 7) Show final message, including a special note if capacity is now reached
|
||||
local loadedHere = toLoad
|
||||
if not batch then
|
||||
if details or (not batch) then
|
||||
if loadedHere < needed and loadedData.Cratesloaded >= capacity then
|
||||
self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s. Cargo limit is now reached!", loadedHere, needed, cargoName), 10, false, Group)
|
||||
else
|
||||
@@ -5862,11 +5979,13 @@ function CTLD:_LoadSingleCrateSet(Group, Unit, cargoName)
|
||||
batch.remaining = (batch.remaining or 1) - 1
|
||||
if batch.remaining <= 0 then
|
||||
self.suppressmessages = prevSuppress
|
||||
if not details then
|
||||
local txt = string.format("Loaded %d %s.", batch.loaded, cargoName)
|
||||
if batch.partials and batch.partials > 0 then
|
||||
txt = txt .. " Some sets could not be fully loaded."
|
||||
end
|
||||
self:_SendMessage(txt, 10, false, batch.group)
|
||||
end
|
||||
self._batchCrateLoad[Unit:GetName()] = nil
|
||||
else
|
||||
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 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
|
||||
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.CargoCounter = self.CargoCounter + 1
|
||||
local type = CTLD_CARGO.Enum.STATIC
|
||||
@@ -6672,6 +6791,9 @@ function CTLD:AddStaticsCargo(Name,Mass,Stock,SubCategory,DontShowInMenu,Locatio
|
||||
end
|
||||
-- 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)
|
||||
if UnitTypes then
|
||||
cargo:AddUnitTypeName(UnitTypes)
|
||||
end
|
||||
cargo:SetStaticResourceMap(ResourceMap)
|
||||
table.insert(self.Cargo_Statics,cargo)
|
||||
if SubCategory and self.usesubcats ~= true then self.usesubcats=true end
|
||||
@@ -8805,6 +8927,34 @@ end
|
||||
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: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.
|
||||
-- @param #CTLD self
|
||||
-- @param #string From State.
|
||||
|
||||
Reference in New Issue
Block a user