From 7a91bdff728cd97221f3f33d29d51a275c981975 Mon Sep 17 00:00:00 2001
From: Sven Van de Velde
Date: Tue, 17 May 2016 06:32:34 +0200
Subject: [PATCH] Updated documentation to MISSILELAUNCHER
---
Documentation/MissileTrainer.html | 96 ++++++++++++
Moose/MissileTrainer.lua | 141 +++++++++++++-----
.../Moose_Test_MISSILETRAINER.lua | 7 +-
.../Moose_Test_MISSILETRAINER.miz | Bin 225232 -> 126263 bytes
4 files changed, 201 insertions(+), 43 deletions(-)
diff --git a/Documentation/MissileTrainer.html b/Documentation/MissileTrainer.html
index 5488cac9b..3ad2d3679 100644
--- a/Documentation/MissileTrainer.html
+++ b/Documentation/MissileTrainer.html
@@ -70,6 +70,48 @@ It suports the following functionality:
Enable / Disable and Configure the Missile Trainer using the various menu options.
+ When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players:
+
+
+ - Messages: Menu to configure all messages.
+
+ - Messages On: Show all messages.
+ - Messages Off: Disable all messages.
+
+ - Tracking: Menu to configure missile tracking messages.
+
+ - To All: Shows missile tracking messages to all players.
+ - To Target: Shows missile tracking messages only to the player where the missile is targetted at.
+ - Tracking On: Show missile tracking messages.
+ - Tracking Off: Disable missile tracking messages.
+
+ - Alerts: Menu to configure alert messages.
+
+ - To All: Shows alert messages to all players.
+ - To Target: Shows alter messages only to the player where the missile is (was) targetted at.
+ - Hits On: Show missile hit alert messages.
+ - Hits Off: Disable missile hit altert messages.
+ - Launches On: Show missile launch messages.
+ - Launches Off: Disable missile launch messages.
+
+ - Details: Menu to configure message details.
+
+ - Range On: Shows range information when a missile is fired to a target.
+ - Range Off: Disable range information when a missile is fired to a target.
+ - Bearing On: Shows bearing information when a missile is fired to a target.
+ - Bearing Off: Disable bearing information when a missile is fired to a target.
+
+ - Distance: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking.
+ This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured.
+
+ - 50 meter: Destroys the missile when the distance to the aircraft is below or equal to 50 meter.
+ - 100 meter: Destroys the missile when the distance to the aircraft is below or equal to 100 meter.
+ - 150 meter: Destroys the missile when the distance to the aircraft is below or equal to 150 meter.
+ - 200 meter: Destroys the missile when the distance to the aircraft is below or equal to 200 meter.
+
+
+
+
MISSILETRAINER construction methods:
Create a new MISSILETRAINER object with the MISSILETRAINER.New method:
@@ -91,6 +133,7 @@ It suports the following functionality:
MISSILETRAINER.InitAlertsLaunchesOnOff: Sets by default the display of launch alerts ON or OFF.
MISSILETRAINER.InitRangeOnOff: Sets by default the display of range information of missiles ON of OFF.
MISSILETRAINER.InitBearingOnOff: Sets by default the display of bearing information of missiles ON of OFF.
+ MISSILETRAINER.InitMenusOnOff: Allows to configure the options through the radio menu.
@@ -163,6 +206,12 @@ It suports the following functionality:
MISSILETRAINER:InitBearingOnOff(DetailsBearingOnOff) |
Sets by default the display of bearing information of missiles ON of OFF.
+ |
+
+
+ | MISSILETRAINER:InitMenusOnOff(MenusOnOff) |
+
+ Enables / Disables the menus.
|
@@ -187,6 +236,12 @@ It suports the following functionality:
| MISSILETRAINER:InitTrackingToAll(TrackingToAll) |
Sets by default the missile tracking report for all players or only for those missiles targetted to you.
+ |
+
+
+ | MISSILETRAINER.MenusOnOff |
+
+
|
@@ -468,6 +523,33 @@ self
-
+
+
+-
+
+
Enables / Disables the menus.
+
+ Parameter
+
+ Return value
+
+#MISSILETRAINER:
+self
+
+
+
+
+-
+
MISSILETRAINER:InitMessagesOnOff(MessagesOnOff)
@@ -571,6 +653,20 @@ true or false
#MISSILETRAINER:
self
+
+
+
+-
+
+
+
+
+-
+
+
+
diff --git a/Moose/MissileTrainer.lua b/Moose/MissileTrainer.lua
index ea3c6b2e1..2338f971f 100644
--- a/Moose/MissileTrainer.lua
+++ b/Moose/MissileTrainer.lua
@@ -11,6 +11,36 @@
-- * Provide alerts when a missile would have killed your aircraft.
-- * Provide alerts when the missile self destructs.
-- * Enable / Disable and Configure the Missile Trainer using the various menu options.
+--
+-- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players:
+--
+-- * **Messages**: Menu to configure all messages.
+-- * **Messages On**: Show all messages.
+-- * **Messages Off**: Disable all messages.
+-- * **Tracking**: Menu to configure missile tracking messages.
+-- * **To All**: Shows missile tracking messages to all players.
+-- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at.
+-- * **Tracking On**: Show missile tracking messages.
+-- * **Tracking Off**: Disable missile tracking messages.
+-- * **Alerts**: Menu to configure alert messages.
+-- * **To All**: Shows alert messages to all players.
+-- * **To Target**: Shows alter messages only to the player where the missile is (was) targetted at.
+-- * **Hits On**: Show missile hit alert messages.
+-- * **Hits Off**: Disable missile hit altert messages.
+-- * **Launches On**: Show missile launch messages.
+-- * **Launches Off**: Disable missile launch messages.
+-- * **Details**: Menu to configure message details.
+-- * **Range On**: Shows range information when a missile is fired to a target.
+-- * **Range Off**: Disable range information when a missile is fired to a target.
+-- * **Bearing On**: Shows bearing information when a missile is fired to a target.
+-- * **Bearing Off**: Disable bearing information when a missile is fired to a target.
+-- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking.
+-- This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured.
+-- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter.
+-- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter.
+-- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter.
+-- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter.
+--
--
-- MISSILETRAINER construction methods:
-- ====================================
@@ -32,6 +62,7 @@
-- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF.
-- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF.
-- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF.
+-- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu.
--
-- @module MissileTrainer
-- @author FlightControl
@@ -73,39 +104,49 @@ function MISSILETRAINER:New( Distance )
local function _Alive( Client )
- Client:Message( "Hello trainee, welcome to the Missile Trainer.\nUse the F10->F2 menu options in the radio menu to change the Missile Trainer settings.\nGood luck!", 10, "ID", "Trainer" )
+ Client:Message( "Hello trainee, welcome to the Missile Trainer.\nGood luck!", 15, "HELLO WORLD", "Trainer" )
+
+
- 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, TrackingOnOff = true } )
- Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = 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, AlertsHitsOnOff = true } )
- Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } )
- Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } )
- Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = 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, DetailsRangeOnOff = true } )
- Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } )
- Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } )
- Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } )
-
- Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu )
- Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } )
- Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } )
- Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } )
- Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } )
+ if self.MenusOnOff == true then
+ Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" )
+
+ Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT
+
+ 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, TrackingOnOff = true } )
+ Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = 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, AlertsHitsOnOff = true } )
+ Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } )
+ Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } )
+ Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = 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, DetailsRangeOnOff = true } )
+ Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } )
+ Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } )
+ Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } )
+
+ Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu )
+ Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } )
+ Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } )
+ Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } )
+ Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } )
+ else
+ if Client.MainMenu then
+ Client.MainMenu:Remove()
+ end
+ end
local ClientID = Client:GetID()
@@ -143,6 +184,8 @@ function MISSILETRAINER:New( Distance )
self.DetailsRangeOnOff = true
self.DetailsBearingOnOff = true
+
+ self.MenusOnOff = true
self.TrackingMissiles = {}
@@ -290,6 +333,24 @@ function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff )
return self
end
+--- Enables / Disables the menus.
+-- @param #MISSILETRAINER self
+-- @param #boolean MenusOnOff true or false
+-- @return #MISSILETRAINER self
+function MISSILETRAINER:InitMenusOnOff( MenusOnOff )
+ self:F( MenusOnOff )
+
+ self.MenusOnOff = MenusOnOff
+ if self.MenusOnOff == true then
+ MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll()
+ else
+ MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll()
+ end
+
+ return self
+end
+
+
-- Menu functions
function MISSILETRAINER._MenuMessages( MenuParameters )
@@ -360,7 +421,7 @@ function MISSILETRAINER:_EventShot( Event )
local TrainerSourceUnit = UNIT:New(TrainerSourceDCSUnit)
local TrainerTargetUnit = UNIT:New(TrainerTargetDCSUnit)
- if self.MessagesOnOff and self.AlertsLaunchesOnOff then
+ if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then
local Message = MESSAGE:New(
string.format( "%s launched a %s",
@@ -477,7 +538,7 @@ function MISSILETRAINER:_TrackMissiles()
if Distance <= self.Distance then
-- Hit alert
TrainerWeapon:destroy()
- if self.MessagesOnOff and self.AlertsHitsOnOff then
+ if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then
self:T( "killed" )
@@ -488,7 +549,7 @@ function MISSILETRAINER:_TrackMissiles()
TrainerTargetUnit:GetPlayerName()
),"Hit Alert", 15, "ID" )
- if self.AlertsToAll then
+ if self.AlertsToAll == true then
Message:ToAll()
else
Message:ToClient( Client )
@@ -499,7 +560,7 @@ function MISSILETRAINER:_TrackMissiles()
self:T(TrackingData.MissileData)
end
else
- if ShowMessages then
+ if ShowMessages == true then
local TrackingTo
TrackingTo = string.format( " -> %s",
TrainerWeaponTypeName
@@ -511,7 +572,7 @@ function MISSILETRAINER:_TrackMissiles()
end
ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n"
else
- if self.TrackingToAll then
+ if self.TrackingToAll == true then
if ClientData.MessageToAll == "" then
ClientData.MessageToAll = "Missiles to other Players:\n"
end
@@ -522,7 +583,7 @@ function MISSILETRAINER:_TrackMissiles()
end
else
if not ( TrainerWeapon and TrainerWeapon:isExist() ) then
- if self.MessagesOnOff and self.AlertsLaunchesOnOff then
+ if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then
-- Weapon does not exist anymore. Delete from Table
local Message = MESSAGE:New(
string.format( "%s launched by %s self destructed!",
@@ -530,7 +591,7 @@ function MISSILETRAINER:_TrackMissiles()
TrainerSourceUnit:GetTypeName()
),"Tracking", 5, "ID" )
- if self.AlertsToAll then
+ if self.AlertsToAll == true then
Message:ToAll()
else
Message:ToClient( Client )
@@ -544,7 +605,7 @@ function MISSILETRAINER:_TrackMissiles()
end
end
- if self.MessagesOnOff and self.TrackingOnOff and ShowMessages then
+ if self.MessagesOnOff == true and self.TrackingOnOff == true and ShowMessages == true then
if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then
local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client )
end
diff --git a/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua b/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua
index 4fadffe7d..03d19e4ec 100644
--- a/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua
+++ b/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua
@@ -8,12 +8,13 @@ Include.File("MissileTrainer")
local Trainer = MISSILETRAINER
:New( 200 )
:InitMessagesOnOff(true)
- :InitAlertsToAll(false) -- I'll correct it below ...
+ :InitAlertsToAll(true) -- I'll correct it below ...
:InitAlertsHitsOnOff(true)
- :InitAlertsLaunchesOnOff(true)
+ :InitAlertsLaunchesOnOff(false)
:InitBearingOnOff(true)
:InitRangeOnOff(true)
:InitTrackingOnOff(true)
:InitTrackingToAll(true)
+ :InitMenusOnOff(false)
-Trainer:InitAlertsToAll(true) -- Now alerts are also on
+--Trainer:InitAlertsToAll(true) -- Now alerts are also on
diff --git a/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz b/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz
index d7f002da717e75800d2075b523d9127f3e77acdd..1b10c6b637ad553a7f1f36bb8a88728922f517ae 100644
GIT binary patch
delta 96335
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