diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index e3b6ec8b9..9db404093 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -192,6 +192,29 @@ function BASE:Event() return _EVENTDISPATCHER end +--- Remove all subscribed events +-- @param #BASE self +-- @return #BASE +function BASE:EventRemoveAll() + + _EVENTDISPATCHER:RemoveAll( self ) + + return self +end + +--- Subscribe to a S_EVENT_DEAD event. +-- @param #BASE self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @return #BASE +function BASE:EventOnDead( EventFunction ) + + _EVENTDISPATCHER:OnEventGeneric( EventFunction, self, world.event.S_EVENT_DEAD ) + + return self +end + + + diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 694099d59..e752a7d3e 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -81,7 +81,7 @@ end --- Initializes the Events structure for the event -- @param #EVENT self -- @param DCSWorld#world.event EventID --- @param #string EventClass +-- @param Core.Base#BASE EventClass -- @return #EVENT.Events function EVENT:Init( EventID, EventClass ) self:F3( { _EVENTCODES[EventID], EventClass } ) @@ -96,29 +96,42 @@ end --- Removes an Events entry -- @param #EVENT self --- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. -- @param DCSWorld#world.event EventID -- @return #EVENT.Events -function EVENT:Remove( EventSelf, EventID ) - self:F3( { EventSelf, _EVENTCODES[EventID] } ) +function EVENT:Remove( EventClass, EventID ) + self:F3( { EventClass, _EVENTCODES[EventID] } ) - local EventClass = EventSelf:GetClassNameAndID() + local EventClass = EventClass self.Events[EventID][EventClass] = nil end +--- Clears all event subscriptions for a @{Core.Base#BASE} derived object. +-- @param #EVENT self +-- @param Core.Base#BASE EventObject +function EVENT:RemoveAll( EventObject ) + self:F3( { EventObject:GetClassNameAndID() } ) + + local EventClass = EventObject:GetClassNameAndID() + for EventID, EventData in pairs( self.Events ) do + self.Events[EventID][EventClass] = nil + end +end + + --- Create an OnDead event handler for a group -- @param #EVENT self -- @param #table EventTemplate -- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. +-- @param EventClass The instance of the class for which the event is. -- @param #function OnEventFunction -- @return #EVENT -function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventClass, OnEventFunction ) self:F2( EventTemplate.name ) for EventUnitID, EventUnit in pairs( EventTemplate.units ) do - OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) + OnEventFunction( self, EventUnit.name, EventFunction, EventClass ) end return self end @@ -126,15 +139,15 @@ end --- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param Base#BASE EventClass The self instance of the class for which the event is captured. When the event happens, the event process will be called in this class provided. -- @param EventID -- @return #EVENT -function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) +function EVENT:OnEventGeneric( EventFunction, EventClass, EventID ) self:F2( { EventID } ) - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + local Event = self:Init( EventID, EventClass ) Event.EventFunction = EventFunction - Event.EventSelf = EventSelf + Event.EventClass = EventClass return self end @@ -143,19 +156,19 @@ end -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param Base#BASE EventClass The self instance of the class for which the event is. -- @param EventID -- @return #EVENT -function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) +function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, EventID ) self:F2( EventDCSUnitName ) - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + local Event = self:Init( EventID, EventClass ) if not Event.IniUnit then Event.IniUnit = {} end Event.IniUnit[EventDCSUnitName] = {} Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction - Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf + Event.IniUnit[EventDCSUnitName].EventClass = EventClass return self end @@ -165,12 +178,12 @@ do -- OnBirth -- @param #EVENT self -- @param Group#GROUP EventGroup -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param EventSelf The self instance of the class for which the event is. + -- @param EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) + function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventClass ) self:F2( EventTemplate.name ) - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, self.OnBirthForUnit ) return self end @@ -178,12 +191,12 @@ do -- OnBirth --- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnBirth( EventFunction, EventSelf ) + function EVENT:OnBirth( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_BIRTH ) return self end @@ -192,24 +205,24 @@ do -- OnBirth -- @param #EVENT self -- @param #string EventDCSUnitName The id of the unit for the event to be handled. -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_BIRTH ) return self end --- Stop listening to S_EVENT_BIRTH event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnBirthRemove( EventSelf ) + function EVENT:OnBirthRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_BIRTH ) + self:Remove( EventClass, world.event.S_EVENT_BIRTH ) return self end @@ -223,12 +236,12 @@ do -- OnCrash -- @param #EVENT self -- @param Group#GROUP EventGroup -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param EventSelf The self instance of the class for which the event is. + -- @param EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) + function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventClass ) self:F2( EventTemplate.name ) - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, self.OnCrashForUnit ) return self end @@ -236,12 +249,12 @@ do -- OnCrash --- Set a new listener for an S_EVENT_CRASH event. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnCrash( EventFunction, EventSelf ) + function EVENT:OnCrash( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_CRASH ) return self end @@ -250,24 +263,24 @@ do -- OnCrash -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_CRASH ) return self end --- Stop listening to S_EVENT_CRASH event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnCrashRemove( EventSelf ) + function EVENT:OnCrashRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_CRASH ) + self:Remove( EventClass, world.event.S_EVENT_CRASH ) return self end @@ -280,12 +293,12 @@ do -- OnDead -- @param #EVENT self -- @param Group#GROUP EventGroup -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param EventSelf The self instance of the class for which the event is. + -- @param EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) + function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventClass ) self:F2( EventTemplate.name ) - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, self.OnDeadForUnit ) return self end @@ -293,12 +306,12 @@ do -- OnDead --- Set a new listener for an S_EVENT_DEAD event. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnDead( EventFunction, EventSelf ) + function EVENT:OnDead( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_DEAD ) return self end @@ -308,24 +321,24 @@ do -- OnDead -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_DEAD ) return self end --- Stop listening to S_EVENT_DEAD event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnDeadRemove( EventSelf ) + function EVENT:OnDeadRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_DEAD ) + self:Remove( EventClass, world.event.S_EVENT_DEAD ) return self end @@ -338,12 +351,12 @@ do -- OnPilotDead --- Set a new listener for an S_EVENT_PILOT_DEAD event. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnPilotDead( EventFunction, EventSelf ) + function EVENT:OnPilotDead( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_PILOT_DEAD ) return self end @@ -352,24 +365,24 @@ do -- OnPilotDead -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_PILOT_DEAD ) return self end --- Stop listening to S_EVENT_PILOT_DEAD event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnPilotDeadRemove( EventSelf ) + function EVENT:OnPilotDeadRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_PILOT_DEAD ) + self:Remove( EventClass, world.event.S_EVENT_PILOT_DEAD ) return self end @@ -381,12 +394,12 @@ do -- OnLand -- @param #EVENT self -- @param #table EventTemplate -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param EventSelf The self instance of the class for which the event is. + -- @param EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) + function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventClass ) self:F2( EventTemplate.name ) - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, self.OnLandForUnit ) return self end @@ -395,24 +408,24 @@ do -- OnLand -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_LAND ) return self end --- Stop listening to S_EVENT_LAND event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnLandRemove( EventSelf ) + function EVENT:OnLandRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_LAND ) + self:Remove( EventClass, world.event.S_EVENT_LAND ) return self end @@ -425,12 +438,12 @@ do -- OnTakeOff -- @param #EVENT self -- @param #table EventTemplate -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param EventSelf The self instance of the class for which the event is. + -- @param EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) + function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventClass ) self:F2( EventTemplate.name ) - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, self.OnTakeOffForUnit ) return self end @@ -439,24 +452,24 @@ do -- OnTakeOff -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_TAKEOFF ) return self end --- Stop listening to S_EVENT_TAKEOFF event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnTakeOffRemove( EventSelf ) + function EVENT:OnTakeOffRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_TAKEOFF ) + self:Remove( EventClass, world.event.S_EVENT_TAKEOFF ) return self end @@ -470,12 +483,12 @@ do -- OnEngineShutDown -- @param #EVENT self -- @param #table EventTemplate -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param EventSelf The self instance of the class for which the event is. + -- @param EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) + function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventClass ) self:F2( EventTemplate.name ) - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, self.OnEngineShutDownForUnit ) return self end @@ -484,24 +497,24 @@ do -- OnEngineShutDown -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_ENGINE_SHUTDOWN ) return self end --- Stop listening to S_EVENT_ENGINE_SHUTDOWN event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnEngineShutDownRemove( EventSelf ) + function EVENT:OnEngineShutDownRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + self:Remove( EventClass, world.event.S_EVENT_ENGINE_SHUTDOWN ) return self end @@ -514,24 +527,24 @@ do -- OnEngineStartUp -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_ENGINE_STARTUP ) return self end --- Stop listening to S_EVENT_ENGINE_STARTUP event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnEngineStartUpRemove( EventSelf ) + function EVENT:OnEngineStartUpRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + self:Remove( EventClass, world.event.S_EVENT_ENGINE_STARTUP ) return self end @@ -542,12 +555,12 @@ do -- OnShot --- Set a new listener for an S_EVENT_SHOT event. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnShot( EventFunction, EventSelf ) + function EVENT:OnShot( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_SHOT ) return self end @@ -556,24 +569,24 @@ do -- OnShot -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_SHOT ) return self end --- Stop listening to S_EVENT_SHOT event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnShotRemove( EventSelf ) + function EVENT:OnShotRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_SHOT ) + self:Remove( EventClass, world.event.S_EVENT_SHOT ) return self end @@ -586,12 +599,12 @@ do -- OnHit --- Set a new listener for an S_EVENT_HIT event. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnHit( EventFunction, EventSelf ) + function EVENT:OnHit( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_HIT ) return self end @@ -600,24 +613,24 @@ do -- OnHit -- @param #EVENT self -- @param #string EventDCSUnitName -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) + function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventClass ) self:F2( EventDCSUnitName ) - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventClass, world.event.S_EVENT_HIT ) return self end --- Stop listening to S_EVENT_HIT event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnHitRemove( EventSelf ) + function EVENT:OnHitRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_HIT ) + self:Remove( EventClass, world.event.S_EVENT_HIT ) return self end @@ -629,24 +642,24 @@ do -- OnPlayerEnterUnit --- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) + function EVENT:OnPlayerEnterUnit( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_PLAYER_ENTER_UNIT ) return self end --- Stop listening to S_EVENT_PLAYER_ENTER_UNIT event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnPlayerEnterRemove( EventSelf ) + function EVENT:OnPlayerEnterRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + self:Remove( EventClass, world.event.S_EVENT_PLAYER_ENTER_UNIT ) return self end @@ -657,24 +670,24 @@ do -- OnPlayerLeaveUnit --- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. -- @param #EVENT self -- @param #function EventFunction The function to be called when the event occurs for the unit. - -- @param Base#BASE EventSelf The self instance of the class for which the event is. + -- @param Base#BASE EventClass The self instance of the class for which the event is. -- @return #EVENT - function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) + function EVENT:OnPlayerLeaveUnit( EventFunction, EventClass ) self:F2() - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + self:OnEventGeneric( EventFunction, EventClass, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) return self end --- Stop listening to S_EVENT_PLAYER_LEAVE_UNIT event. -- @param #EVENT self - -- @param Base#BASE EventSelf + -- @param Base#BASE EventClass -- @return #EVENT - function EVENT:OnPlayerLeaveRemove( EventSelf ) + function EVENT:OnPlayerLeaveRemove( EventClass ) self:F2() - self:Remove( EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + self:Remove( EventClass, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) return self end @@ -718,15 +731,20 @@ function EVENT:onEvent( Event ) --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() end self:E( { _EVENTCODES[Event.id], Event.initiator, Event.IniDCSUnitName, Event.target, Event.TgtDCSUnitName, Event.weapon, Event.WeaponName } ) - for ClassName, EventData in pairs( self.Events[Event.id] ) do + + -- Okay, we got the event from DCS. Now loop the self.Events[] table for the received Event.id, and for each EventData registered, check if a function needs to be called. + for EventClass, EventData in pairs( self.Events[Event.id] ) do + -- If the EventData is for a UNIT, the call directly the EventClass EventFunction for that UNIT. if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then - self:T( { "Calling event function for class ", ClassName, " unit ", Event.IniUnitName } ) - EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) + self:T( { "Calling EventFunction for Class ", EventClass:GetClassNameAndID(), ", Unit ", Event.IniUnitName } ) + EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventClass, Event ) else + -- If the EventData is not bound to a specific unit, then call the EventClass EventFunction. + -- Note that here the EventFunction will need to implement and determine the logic for the relevant source- or target unit, or weapon. if Event.IniDCSUnit and not EventData.IniUnit then - if ClassName == EventData.EventSelf:GetClassNameAndID() then - self:T( { "Calling event function for class ", ClassName } ) - EventData.EventFunction( EventData.EventSelf, Event ) + if EventClass == EventData.EventClass then + self:T( { "Calling EventFunction for Class ", EventClass:GetClassNameAndID() } ) + EventData.EventFunction( EventData.EventClass, Event ) end end end diff --git a/Moose Development/Moose/Core/StateMachine.lua b/Moose Development/Moose/Core/StateMachine.lua index ba8fb1261..fd353d464 100644 --- a/Moose Development/Moose/Core/StateMachine.lua +++ b/Moose Development/Moose/Core/StateMachine.lua @@ -251,29 +251,6 @@ function STATEMACHINE:todot(filename) dotfile:close() end ---- STATEMACHINE_PROCESS class --- @type STATEMACHINE_PROCESS --- @field Process#PROCESS Process --- @extends StateMachine#STATEMACHINE -STATEMACHINE_PROCESS = { - ClassName = "STATEMACHINE_PROCESS", -} - ---- Creates a new STATEMACHINE_PROCESS object. --- @param #STATEMACHINE_PROCESS self --- @return #STATEMACHINE_PROCESS -function STATEMACHINE_PROCESS:New( FSMT ) - - local self = BASE:Inherit( self, STATEMACHINE:New( FSMT ) ) -- StateMachine#STATEMACHINE_PROCESS - - return self -end - -function STATEMACHINE_PROCESS:_call_handler( handler, params ) - if handler then - return handler( self, unpack( params ) ) - end -end --- STATEMACHINE_TASK class -- @type STATEMACHINE_TASK @@ -357,6 +334,24 @@ function STATEMACHINE_CONTROLLABLE:_call_handler( handler, params ) end end +--- STATEMACHINE_PROCESS class +-- @type STATEMACHINE_PROCESS +-- @field Process#PROCESS Process +-- @extends Core.StateMachine#STATEMACHINE_CONTROLLABLE +STATEMACHINE_PROCESS = { + ClassName = "STATEMACHINE_PROCESS", +} + +--- Creates a new STATEMACHINE_PROCESS object. +-- @param #STATEMACHINE_PROCESS self +-- @return #STATEMACHINE_PROCESS +function STATEMACHINE_PROCESS:New( FSMT ) + + local self = BASE:Inherit( self, STATEMACHINE_CONTROLLABLE:New( FSMT ) ) -- StateMachine#STATEMACHINE_PROCESS + + return self +end + do -- STATEMACHINE_SET --- STATEMACHINE_SET class diff --git a/Moose Development/Moose/Fsm/Process.lua b/Moose Development/Moose/Fsm/Process.lua index a93a17552..73fbcd076 100644 --- a/Moose Development/Moose/Fsm/Process.lua +++ b/Moose Development/Moose/Fsm/Process.lua @@ -67,6 +67,15 @@ function PROCESS:GetMission() return self.ProcessTask.Mission end +function PROCESS:StartEvents() + +end + +function PROCESS:StopEvents() + + self:EventRemoveAll() +end + --- Assign the process to a @{Unit} and activate the process. -- @param #PROCESS self -- @param Unit#UNIT ProcessUnit @@ -76,6 +85,8 @@ function PROCESS:Assign( ProcessTask, ProcessUnit ) self:SetControllable( ProcessUnit ) self:SetTask( ProcessTask ) + self:StartEvents() + self.ProcessGroup = ProcessUnit:GetGroup() --self:Activate() diff --git a/Moose Development/Moose/Moose.lua b/Moose Development/Moose/Moose.lua index 685876f1c..4b3d81f29 100644 --- a/Moose Development/Moose/Moose.lua +++ b/Moose Development/Moose/Moose.lua @@ -62,7 +62,7 @@ Include.File( "Tasking/Task_A2G" ) -- The order of the declarations is important here. Don't touch it. --- Declare the event dispatcher based on the EVENT class -_EVENTDISPATCHER = EVENT:New() -- Event#EVENT +_EVENTDISPATCHER = EVENT:New() -- Core.Event#EVENT --- Declare the main database object, which is used internally by the MOOSE classes. _DATABASE = DATABASE:New() -- Database#DATABASE diff --git a/Moose Development/Moose/Process/Account.lua b/Moose Development/Moose/Process/Account.lua index 5be525333..7d40a916c 100644 --- a/Moose Development/Moose/Process/Account.lua +++ b/Moose Development/Moose/Process/Account.lua @@ -168,7 +168,7 @@ do -- PROCESS_ACCOUNT_DEADS ClassName = "PROCESS_ACCOUNT_DEADS", TargetSetUnit = nil, } - + --- Creates a new DESTROY process. -- @param #PROCESS_ACCOUNT_DEADS self @@ -183,11 +183,13 @@ do -- PROCESS_ACCOUNT_DEADS self.TargetSetUnit = TargetSetUnit self.TaskName = TaskName - _EVENTDISPATCHER:OnDead( self.EventDead, self ) - return self end + function PROCESS_ACCOUNT_DEADS:StartEvents() + self:EventOnDead( self.EventDead ) + end + --- Process Events --- StateMachine callback function @@ -209,13 +211,16 @@ do -- PROCESS_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function PROCESS_ACCOUNT_DEADS:onenterAccount( ProcessUnit, Event, From, To, Event ) + function PROCESS_ACCOUNT_DEADS:onenterAccount( ProcessUnit, EventData, Event, From, To ) + self:T( { ProcessUnit, EventData, Event, From, To } ) + + self:T({self.Controllable}) self.TargetSetUnit:Flush() - if self.TargetSetUnit:FindUnit( Event.IniUnitName ) then - self.TargetSetUnit:RemoveUnitsByName( Event.IniUnitName ) + if self.TargetSetUnit:FindUnit( EventData.IniUnitName ) then local TaskGroup = ProcessUnit:GetGroup() + self.TargetSetUnit:RemoveUnitsByName( EventData.IniUnitName ) MESSAGE:New( "You hit a target. Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:Count() .. " targets ( " .. self.TargetSetUnit:GetUnitTypesText() .. " ) left to be destroyed.", 15, "HQ" ):ToGroup( TaskGroup ) end end @@ -226,7 +231,7 @@ do -- PROCESS_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function PROCESS_ACCOUNT_DEADS:onafterEvent( ProcessUnit, Event, From, To, Event ) + function PROCESS_ACCOUNT_DEADS:onafterEvent( ProcessUnit, Event, From, To, EventData ) if self.TargetSetUnit:Count() > 0 then self:__More( 1 ) @@ -238,11 +243,12 @@ do -- PROCESS_ACCOUNT_DEADS --- DCS Events --- @param #PROCESS_ACCOUNT_DEADS self - -- @param Event#EVENTDATA Event - function PROCESS_ACCOUNT_DEADS:EventDead( Event ) - - if Event.IniDCSUnit then - self:__Event( 1 ) + -- @param Event#EVENTDATA EventData + function PROCESS_ACCOUNT_DEADS:EventDead( EventData ) + self:T( { "EventDead", EventData } ) + + if EventData.IniDCSUnit then + self:__Event( 1, EventData ) end end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index a5d59800e..226a0266a 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -88,8 +88,9 @@ end -- @param #MISSION self function MISSION:SetPlannedMenu() - for _, Task in pairs( self.Tasks ) do - local Task = Task -- Task#TASK_BASE + self:E( self.Tasks ) + for _, TaskData in pairs( self.Tasks ) do + local Task = TaskData -- Tasking.Task#TASK_BASE Task:RemoveMenu() Task:SetPlannedMenu() end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 1744c7a99..5f7174736 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -186,7 +186,7 @@ function TASK_BASE:IsAssignedToGroup( TaskGroup ) return false end ---- Assign the @{Task}to an alive @{Unit}. +--- Assign the @{Task} to an alive @{Unit}. -- @param #TASK_BASE self -- @param Unit#UNIT TaskUnit -- @return #TASK_BASE self @@ -463,7 +463,7 @@ end function TASK_BASE:RemoveProcesses( TaskUnitName ) for ProcessID, ProcessData in pairs( self.Processes[TaskUnitName] ) do - local Process = ProcessData -- Process#PROCESS + local Process = ProcessData -- Process.Process#PROCESS Process:StopEvents() Process = nil self.Processes[TaskUnitName][ProcessID] = nil @@ -827,15 +827,14 @@ function TASK_BASE:OnSuccess( TaskUnit, Fsm, Event, From, To ) self:E("Success") self:UnAssignFromGroups() + self:RemoveMenu() local TaskGroup = TaskUnit:GetGroup() - self.Mission:SetPlannedMenu() self:StateSuccess() -- The task has become successful, the event catchers can be cleaned. - self:CleanUp() - + self:EventRemoveAll() end --- StateMachine callback function for a TASK diff --git a/Moose Development/Moose/Tasking/Task_SEAD.lua b/Moose Development/Moose/Tasking/Task_SEAD.lua index 3e6a46e10..bb2669b5c 100644 --- a/Moose Development/Moose/Tasking/Task_SEAD.lua +++ b/Moose Development/Moose/Tasking/Task_SEAD.lua @@ -39,7 +39,7 @@ do -- TASK_SEAD -- @param Zone#ZONE_BASE TargetZone -- @return #TASK_SEAD self function TASK_SEAD:New( Mission, SetGroup, TaskName, TargetSetUnit, TargetZone ) - local self = BASE:Inherit( self, TASK_BASE:New( Mission, SetGroup, TaskName, "SEAD", "A2G" ) ) + local self = BASE:Inherit( self, TASK_BASE:New( Mission, SetGroup, TaskName, "SEAD", "A2G" ) ) -- Tasking.Task_SEAD#TASK_SEAD self:F() self.TargetSetUnit = TargetSetUnit diff --git a/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.lua b/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.lua index c644de7cc..748afbd32 100644 --- a/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.lua +++ b/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.lua @@ -5,7 +5,7 @@ local Scoring = SCORING:New( "SEAD" ) Mission:AddScoring( Scoring ) local SEADSet = SET_GROUP:New():FilterPrefixes( "Test SEAD"):FilterStart() -local TargetSet = SET_UNIT:New():FilterPrefixes( "US Hawk SR" ):FilterStart() +local TargetSet = SET_UNIT:New():FilterPrefixes( "US Hawk SR" ):FilterOnce() local TargetZone = ZONE:New( "Target Zone" ) @@ -22,5 +22,10 @@ local AccountProcess = TaskSEAD:SetProcessTemplate( "ACCOUNT", PROCESS_ACCOUNT_D AccountProcess:AddScore( TaskSEAD, "Account", "destroyed a radar", 25 ) AccountProcess:AddScore( TaskSEAD, "Failed", "failed to destroy a radar", -100 ) +--local SmokeProcess = TaskSEAD:SetProcessTemplate( "SMOKE", PROCESS_SMOKE_TARGETS_ZONE:New( TargetSet, TargetZone ) ) +--SmokeProcess:SetAttackGroup( GROUP:FindByName( "SmokeGroup" ), "Watchdog" ) +--SmokeProcess:AddScore( TaskSEAD, "Account", "destroyed a radar", 25 ) +--SmokeProcess:AddScore( TaskSEAD, "Failed", "failed to destroy a radar", -100 ) + TaskSEAD:AssignToGroup( SEADSet:Get( "Test SEAD" ) ) diff --git a/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.miz b/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.miz index c2735ea44..b1c35b574 100644 Binary files a/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.miz and b/Moose Test Missions/Moose_Test_Tasking/Moose_Test_Task_SEAD/Moose_Test_Task_SEAD.miz differ