diff --git a/Moose/Client.lua b/Moose/Client.lua index be60463fb..9489d8019 100644 --- a/Moose/Client.lua +++ b/Moose/Client.lua @@ -12,7 +12,7 @@ Include.File( "Message" ) --- The CLIENT class -- @type CLIENT --- @extends Unit#UNIT +-- @extends Base#BASE CLIENT = { ONBOARDSIDE = { NONE = 0, @@ -48,7 +48,7 @@ CLIENT = { -- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) -- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) function CLIENT:New( ClientName, ClientBriefing ) - local self = BASE:Inherit( self, UNIT:New( Unit.getByName( ClientName ) ) ) + local self = BASE:Inherit( self, BASE:New() ) self:F( ClientName, ClientBriefing ) self.ClientName = ClientName @@ -319,6 +319,44 @@ function CLIENT:GetPointVec2() return nil end +function CLIENT:GetPositionVec3() + self:F( self.ClientName ) + + local DCSUnit = Unit.getByName( self.ClientName ) + local UnitPos = DCSUnit:getPosition().p + + self:T( UnitPos ) + return UnitPos +end + +function CLIENT:GetID() + self:F( self.ClientName ) + + local DCSUnit = Unit.getByName( self.ClientName ) + local UnitID = DCSUnit:getID() + + self:T( UnitID ) + return UnitID +end + +function CLIENT:GetName() + self:F( self.ClientName ) + + self:T( self.ClientName ) + return self.ClientName +end + +function CLIENT:GetTypeName() + self:F( self.ClientName ) + + local DCSUnit = Unit.getByName( self.ClientName ) + local TypeName = DCSUnit:getTypeName() + + self:T( TypeName ) + return TypeName +end + + --- Returns the position of the CLIENT in @{DCSTypes#Vec3} format. -- @param #CLIENT self diff --git a/Moose/Database.lua b/Moose/Database.lua index 7b1f216df..bca8306b1 100644 --- a/Moose/Database.lua +++ b/Moose/Database.lua @@ -413,6 +413,7 @@ function DATABASE:_RegisterGroup( GroupTemplate ) self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId + self:E( {"skill",UnitTemplate.skill}) if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate @@ -477,11 +478,10 @@ function DATABASE:_RegisterDatabase() self.DCSUnitsAlive[DCSUnitName] = DCSUnit self.UnitsAlive[DCSUnitName] = self.Units[DCSUnitName] end - - if self.Templates.ClientsByName[DCSUnitName] then - self.Clients[DCSUnitName] = CLIENT:New( DCSUnitName ) - end - + end + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self.Clients[ClientName] = CLIENT:New( ClientName ) end end end @@ -504,11 +504,12 @@ function DATABASE:_EventOnBirth( Event ) self.DCSUnitsAlive[Event.IniDCSUnitName] = Event.IniDCSUnit self.Units[Event.IniDCSUnitName] = UNIT:New( Event.IniDCSUnit ) - if not self.DCSGroups[Event.IniDCSGroupName] then - self.DCSGroups[Event.IniDCSGroupName] = Event.IniDCSGroupName - self.DCSGroupsAlive[Event.IniDCSGroupName] = Event.IniDCSGroupName - self.Groups[Event.IniDCSGroupName] = GROUP:New( Event.IniDCSGroup ) - end + --if not self.DCSGroups[Event.IniDCSGroupName] then + -- self.DCSGroups[Event.IniDCSGroupName] = Event.IniDCSGroupName + -- self.DCSGroupsAlive[Event.IniDCSGroupName] = Event.IniDCSGroupName + -- self.Groups[Event.IniDCSGroupName] = GROUP:New( Event.IniDCSGroup ) + --end + self:_EventOnPlayerEnterUnit( Event ) end end end diff --git a/Moose/MissileTrainer.lua b/Moose/MissileTrainer.lua index eaed63155..e3b19f8b6 100644 --- a/Moose/MissileTrainer.lua +++ b/Moose/MissileTrainer.lua @@ -36,34 +36,39 @@ function MISSILETRAINER:New( Distance ) self.DBUnits = self.DB.Units for ClientID, Client in pairs( self.DBClients ) do - Client:Message( "Welcome to the Missile Trainer", 10, "ID", "TEST" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, Tracking = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, Tracking = false } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHits = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHits = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunches = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunches = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRange = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRange = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearing = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearing = false } ) - + + local function _Alive( Client ) + + Client:Message( "Welcome to the Missile Trainer", 10, "ID", "TEST" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, Tracking = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, Tracking = false } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHits = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHits = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunches = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunches = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRange = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRange = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearing = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearing = false } ) + end + + Client:Alive( _Alive ) end -- self.DB:ForEachClient( @@ -145,10 +150,9 @@ function MISSILETRAINER:_EventShot( Event ) local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) - local TrainerTargetDCSGroup = TrainerTargetDCSUnit:getGroup() - local TrainerTargetDCSGroupName = TrainerTargetDCSGroup:getName() local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + self:T(TrainerTargetDCSUnitName ) local Client = self.DBClients[TrainerTargetDCSUnitName] if Client then @@ -271,46 +275,70 @@ function MISSILETRAINER:_TrackMissiles() local TrainerWeapon = MissileData.TrainerWeapon local TrainerTargetUnit = MissileData.TrainerTargetUnit - local PositionMissile = TrainerWeapon:getPosition().p - local PositionTarget = Client:GetPositionVec3() + if TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + local PositionMissile = TrainerWeapon:getPosition().p + local PositionTarget = Client:GetPositionVec3() + + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 + + if Distance <= self.Distance then + -- Hit alert + TrainerWeapon:destroy() + if self.MessagesOnOff and self.AlertsHits then - local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 - - if Distance <= self.Distance then - -- Hit alert - TrainerWeapon:destroy() - if self.MessagesOnOff and self.AlertsHits then - - self:T( "Destroyed" ) - - local Message = MESSAGE:New( - string.format( "%s launched by %s destroyed", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetTypeName() - ),"Tracking", 2, "ID" ) - - if self.AlertsToAll then - Message:ToAll() - else - Message:ToClient( Client ) + self:T( "killed" ) + + local Message = MESSAGE:New( + string.format( "%s launched by %s killed '%s'", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName(), + TrainerSourceUnit:GetPlayerName() + ),"Tracking", 15, "ID" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + + MissileData = nil + table.remove( TrackingData.MissileData, MissileDataID ) + self:T(TrackingData.MissileData) + end + else + local TrackingTo = string.format( " -> %s launched by %s", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetName() + ) + + if ClientDataID == TrackingDataID then + ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:AddRange( ClientData.Client, TrainerWeapon ) .. self:AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" + else + ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:AddRange( TrackingData.Client, TrainerWeapon ) .. self:AddBearing( TrackingData.Client, TrainerWeapon ) .. "\n" end - - MissileData = nil - table.remove( TrackingData.MissileData, MissileDataID ) end else - local TrackingTo = string.format( " -> %s launched by %s", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetName() - ) + if not ( TrainerWeapon and TrainerWeapon:isExist() ) then + if self.MessagesOnOff and self.AlertsLaunches then + -- Weapon does not exist anymore. Delete from Table + local Message = MESSAGE:New( + string.format( "%s launched by %s is self destructed!", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName() + ),"Tracking", 5, "ID" ) - if ClientDataID == TrackingDataID then - ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:AddRange( ClientData.Client, TrainerWeapon ) .. self:AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" - else - ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:AddRange( TrackingData.Client, TrainerWeapon ) .. self:AddBearing( TrackingData.Client, TrainerWeapon ) .. "\n" + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + MissileData = nil + table.remove( TrackingData.MissileData, MissileDataID ) + self:T(TrackingData.MissileData) end end end diff --git a/Moose/Unit.lua b/Moose/Unit.lua index a6091a77c..4cea12dbb 100644 --- a/Moose/Unit.lua +++ b/Moose/Unit.lua @@ -56,11 +56,13 @@ UNIT = { -- @return Unit#UNIT function UNIT:New( DCSUnit ) local self = BASE:Inherit( self, BASE:New() ) - self:F( DCSUnit:getName() ) + self:F( DCSUnit ) self.DCSUnit = DCSUnit - self.UnitName = DCSUnit:getName() - self.UnitID = DCSUnit:getID() + if DCSUnit then + self.UnitName = DCSUnit:getName() + self.UnitID = DCSUnit:getID() + end return self end @@ -91,6 +93,11 @@ function UNIT:GetName() return self.UnitName end +function UNIT:GetPlayerName() + self:F( self.UnitName ) + + return self.DCSUnit:getPlayerName() +end function UNIT:GetTypeName() self:F( self.UnitName ) diff --git a/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz b/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz index aa99ee897..1bba5cd29 100644 Binary files a/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz and b/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz differ