This commit is contained in:
Sven Van de Velde 2016-05-12 14:53:28 +02:00
parent e486c80350
commit 971f5e9ca4
5 changed files with 154 additions and 80 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 )