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 --- The CLIENT class
-- @type CLIENT -- @type CLIENT
-- @extends Unit#UNIT -- @extends Base#BASE
CLIENT = { CLIENT = {
ONBOARDSIDE = { ONBOARDSIDE = {
NONE = 0, 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*HOT-Deploy Troops 2' ):Transport() )
-- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() )
function CLIENT:New( ClientName, ClientBriefing ) 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:F( ClientName, ClientBriefing )
self.ClientName = ClientName self.ClientName = ClientName
@ -319,6 +319,44 @@ function CLIENT:GetPointVec2()
return nil return nil
end 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. --- Returns the position of the CLIENT in @{DCSTypes#Vec3} format.
-- @param #CLIENT self -- @param #CLIENT self

View File

@ -413,6 +413,7 @@ function DATABASE:_RegisterGroup( GroupTemplate )
self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName
self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate
self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId
self:E( {"skill",UnitTemplate.skill})
if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then
self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate
self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate
@ -477,11 +478,10 @@ function DATABASE:_RegisterDatabase()
self.DCSUnitsAlive[DCSUnitName] = DCSUnit self.DCSUnitsAlive[DCSUnitName] = DCSUnit
self.UnitsAlive[DCSUnitName] = self.Units[DCSUnitName] self.UnitsAlive[DCSUnitName] = self.Units[DCSUnitName]
end end
end
if self.Templates.ClientsByName[DCSUnitName] then for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do
self.Clients[DCSUnitName] = CLIENT:New( DCSUnitName ) self.Clients[ClientName] = CLIENT:New( ClientName )
end
end end
end end
end end
@ -504,11 +504,12 @@ function DATABASE:_EventOnBirth( Event )
self.DCSUnitsAlive[Event.IniDCSUnitName] = Event.IniDCSUnit self.DCSUnitsAlive[Event.IniDCSUnitName] = Event.IniDCSUnit
self.Units[Event.IniDCSUnitName] = UNIT:New( Event.IniDCSUnit ) self.Units[Event.IniDCSUnitName] = UNIT:New( Event.IniDCSUnit )
if not self.DCSGroups[Event.IniDCSGroupName] then --if not self.DCSGroups[Event.IniDCSGroupName] then
self.DCSGroups[Event.IniDCSGroupName] = Event.IniDCSGroupName -- self.DCSGroups[Event.IniDCSGroupName] = Event.IniDCSGroupName
self.DCSGroupsAlive[Event.IniDCSGroupName] = Event.IniDCSGroupName -- self.DCSGroupsAlive[Event.IniDCSGroupName] = Event.IniDCSGroupName
self.Groups[Event.IniDCSGroupName] = GROUP:New( Event.IniDCSGroup ) -- self.Groups[Event.IniDCSGroupName] = GROUP:New( Event.IniDCSGroup )
end --end
self:_EventOnPlayerEnterUnit( Event )
end end
end end
end end

View File

@ -36,34 +36,39 @@ function MISSILETRAINER:New( Distance )
self.DBUnits = self.DB.Units self.DBUnits = self.DB.Units
for ClientID, Client in pairs( self.DBClients ) do 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 ) local function _Alive( Client )
Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) Client:Message( "Welcome to the Missile Trainer", 10, "ID", "TEST" )
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.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil )
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.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu )
Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } )
Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = 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.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu )
Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRange = true } ) Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } )
Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRange = false } ) Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } )
Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearing = true } ) Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, Tracking = true } )
Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearing = false } ) 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 end
-- self.DB:ForEachClient( -- self.DB:ForEachClient(
@ -145,10 +150,9 @@ function MISSILETRAINER:_EventShot( Event )
local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target
local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit )
local TrainerTargetDCSGroup = TrainerTargetDCSUnit:getGroup()
local TrainerTargetDCSGroupName = TrainerTargetDCSGroup:getName()
local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill
self:T(TrainerTargetDCSUnitName )
local Client = self.DBClients[TrainerTargetDCSUnitName] local Client = self.DBClients[TrainerTargetDCSUnitName]
if Client then if Client then
@ -271,46 +275,70 @@ function MISSILETRAINER:_TrackMissiles()
local TrainerWeapon = MissileData.TrainerWeapon local TrainerWeapon = MissileData.TrainerWeapon
local TrainerTargetUnit = MissileData.TrainerTargetUnit local TrainerTargetUnit = MissileData.TrainerTargetUnit
local PositionMissile = TrainerWeapon:getPosition().p if TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then
local PositionTarget = Client:GetPositionVec3() local PositionMissile = TrainerWeapon:getPosition().p
local PositionTarget = Client:GetPositionVec3()
local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 +
( PositionMissile.y - PositionTarget.y )^2 + ( PositionMissile.y - PositionTarget.y )^2 +
( PositionMissile.z - PositionTarget.z )^2 ( PositionMissile.z - PositionTarget.z )^2
) ^ 0.5 ) ^ 0.5
if Distance <= self.Distance then if Distance <= self.Distance then
-- Hit alert -- Hit alert
TrainerWeapon:destroy() TrainerWeapon:destroy()
if self.MessagesOnOff and self.AlertsHits then if self.MessagesOnOff and self.AlertsHits then
self:T( "Destroyed" ) self:T( "killed" )
local Message = MESSAGE:New( local Message = MESSAGE:New(
string.format( "%s launched by %s destroyed", string.format( "%s launched by %s killed '%s'",
TrainerWeapon:getTypeName(), TrainerWeapon:getTypeName(),
TrainerSourceUnit:GetTypeName() TrainerSourceUnit:GetTypeName(),
),"Tracking", 2, "ID" ) TrainerSourceUnit:GetPlayerName()
),"Tracking", 15, "ID" )
if self.AlertsToAll then if self.AlertsToAll then
Message:ToAll() Message:ToAll()
else else
Message:ToClient( Client ) Message:ToClient( Client )
end
MissileData = nil
table.remove( TrackingData.MissileData, MissileDataID )
self:T(TrackingData.MissileData)
end end
else
local TrackingTo = string.format( " -> %s launched by %s",
TrainerWeapon:getTypeName(),
TrainerSourceUnit:GetName()
)
MissileData = nil if ClientDataID == TrackingDataID then
table.remove( TrackingData.MissileData, MissileDataID ) 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
end end
else else
local TrackingTo = string.format( " -> %s launched by %s", if not ( TrainerWeapon and TrainerWeapon:isExist() ) then
TrainerWeapon:getTypeName(), if self.MessagesOnOff and self.AlertsLaunches then
TrainerSourceUnit:GetName() -- 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 if self.AlertsToAll then
ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:AddRange( ClientData.Client, TrainerWeapon ) .. self:AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" Message:ToAll()
else else
ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:AddRange( TrackingData.Client, TrainerWeapon ) .. self:AddBearing( TrackingData.Client, TrainerWeapon ) .. "\n" Message:ToClient( Client )
end
end
MissileData = nil
table.remove( TrackingData.MissileData, MissileDataID )
self:T(TrackingData.MissileData)
end end
end end
end end

View File

@ -56,11 +56,13 @@ UNIT = {
-- @return Unit#UNIT -- @return Unit#UNIT
function UNIT:New( DCSUnit ) function UNIT:New( DCSUnit )
local self = BASE:Inherit( self, BASE:New() ) local self = BASE:Inherit( self, BASE:New() )
self:F( DCSUnit:getName() ) self:F( DCSUnit )
self.DCSUnit = DCSUnit self.DCSUnit = DCSUnit
self.UnitName = DCSUnit:getName() if DCSUnit then
self.UnitID = DCSUnit:getID() self.UnitName = DCSUnit:getName()
self.UnitID = DCSUnit:getID()
end
return self return self
end end
@ -91,6 +93,11 @@ function UNIT:GetName()
return self.UnitName return self.UnitName
end end
function UNIT:GetPlayerName()
self:F( self.UnitName )
return self.DCSUnit:getPlayerName()
end
function UNIT:GetTypeName() function UNIT:GetTypeName()
self:F( self.UnitName ) self:F( self.UnitName )