mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-21 11:53:30 +00:00
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user