From 32f0bb33c3fcfe7a84004869adb3848e9b6e483d Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Thu, 13 Mar 2025 10:50:15 +0100 Subject: [PATCH 1/3] #ZONE - Trigger added OnAfterZoneEmpty and OnAfterObjectDead --- Moose Development/Moose/Core/Zone.lua | 48 ++++++++++++++++++++++- Moose Development/Moose/Wrapper/Group.lua | 2 +- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Core/Zone.lua b/Moose Development/Moose/Core/Zone.lua index 32ec18222..4e97f195b 100644 --- a/Moose Development/Moose/Core/Zone.lua +++ b/Moose Development/Moose/Core/Zone.lua @@ -605,10 +605,13 @@ function ZONE_BASE:Trigger(Objects) self:AddTransition("TriggerStopped","TriggerStart","TriggerRunning") self:AddTransition("*","EnteredZone","*") self:AddTransition("*","LeftZone","*") + self:AddTransition("*","ZoneEmpty","*") + self:AddTransition("*","ObjectDead","*") self:AddTransition("*","TriggerRunCheck","*") self:AddTransition("*","TriggerStop","TriggerStopped") self:TriggerStart() self.checkobjects = Objects + self.ObjectsInZone = false if UTILS.IsInstanceOf(Objects,"SET_BASE") then self.objectset = Objects.Set else @@ -646,6 +649,22 @@ function ZONE_BASE:Trigger(Objects) -- @param #string Event Event. -- @param #string To To state. -- @param Wrapper.Controllable#CONTROLLABLE Controllable The controllable leaving the zone. + + --- On After "ObjectDead" event. An observed object has left the zone. + -- @function [parent=#ZONE_BASE] OnAfterObjectDead + -- @param #ZONE_BASE self + -- @param #string From From state. + -- @param #string Event Event. + -- @param #string To To state. + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The controllable which died. Might be nil. + + --- On After "ZoneEmpty" event. All observed objects have left the zone or are dead. + -- @function [parent=#ZONE_BASE] OnAfterZoneEmpty + -- @param #ZONE_BASE self + -- @param #string From From state. + -- @param #string Event Event. + -- @param #string To To state. + end --- (Internal) Check the assigned objects for being in/out of the zone @@ -659,9 +678,13 @@ function ZONE_BASE:_TriggerCheck(fromstart) -- just earmark everyone in/out for _,_object in pairs(objectset) do local obj = _object -- Wrapper.Controllable#CONTROLLABLE - if not obj.TriggerInZone then obj.TriggerInZone = {} end + if not obj.TriggerInZone then + obj.TriggerInZone = {} + obj.TriggerZoneDeadNotification = false + end if obj and obj:IsAlive() and self:IsCoordinateInZone(obj:GetCoordinate()) then obj.TriggerInZone[self.ZoneName] = true + self.ObjectsInZone = true else obj.TriggerInZone[self.ZoneName] = false end @@ -669,6 +692,7 @@ function ZONE_BASE:_TriggerCheck(fromstart) end else -- Check for changes + local objcount = 0 for _,_object in pairs(objectset) do local obj = _object -- Wrapper.Controllable#CONTROLLABLE if obj and obj:IsAlive() then @@ -683,11 +707,20 @@ function ZONE_BASE:_TriggerCheck(fromstart) -- is obj in zone? local inzone = self:IsCoordinateInZone(obj:GetCoordinate()) --self:I("Object "..obj:GetName().." is in zone: "..tostring(inzone)) + if inzone and obj.TriggerInZone[self.ZoneName] then + -- just count + objcount = objcount + 1 + self.ObjectsInZone = true + obj.TriggerZoneDeadNotification = false + end if inzone and not obj.TriggerInZone[self.ZoneName] then -- wasn't in zone before --self:I("Newly entered") self:__EnteredZone(0.5,obj) obj.TriggerInZone[self.ZoneName] = true + objcount = objcount + 1 + self.ObjectsInZone = true + obj.TriggerZoneDeadNotification = false elseif (not inzone) and obj.TriggerInZone[self.ZoneName] then -- has left the zone --self:I("Newly left") @@ -696,8 +729,21 @@ function ZONE_BASE:_TriggerCheck(fromstart) else --self:I("Not left or not entered, or something went wrong!") end + else + -- object dead + if not obj.TriggerZoneDeadNotification == true then + obj.TriggerInZone = nil + self:__ObjectDead(0.5,obj) + obj.TriggerZoneDeadNotification = true + end end end + -- zone empty? + if objcount == 0 and self.ObjectsInZone == true then + -- zone was not but is now empty + self.ObjectsInZone = false + self:__ZoneEmpty(0.5) + end end return self end diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 75ece35ee..9c183238d 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -2816,7 +2816,7 @@ do -- Event Handling self:EventDispatcher():Reset( self ) - for UnitID, UnitData in pairs( self:GetUnits() ) do + for UnitID, UnitData in pairs( self:GetUnits() or {}) do UnitData:ResetEvents() end From 3c57928f4635bdf70df11e73022d449b22462bd8 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 13 Mar 2025 16:40:57 +0100 Subject: [PATCH 2/3] Update Airbase.lua - Fixed bug in counting the number of parking spots per terminal type --- Moose Development/Moose/Wrapper/Airbase.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moose Development/Moose/Wrapper/Airbase.lua b/Moose Development/Moose/Wrapper/Airbase.lua index 21fd34fda..5bb9af837 100644 --- a/Moose Development/Moose/Wrapper/Airbase.lua +++ b/Moose Development/Moose/Wrapper/Airbase.lua @@ -1638,7 +1638,7 @@ function AIRBASE:_InitParkingSpots() self.NparkingTotal=self.NparkingTotal+1 for _,terminalType in pairs(AIRBASE.TerminalType) do - if self._CheckTerminalType(terminalType, park.TerminalType) then + if self._CheckTerminalType(park.TerminalType, terminalType) then self.NparkingTerminal[terminalType]=self.NparkingTerminal[terminalType]+1 end end From 6028c91f81052ad4cc256f0edbcf1268b337ce74 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Fri, 14 Mar 2025 10:40:49 +0100 Subject: [PATCH 3/3] #NET small fix if PlayerSlot remains nil --- Moose Development/Moose/Wrapper/Net.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Wrapper/Net.lua b/Moose Development/Moose/Wrapper/Net.lua index 7316075fd..716954717 100644 --- a/Moose Development/Moose/Wrapper/Net.lua +++ b/Moose Development/Moose/Wrapper/Net.lua @@ -207,10 +207,10 @@ function NET:_EventHandler(EventData) local PlayerID = self:GetPlayerIDByName(name) or "none" local PlayerSide, PlayerSlot = self:GetSlot(data.IniUnit) if not PlayerSide then PlayerSide = EventData.IniCoalition end - if not PlayerSlot then PlayerSlot = EventData.IniUnit:GetID() end + if not PlayerSlot then PlayerSlot = EventData.IniUnit:GetID() or -1 end local TNow = timer.getTime() - self:T(self.lid.."Event for: "..name.." | UCID: "..ucid .. " | ID/SIDE/SLOT "..PlayerID.."/"..PlayerSide.."/"..PlayerSlot) + --self:T(self.lid.."Event for: "..name.." | UCID: "..ucid .. " | ID/SIDE/SLOT "..PlayerID.."/"..PlayerSide.."/"..PlayerSlot) -- Joining if data.id == EVENTS.PlayerEnterUnit or data.id == EVENTS.PlayerEnterAircraft then