mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-24 20:15:30 +00:00
Merge pull request #340 from FlightControl-Master/Grey-Echo
Small Tweaks to RADIO
This commit is contained in:
@@ -100,7 +100,7 @@ function RADIO:New(Positionable)
|
|||||||
|
|
||||||
self:F(Positionable)
|
self:F(Positionable)
|
||||||
|
|
||||||
if Positionable:GetPointVec2() ~= nil then -- It's stupid, but the only way I found to make sure positionable is valid
|
if Positionable:GetPointVec2() then -- It's stupid, but the only way I found to make sure positionable is valid
|
||||||
self.Positionable = Positionable
|
self.Positionable = Positionable
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -117,8 +117,8 @@ function RADIO:SetFileName(FileName)
|
|||||||
self:F2(FileName)
|
self:F2(FileName)
|
||||||
|
|
||||||
if type(FileName) == "string" then
|
if type(FileName) == "string" then
|
||||||
if FileName:find(".ogg") ~= nil or FileName:find(".wav") ~= nil then
|
if FileName:find(".ogg") or FileName:find(".wav") then
|
||||||
if FileName:find("l10n/DEFAULT/") == nil then
|
if not FileName:find("l10n/DEFAULT/") then
|
||||||
FileName = "l10n/DEFAULT/" .. FileName
|
FileName = "l10n/DEFAULT/" .. FileName
|
||||||
end
|
end
|
||||||
self.FileName = FileName
|
self.FileName = FileName
|
||||||
@@ -142,7 +142,7 @@ function RADIO:SetFrequency(Frequency)
|
|||||||
self.Frequency = Frequency * 1000000 -- Conversion in Hz
|
self.Frequency = Frequency * 1000000 -- Conversion in Hz
|
||||||
-- If the RADIO is attached to a UNIT or a GROUP, we need to send the DCS Command "SetFrequency" to change the UNIT or GROUP frequency
|
-- If the RADIO is attached to a UNIT or a GROUP, we need to send the DCS Command "SetFrequency" to change the UNIT or GROUP frequency
|
||||||
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
self.Positionable:GetDCSObject():getController():setCommand({
|
self.Positionable:SetCommand({
|
||||||
id = "SetFrequency",
|
id = "SetFrequency",
|
||||||
params = {
|
params = {
|
||||||
frequency = self.Frequency,
|
frequency = self.Frequency,
|
||||||
@@ -289,10 +289,10 @@ end
|
|||||||
-- -- If your POSITIONABLE is not a UNIT or a GROUP, the Subtitle, SubtitleDuration and Loop are ignored
|
-- -- If your POSITIONABLE is not a UNIT or a GROUP, the Subtitle, SubtitleDuration and Loop are ignored
|
||||||
function RADIO:Broadcast()
|
function RADIO:Broadcast()
|
||||||
self:F()
|
self:F()
|
||||||
-- If the POSITIONABLE is actually a Unit or a Group, use the more complicated DCS command system
|
-- If the POSITIONABLE is actually a UNIT or a GROUP, use the more complicated DCS command system
|
||||||
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
self:T2("Broadcasting from a UNIT or a GROUP")
|
self:T2("Broadcasting from a UNIT or a GROUP")
|
||||||
self.Positionable:GetDCSObject():getController():setCommand({
|
self.Positionable:SetCommand({
|
||||||
id = "TransmitMessage",
|
id = "TransmitMessage",
|
||||||
params = {
|
params = {
|
||||||
file = self.FileName,
|
file = self.FileName,
|
||||||
@@ -309,3 +309,22 @@ function RADIO:Broadcast()
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Stops a transmission
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- Especially usefull to stop the broadcast of looped transmissions
|
||||||
|
-- -- Only works with broadcasts from UNIT or GROUP
|
||||||
|
function RADIO:StopBroadcast()
|
||||||
|
self:F()
|
||||||
|
-- If the POSITIONABLE is a UNIT or a GROUP, stop the transmission with the DCS "StopTransmission" command
|
||||||
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
|
self.Positionable:SetCommand({
|
||||||
|
id = "StopTransmission",
|
||||||
|
params = {}
|
||||||
|
})
|
||||||
|
else
|
||||||
|
self:E("This broadcast can't be stopped. It's not looped either, so please wait for the end of the sound file playback")
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
|
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
|
||||||
env.info( 'Moose Generation Timestamp: 20170322_1812' )
|
env.info( 'Moose Generation Timestamp: 20170323_0529' )
|
||||||
local base = _G
|
local base = _G
|
||||||
|
|
||||||
Include = {}
|
Include = {}
|
||||||
@@ -12679,7 +12679,336 @@ do -- FSM_SET
|
|||||||
|
|
||||||
end -- FSM_SET
|
end -- FSM_SET
|
||||||
|
|
||||||
--- This module contains the OBJECT class.
|
--- **Core** - The RADIO class is responsible for **transmitting radio communications**.
|
||||||
|
--
|
||||||
|
-- --- bitmap
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- What are radio communications in DCS ?
|
||||||
|
--
|
||||||
|
-- * Radio transmissions consist of **sound files** that are broadcasted on a specific **frequency** (e.g. 115MHz) and **modulation** (e.g. AM),
|
||||||
|
-- * They can be **subtitled** for a specific **duration**, the **power** in Watts of the transmiter's antenna can be set, and the transmission can be **looped**.
|
||||||
|
--
|
||||||
|
-- How to supply DCS my own Sound Files ?
|
||||||
|
--
|
||||||
|
-- * Your sound files need to be encoded in **.ogg** or .wav,
|
||||||
|
-- * Your sound files should be **as tiny as possible**. It is suggested you encode in .ogg with low bitrate and sampling settings,
|
||||||
|
-- * They need to be added in .\l10n\DEFAULT\ in you .miz file (wich can be decompressed like a .zip file),
|
||||||
|
-- * For simplicty sake, you can **let DCS' Mission Editor add the file** itself, by creating a new Trigger with the action "Sound to Country", and choosing your sound file and a country you don't use in your mission.
|
||||||
|
--
|
||||||
|
-- Due to weird DCS quirks, **radio communications behave differently** if sent by a @{Unit#UNIT} or a @{Group#GROUP} or by any other @{Positionable#POSITIONABLE}
|
||||||
|
--
|
||||||
|
-- * If the transmitter is a @{Unit#UNIT} or a @{Group#GROUP}, DCS will set the power of the transmission automatically,
|
||||||
|
-- * If the transmitter is any other @{Positionable#POSITIONABLE}, the transmisison can't be subtitled or looped.
|
||||||
|
--
|
||||||
|
-- Note that obviously, the **frequency** and the **modulation** of the transmission are important only if the players are piloting an **Advanced System Modelling** enabled aircraft,
|
||||||
|
-- like the A10C or the Mirage 2000C. They will **hear the transmission** if they are tuned on the **right frequency and modulation** (and if they are close enough - more on that below).
|
||||||
|
-- If a FC3 airacraft is used, it will **hear every communication, whatever the frequency and the modulation** is set to.
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- ### Authors: Hugues "Grey_Echo" Bousquet
|
||||||
|
--
|
||||||
|
-- @module Radio
|
||||||
|
|
||||||
|
--- # 1) RADIO class, extends @{Base#BASE}
|
||||||
|
--
|
||||||
|
-- ## 1.1) RADIO usage
|
||||||
|
--
|
||||||
|
-- There are 3 steps to a successful radio transmission.
|
||||||
|
--
|
||||||
|
-- * First, you need to **"add" a @{#RADIO} object** to your @{Positionable#POSITIONABLE}. This is done using the @{Positionable#POSITIONABLE.GetRadio}() function,
|
||||||
|
-- * Then, you will **set the relevant parameters** to the transmission (see below),
|
||||||
|
-- * When done, you can actually **broadcast the transmission** (i.e. play the sound) with the @{Positionable#POSITIONABLE.Broadcast}() function.
|
||||||
|
--
|
||||||
|
-- Methods to set relevant parameters for both a @{Unit#UNIT} or a @{Group#GROUP} or any other @{Positionable#POSITIONABLE}
|
||||||
|
--
|
||||||
|
-- * @{#RADIO.SetFileName}() : Sets the file name of your sound file (e.g. "Noise.ogg"),
|
||||||
|
-- * @{#RADIO.SetFrequency}() : Sets the frequency of your transmission,
|
||||||
|
-- * @{#RADIO.SetModulation}() : Sets the modulation of your transmission.
|
||||||
|
--
|
||||||
|
-- Additional Methods to set relevant parameters if the transmiter is a @{Unit#UNIT} or a @{Group#GROUP}
|
||||||
|
--
|
||||||
|
-- * @{#RADIO.SetLoop}() : Choose if you want the transmission to be looped,
|
||||||
|
-- * @{#RADIO.SetSubtitle}() : Set both the subtitle and its duration,
|
||||||
|
-- * @{#RADIO.NewUnitTransmission}() : Shortcut to set all the relevant parameters in one method call
|
||||||
|
--
|
||||||
|
-- Additional Methods to set relevant parameters if the transmiter is any other @{Wrapper.Positionable#POSITIONABLE}
|
||||||
|
--
|
||||||
|
-- * @{#RADIO.SetPower}() : Sets the power of the antenna in Watts
|
||||||
|
-- * @{#RADIO.NewGenericTransmission}() : Shortcut to set all the relevant parameters in one method call
|
||||||
|
--
|
||||||
|
-- What is this power thing ?
|
||||||
|
--
|
||||||
|
-- * If your transmission is sent by a @{Positionable#POSITIONABLE} other than a @{Unit#UNIT} or a @{Group#GROUP}, you can set the power of the antenna,
|
||||||
|
-- * Otherwise, DCS sets it automatically, depending on what's available on your Unit,
|
||||||
|
-- * If the player gets **too far** from the transmiter, or if the antenna is **too weak**, the transmission will **fade** and **become noisyer**,
|
||||||
|
-- * This an automated DCS calculation you have no say on,
|
||||||
|
-- * For reference, a standard VOR station has a 100W antenna, a standard AA TACAN has a 120W antenna, and civilian ATC's antenna usually range between 300 and 500W,
|
||||||
|
-- * Note that if the transmission has a subtitle, it will be readable, regardless of the quality of the transmission.
|
||||||
|
--
|
||||||
|
-- @type RADIO
|
||||||
|
-- @field Wrapper.Positionable#POSITIONABLE Positionable The transmiter
|
||||||
|
-- @field #string FileName Name of the sound file
|
||||||
|
-- @field #number Frequency Frequency of the transmission in Hz
|
||||||
|
-- @field #number Modulation Modulation of the transmission (either radio.modulation.AM or radio.modulation.FM)
|
||||||
|
-- @field #string Subtitle Subtitle of the transmission
|
||||||
|
-- @field #number SubtitleDuration Duration of the Subtitle in seconds
|
||||||
|
-- @field #number Power Power of the antenna is Watts
|
||||||
|
-- @field #boolean Loop
|
||||||
|
-- @extends Core.Base#BASE
|
||||||
|
RADIO = {
|
||||||
|
ClassName = "RADIO",
|
||||||
|
FileName = "",
|
||||||
|
Frequency = 0,
|
||||||
|
Modulation = radio.modulation.AM,
|
||||||
|
Subtitle = "",
|
||||||
|
SubtitleDuration = 0,
|
||||||
|
Power = 100,
|
||||||
|
Loop = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Create a new RADIO Object. This doesn't broadcast a transmission, though, use @{#RADIO.Broadcast} to actually broadcast
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param Wrapper.Positionable#POSITIONABLE Positionable The @{Positionable} that will receive radio capabilities.
|
||||||
|
-- @return #RADIO Radio
|
||||||
|
-- @return #nil If Positionable is invalid
|
||||||
|
-- @usage
|
||||||
|
-- -- If you want to create a RADIO, you probably should use @{Positionable#POSITIONABLE.GetRadio}() instead
|
||||||
|
function RADIO:New(Positionable)
|
||||||
|
local self = BASE:Inherit( self, BASE:New() ) -- Core.Radio#RADIO
|
||||||
|
|
||||||
|
self:F(Positionable)
|
||||||
|
|
||||||
|
if Positionable:GetPointVec2() then -- It's stupid, but the only way I found to make sure positionable is valid
|
||||||
|
self.Positionable = Positionable
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
self:E({"The passed positionable is invalid, no RADIO created", Positionable})
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the filename passed and sets RADIO.FileName
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string FileName File name of the sound file (i.e. "Noise.ogg")
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetFileName(FileName)
|
||||||
|
self:F2(FileName)
|
||||||
|
|
||||||
|
if type(FileName) == "string" then
|
||||||
|
if FileName:find(".ogg") or FileName:find(".wav") then
|
||||||
|
if not FileName:find("l10n/DEFAULT/") then
|
||||||
|
FileName = "l10n/DEFAULT/" .. FileName
|
||||||
|
end
|
||||||
|
self.FileName = FileName
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self:E({"File name invalid. Maybe something wrong with the extension ?", self.FileName})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the frequency passed and sets RADIO.Frequency
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #number Frequency in MHz (Ranges allowed for radio transmissions in DCS : 30-88 / 108-152 / 225-400MHz)
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetFrequency(Frequency)
|
||||||
|
self:F2(Frequency)
|
||||||
|
if type(Frequency) == "number" then
|
||||||
|
-- If frequency is in range
|
||||||
|
if (Frequency >= 30 and Frequency < 88) or (Frequency >= 108 and Frequency < 152) or (Frequency >= 225 and Frequency < 400) then
|
||||||
|
self.Frequency = Frequency * 1000000 -- Conversion in Hz
|
||||||
|
-- If the RADIO is attached to a UNIT or a GROUP, we need to send the DCS Command "SetFrequency" to change the UNIT or GROUP frequency
|
||||||
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
|
self.Positionable:SetCommand({
|
||||||
|
id = "SetFrequency",
|
||||||
|
params = {
|
||||||
|
frequency = self.Frequency,
|
||||||
|
modulation = self.Modulation,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:E({"Frequency is outside of DCS Frequency ranges (30-80, 108-152, 225-400). Frequency unchanged.", self.Frequency})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the frequency passed and sets RADIO.Modulation
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #number Modulation either radio.modulation.AM or radio.modulation.FM
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetModulation(Modulation)
|
||||||
|
self:F2(Modulation)
|
||||||
|
if type(Modulation) == "number" then
|
||||||
|
if Modulation == radio.modulation.AM or Modulation == radio.modulation.FM then --TODO Maybe make this future proof if ED decides to add an other modulation ?
|
||||||
|
self.Modulation = Modulation
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:E({"Modulation is invalid. Use DCS's enum radio.modulation. Modulation unchanged.", self.Modulation})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the power passed and sets RADIO.Power
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #number Power in W
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetPower(Power)
|
||||||
|
self:F2(Power)
|
||||||
|
if type(Power) == "number" then
|
||||||
|
self.Power = math.floor(math.abs(Power)) --TODO Find what is the maximum power allowed by DCS and limit power to that
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
self:E({"Power is invalid. Power unchanged.", self.Power})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the loop passed and sets RADIO.Loop
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #boolean Loop
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
function RADIO:SetLoop(Loop)
|
||||||
|
self:F2(Loop)
|
||||||
|
if type(Loop) == "boolean" then
|
||||||
|
self.Loop = Loop
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
self:E({"Loop is invalid. Loop unchanged.", self.Loop})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the subtitle and the subtitleDuration passed and sets RADIO.subtitle and RADIO.subtitleDuration
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string Subtitle
|
||||||
|
-- @param #number SubtitleDuration in s
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- Both parameters are mandatory, since it wouldn't make much sense to change the Subtitle and not its duration
|
||||||
|
function RADIO:SetSubtitle(Subtitle, SubtitleDuration)
|
||||||
|
self:F2({Subtitle, SubtitleDuration})
|
||||||
|
if type(Subtitle) == "string" then
|
||||||
|
self.Subtitle = Subtitle
|
||||||
|
else
|
||||||
|
self.Subtitle = ""
|
||||||
|
self:E({"Subtitle is invalid. Subtitle reset.", self.Subtitle})
|
||||||
|
end
|
||||||
|
if type(SubtitleDuration) == "number" then
|
||||||
|
if math.floor(math.abs(SubtitleDuration)) == SubtitleDuration then
|
||||||
|
self.SubtitleDuration = SubtitleDuration
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.SubtitleDuration = 0
|
||||||
|
self:E({"SubtitleDuration is invalid. SubtitleDuration reset.", self.SubtitleDuration})
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Create a new transmission, that is to say, populate the RADIO with relevant data
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string FileName
|
||||||
|
-- @param #number Frequency in MHz
|
||||||
|
-- @param #number Modulation either radio.modulation.AM or radio.modulation.FM
|
||||||
|
-- @param #number Power in W
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- In this function the data is especially relevant if the broadcaster is anything but a UNIT or a GROUP,
|
||||||
|
-- but it will work with a UNIT or a GROUP anyway
|
||||||
|
-- -- Only the RADIO and the Filename are mandatory
|
||||||
|
function RADIO:NewGenericTransmission(FileName, Frequency, Modulation, Power)
|
||||||
|
self:F({FileName, Frequency, Modulation, Power})
|
||||||
|
|
||||||
|
self:SetFileName(FileName)
|
||||||
|
if Frequency then self:SetFrequency(Frequency) end
|
||||||
|
if Modulation then self:SetModulation(Modulation) end
|
||||||
|
if Power then self:SetPower(Power) end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Create a new transmission, that is to say, populate the RADIO with relevant data
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string FileName
|
||||||
|
-- @param #string Subtitle
|
||||||
|
-- @param #number SubtitleDuration in s
|
||||||
|
-- @param #number Frequency in MHz
|
||||||
|
-- @param #number Modulation either radio.modulation.AM or radio.modulation.FM
|
||||||
|
-- @param #boolean Loop
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- In this function the data is especially relevant if the broadcaster is a UNIT or a GROUP,
|
||||||
|
-- but it will work for any POSITIONABLE
|
||||||
|
-- -- Only the RADIO and the Filename are mandatory
|
||||||
|
function RADIO:NewUnitTransmission(FileName, Subtitle, SubtitleDuration, Frequency, Modulation, Loop)
|
||||||
|
self:F({FileName, Subtitle, SubtitleDuration, Frequency, Modulation, Loop})
|
||||||
|
|
||||||
|
self:SetFileName(FileName)
|
||||||
|
if Subtitle then self:SetSubtitle(Subtitle) end
|
||||||
|
if SubtitleDuration then self:SetSubtitleDuration(SubtitleDuration) end
|
||||||
|
if Frequency then self:SetFrequency(Frequency) end
|
||||||
|
if Modulation then self:SetModulation(Modulation) end
|
||||||
|
if Loop then self:SetLoop(Loop) end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Actually Broadcast the transmission
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- The Radio has to be populated with the new transmission before broadcasting.
|
||||||
|
-- -- Please use RADIO setters or either @{Radio#RADIO.NewGenericTransmission} or @{Radio#RADIO.NewUnitTransmission}
|
||||||
|
-- -- This class is in fact pretty smart, it determines the right DCS function to use depending on the type of POSITIONABLE
|
||||||
|
-- -- If the POSITIONABLE is not a UNIT or a GROUP, we use the generic (but limited) trigger.action.radioTransmission()
|
||||||
|
-- -- If the POSITIONABLE is a UNIT or a GROUP, we use the "TransmitMessage" Command
|
||||||
|
-- -- If your POSITIONABLE is a UNIT or a GROUP, the Power is ignored.
|
||||||
|
-- -- If your POSITIONABLE is not a UNIT or a GROUP, the Subtitle, SubtitleDuration and Loop are ignored
|
||||||
|
function RADIO:Broadcast()
|
||||||
|
self:F()
|
||||||
|
-- If the POSITIONABLE is actually a UNIT or a GROUP, use the more complicated DCS command system
|
||||||
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
|
self:T2("Broadcasting from a UNIT or a GROUP")
|
||||||
|
self.Positionable:SetCommand({
|
||||||
|
id = "TransmitMessage",
|
||||||
|
params = {
|
||||||
|
file = self.FileName,
|
||||||
|
duration = self.SubtitleDuration,
|
||||||
|
subtitle = self.Subtitle,
|
||||||
|
loop = self.Loop,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else
|
||||||
|
-- If the POSITIONABLE is anything else, we revert to the general singleton function
|
||||||
|
self:T2("Broadcasting from a POSITIONABLE")
|
||||||
|
trigger.action.radioTransmission(self.FileName, self.Positionable:GetPositionVec3(), self.Modulation, false, self.Frequency, self.Power)
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Stops a transmission
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- Especially usefull to stop the broadcast of looped transmissions
|
||||||
|
-- -- Only works with broadcasts from UNIT or GROUP
|
||||||
|
function RADIO:StopBroadcast()
|
||||||
|
self:F()
|
||||||
|
-- If the POSITIONABLE is a UNIT or a GROUP, stop the transmission with the DCS "StopTransmission" command
|
||||||
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
|
self.Positionable:SetCommand({
|
||||||
|
id = "StopTransmission",
|
||||||
|
params = {}
|
||||||
|
})
|
||||||
|
else
|
||||||
|
self:E("This broadcast can't be stopped. It's not looped either, so please wait for the end of the sound file playback")
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end--- This module contains the OBJECT class.
|
||||||
--
|
--
|
||||||
-- 1) @{Object#OBJECT} class, extends @{Base#BASE}
|
-- 1) @{Object#OBJECT} class, extends @{Base#BASE}
|
||||||
-- ===========================================================
|
-- ===========================================================
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
|
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
|
||||||
env.info( 'Moose Generation Timestamp: 20170322_1812' )
|
env.info( 'Moose Generation Timestamp: 20170323_0529' )
|
||||||
local base = _G
|
local base = _G
|
||||||
|
|
||||||
Include = {}
|
Include = {}
|
||||||
@@ -12679,7 +12679,336 @@ do -- FSM_SET
|
|||||||
|
|
||||||
end -- FSM_SET
|
end -- FSM_SET
|
||||||
|
|
||||||
--- This module contains the OBJECT class.
|
--- **Core** - The RADIO class is responsible for **transmitting radio communications**.
|
||||||
|
--
|
||||||
|
-- --- bitmap
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- What are radio communications in DCS ?
|
||||||
|
--
|
||||||
|
-- * Radio transmissions consist of **sound files** that are broadcasted on a specific **frequency** (e.g. 115MHz) and **modulation** (e.g. AM),
|
||||||
|
-- * They can be **subtitled** for a specific **duration**, the **power** in Watts of the transmiter's antenna can be set, and the transmission can be **looped**.
|
||||||
|
--
|
||||||
|
-- How to supply DCS my own Sound Files ?
|
||||||
|
--
|
||||||
|
-- * Your sound files need to be encoded in **.ogg** or .wav,
|
||||||
|
-- * Your sound files should be **as tiny as possible**. It is suggested you encode in .ogg with low bitrate and sampling settings,
|
||||||
|
-- * They need to be added in .\l10n\DEFAULT\ in you .miz file (wich can be decompressed like a .zip file),
|
||||||
|
-- * For simplicty sake, you can **let DCS' Mission Editor add the file** itself, by creating a new Trigger with the action "Sound to Country", and choosing your sound file and a country you don't use in your mission.
|
||||||
|
--
|
||||||
|
-- Due to weird DCS quirks, **radio communications behave differently** if sent by a @{Unit#UNIT} or a @{Group#GROUP} or by any other @{Positionable#POSITIONABLE}
|
||||||
|
--
|
||||||
|
-- * If the transmitter is a @{Unit#UNIT} or a @{Group#GROUP}, DCS will set the power of the transmission automatically,
|
||||||
|
-- * If the transmitter is any other @{Positionable#POSITIONABLE}, the transmisison can't be subtitled or looped.
|
||||||
|
--
|
||||||
|
-- Note that obviously, the **frequency** and the **modulation** of the transmission are important only if the players are piloting an **Advanced System Modelling** enabled aircraft,
|
||||||
|
-- like the A10C or the Mirage 2000C. They will **hear the transmission** if they are tuned on the **right frequency and modulation** (and if they are close enough - more on that below).
|
||||||
|
-- If a FC3 airacraft is used, it will **hear every communication, whatever the frequency and the modulation** is set to.
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- ### Authors: Hugues "Grey_Echo" Bousquet
|
||||||
|
--
|
||||||
|
-- @module Radio
|
||||||
|
|
||||||
|
--- # 1) RADIO class, extends @{Base#BASE}
|
||||||
|
--
|
||||||
|
-- ## 1.1) RADIO usage
|
||||||
|
--
|
||||||
|
-- There are 3 steps to a successful radio transmission.
|
||||||
|
--
|
||||||
|
-- * First, you need to **"add" a @{#RADIO} object** to your @{Positionable#POSITIONABLE}. This is done using the @{Positionable#POSITIONABLE.GetRadio}() function,
|
||||||
|
-- * Then, you will **set the relevant parameters** to the transmission (see below),
|
||||||
|
-- * When done, you can actually **broadcast the transmission** (i.e. play the sound) with the @{Positionable#POSITIONABLE.Broadcast}() function.
|
||||||
|
--
|
||||||
|
-- Methods to set relevant parameters for both a @{Unit#UNIT} or a @{Group#GROUP} or any other @{Positionable#POSITIONABLE}
|
||||||
|
--
|
||||||
|
-- * @{#RADIO.SetFileName}() : Sets the file name of your sound file (e.g. "Noise.ogg"),
|
||||||
|
-- * @{#RADIO.SetFrequency}() : Sets the frequency of your transmission,
|
||||||
|
-- * @{#RADIO.SetModulation}() : Sets the modulation of your transmission.
|
||||||
|
--
|
||||||
|
-- Additional Methods to set relevant parameters if the transmiter is a @{Unit#UNIT} or a @{Group#GROUP}
|
||||||
|
--
|
||||||
|
-- * @{#RADIO.SetLoop}() : Choose if you want the transmission to be looped,
|
||||||
|
-- * @{#RADIO.SetSubtitle}() : Set both the subtitle and its duration,
|
||||||
|
-- * @{#RADIO.NewUnitTransmission}() : Shortcut to set all the relevant parameters in one method call
|
||||||
|
--
|
||||||
|
-- Additional Methods to set relevant parameters if the transmiter is any other @{Wrapper.Positionable#POSITIONABLE}
|
||||||
|
--
|
||||||
|
-- * @{#RADIO.SetPower}() : Sets the power of the antenna in Watts
|
||||||
|
-- * @{#RADIO.NewGenericTransmission}() : Shortcut to set all the relevant parameters in one method call
|
||||||
|
--
|
||||||
|
-- What is this power thing ?
|
||||||
|
--
|
||||||
|
-- * If your transmission is sent by a @{Positionable#POSITIONABLE} other than a @{Unit#UNIT} or a @{Group#GROUP}, you can set the power of the antenna,
|
||||||
|
-- * Otherwise, DCS sets it automatically, depending on what's available on your Unit,
|
||||||
|
-- * If the player gets **too far** from the transmiter, or if the antenna is **too weak**, the transmission will **fade** and **become noisyer**,
|
||||||
|
-- * This an automated DCS calculation you have no say on,
|
||||||
|
-- * For reference, a standard VOR station has a 100W antenna, a standard AA TACAN has a 120W antenna, and civilian ATC's antenna usually range between 300 and 500W,
|
||||||
|
-- * Note that if the transmission has a subtitle, it will be readable, regardless of the quality of the transmission.
|
||||||
|
--
|
||||||
|
-- @type RADIO
|
||||||
|
-- @field Wrapper.Positionable#POSITIONABLE Positionable The transmiter
|
||||||
|
-- @field #string FileName Name of the sound file
|
||||||
|
-- @field #number Frequency Frequency of the transmission in Hz
|
||||||
|
-- @field #number Modulation Modulation of the transmission (either radio.modulation.AM or radio.modulation.FM)
|
||||||
|
-- @field #string Subtitle Subtitle of the transmission
|
||||||
|
-- @field #number SubtitleDuration Duration of the Subtitle in seconds
|
||||||
|
-- @field #number Power Power of the antenna is Watts
|
||||||
|
-- @field #boolean Loop
|
||||||
|
-- @extends Core.Base#BASE
|
||||||
|
RADIO = {
|
||||||
|
ClassName = "RADIO",
|
||||||
|
FileName = "",
|
||||||
|
Frequency = 0,
|
||||||
|
Modulation = radio.modulation.AM,
|
||||||
|
Subtitle = "",
|
||||||
|
SubtitleDuration = 0,
|
||||||
|
Power = 100,
|
||||||
|
Loop = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Create a new RADIO Object. This doesn't broadcast a transmission, though, use @{#RADIO.Broadcast} to actually broadcast
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param Wrapper.Positionable#POSITIONABLE Positionable The @{Positionable} that will receive radio capabilities.
|
||||||
|
-- @return #RADIO Radio
|
||||||
|
-- @return #nil If Positionable is invalid
|
||||||
|
-- @usage
|
||||||
|
-- -- If you want to create a RADIO, you probably should use @{Positionable#POSITIONABLE.GetRadio}() instead
|
||||||
|
function RADIO:New(Positionable)
|
||||||
|
local self = BASE:Inherit( self, BASE:New() ) -- Core.Radio#RADIO
|
||||||
|
|
||||||
|
self:F(Positionable)
|
||||||
|
|
||||||
|
if Positionable:GetPointVec2() then -- It's stupid, but the only way I found to make sure positionable is valid
|
||||||
|
self.Positionable = Positionable
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
self:E({"The passed positionable is invalid, no RADIO created", Positionable})
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the filename passed and sets RADIO.FileName
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string FileName File name of the sound file (i.e. "Noise.ogg")
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetFileName(FileName)
|
||||||
|
self:F2(FileName)
|
||||||
|
|
||||||
|
if type(FileName) == "string" then
|
||||||
|
if FileName:find(".ogg") or FileName:find(".wav") then
|
||||||
|
if not FileName:find("l10n/DEFAULT/") then
|
||||||
|
FileName = "l10n/DEFAULT/" .. FileName
|
||||||
|
end
|
||||||
|
self.FileName = FileName
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self:E({"File name invalid. Maybe something wrong with the extension ?", self.FileName})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the frequency passed and sets RADIO.Frequency
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #number Frequency in MHz (Ranges allowed for radio transmissions in DCS : 30-88 / 108-152 / 225-400MHz)
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetFrequency(Frequency)
|
||||||
|
self:F2(Frequency)
|
||||||
|
if type(Frequency) == "number" then
|
||||||
|
-- If frequency is in range
|
||||||
|
if (Frequency >= 30 and Frequency < 88) or (Frequency >= 108 and Frequency < 152) or (Frequency >= 225 and Frequency < 400) then
|
||||||
|
self.Frequency = Frequency * 1000000 -- Conversion in Hz
|
||||||
|
-- If the RADIO is attached to a UNIT or a GROUP, we need to send the DCS Command "SetFrequency" to change the UNIT or GROUP frequency
|
||||||
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
|
self.Positionable:SetCommand({
|
||||||
|
id = "SetFrequency",
|
||||||
|
params = {
|
||||||
|
frequency = self.Frequency,
|
||||||
|
modulation = self.Modulation,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:E({"Frequency is outside of DCS Frequency ranges (30-80, 108-152, 225-400). Frequency unchanged.", self.Frequency})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the frequency passed and sets RADIO.Modulation
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #number Modulation either radio.modulation.AM or radio.modulation.FM
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetModulation(Modulation)
|
||||||
|
self:F2(Modulation)
|
||||||
|
if type(Modulation) == "number" then
|
||||||
|
if Modulation == radio.modulation.AM or Modulation == radio.modulation.FM then --TODO Maybe make this future proof if ED decides to add an other modulation ?
|
||||||
|
self.Modulation = Modulation
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:E({"Modulation is invalid. Use DCS's enum radio.modulation. Modulation unchanged.", self.Modulation})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the power passed and sets RADIO.Power
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #number Power in W
|
||||||
|
-- @return #RADIO self
|
||||||
|
function RADIO:SetPower(Power)
|
||||||
|
self:F2(Power)
|
||||||
|
if type(Power) == "number" then
|
||||||
|
self.Power = math.floor(math.abs(Power)) --TODO Find what is the maximum power allowed by DCS and limit power to that
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
self:E({"Power is invalid. Power unchanged.", self.Power})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the loop passed and sets RADIO.Loop
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #boolean Loop
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
function RADIO:SetLoop(Loop)
|
||||||
|
self:F2(Loop)
|
||||||
|
if type(Loop) == "boolean" then
|
||||||
|
self.Loop = Loop
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
self:E({"Loop is invalid. Loop unchanged.", self.Loop})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check validity of the subtitle and the subtitleDuration passed and sets RADIO.subtitle and RADIO.subtitleDuration
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string Subtitle
|
||||||
|
-- @param #number SubtitleDuration in s
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- Both parameters are mandatory, since it wouldn't make much sense to change the Subtitle and not its duration
|
||||||
|
function RADIO:SetSubtitle(Subtitle, SubtitleDuration)
|
||||||
|
self:F2({Subtitle, SubtitleDuration})
|
||||||
|
if type(Subtitle) == "string" then
|
||||||
|
self.Subtitle = Subtitle
|
||||||
|
else
|
||||||
|
self.Subtitle = ""
|
||||||
|
self:E({"Subtitle is invalid. Subtitle reset.", self.Subtitle})
|
||||||
|
end
|
||||||
|
if type(SubtitleDuration) == "number" then
|
||||||
|
if math.floor(math.abs(SubtitleDuration)) == SubtitleDuration then
|
||||||
|
self.SubtitleDuration = SubtitleDuration
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.SubtitleDuration = 0
|
||||||
|
self:E({"SubtitleDuration is invalid. SubtitleDuration reset.", self.SubtitleDuration})
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Create a new transmission, that is to say, populate the RADIO with relevant data
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string FileName
|
||||||
|
-- @param #number Frequency in MHz
|
||||||
|
-- @param #number Modulation either radio.modulation.AM or radio.modulation.FM
|
||||||
|
-- @param #number Power in W
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- In this function the data is especially relevant if the broadcaster is anything but a UNIT or a GROUP,
|
||||||
|
-- but it will work with a UNIT or a GROUP anyway
|
||||||
|
-- -- Only the RADIO and the Filename are mandatory
|
||||||
|
function RADIO:NewGenericTransmission(FileName, Frequency, Modulation, Power)
|
||||||
|
self:F({FileName, Frequency, Modulation, Power})
|
||||||
|
|
||||||
|
self:SetFileName(FileName)
|
||||||
|
if Frequency then self:SetFrequency(Frequency) end
|
||||||
|
if Modulation then self:SetModulation(Modulation) end
|
||||||
|
if Power then self:SetPower(Power) end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Create a new transmission, that is to say, populate the RADIO with relevant data
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @param #string FileName
|
||||||
|
-- @param #string Subtitle
|
||||||
|
-- @param #number SubtitleDuration in s
|
||||||
|
-- @param #number Frequency in MHz
|
||||||
|
-- @param #number Modulation either radio.modulation.AM or radio.modulation.FM
|
||||||
|
-- @param #boolean Loop
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- In this function the data is especially relevant if the broadcaster is a UNIT or a GROUP,
|
||||||
|
-- but it will work for any POSITIONABLE
|
||||||
|
-- -- Only the RADIO and the Filename are mandatory
|
||||||
|
function RADIO:NewUnitTransmission(FileName, Subtitle, SubtitleDuration, Frequency, Modulation, Loop)
|
||||||
|
self:F({FileName, Subtitle, SubtitleDuration, Frequency, Modulation, Loop})
|
||||||
|
|
||||||
|
self:SetFileName(FileName)
|
||||||
|
if Subtitle then self:SetSubtitle(Subtitle) end
|
||||||
|
if SubtitleDuration then self:SetSubtitleDuration(SubtitleDuration) end
|
||||||
|
if Frequency then self:SetFrequency(Frequency) end
|
||||||
|
if Modulation then self:SetModulation(Modulation) end
|
||||||
|
if Loop then self:SetLoop(Loop) end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Actually Broadcast the transmission
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- The Radio has to be populated with the new transmission before broadcasting.
|
||||||
|
-- -- Please use RADIO setters or either @{Radio#RADIO.NewGenericTransmission} or @{Radio#RADIO.NewUnitTransmission}
|
||||||
|
-- -- This class is in fact pretty smart, it determines the right DCS function to use depending on the type of POSITIONABLE
|
||||||
|
-- -- If the POSITIONABLE is not a UNIT or a GROUP, we use the generic (but limited) trigger.action.radioTransmission()
|
||||||
|
-- -- If the POSITIONABLE is a UNIT or a GROUP, we use the "TransmitMessage" Command
|
||||||
|
-- -- If your POSITIONABLE is a UNIT or a GROUP, the Power is ignored.
|
||||||
|
-- -- If your POSITIONABLE is not a UNIT or a GROUP, the Subtitle, SubtitleDuration and Loop are ignored
|
||||||
|
function RADIO:Broadcast()
|
||||||
|
self:F()
|
||||||
|
-- If the POSITIONABLE is actually a UNIT or a GROUP, use the more complicated DCS command system
|
||||||
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
|
self:T2("Broadcasting from a UNIT or a GROUP")
|
||||||
|
self.Positionable:SetCommand({
|
||||||
|
id = "TransmitMessage",
|
||||||
|
params = {
|
||||||
|
file = self.FileName,
|
||||||
|
duration = self.SubtitleDuration,
|
||||||
|
subtitle = self.Subtitle,
|
||||||
|
loop = self.Loop,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else
|
||||||
|
-- If the POSITIONABLE is anything else, we revert to the general singleton function
|
||||||
|
self:T2("Broadcasting from a POSITIONABLE")
|
||||||
|
trigger.action.radioTransmission(self.FileName, self.Positionable:GetPositionVec3(), self.Modulation, false, self.Frequency, self.Power)
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Stops a transmission
|
||||||
|
-- @param #RADIO self
|
||||||
|
-- @return #RADIO self
|
||||||
|
-- @usage
|
||||||
|
-- -- Especially usefull to stop the broadcast of looped transmissions
|
||||||
|
-- -- Only works with broadcasts from UNIT or GROUP
|
||||||
|
function RADIO:StopBroadcast()
|
||||||
|
self:F()
|
||||||
|
-- If the POSITIONABLE is a UNIT or a GROUP, stop the transmission with the DCS "StopTransmission" command
|
||||||
|
if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then
|
||||||
|
self.Positionable:SetCommand({
|
||||||
|
id = "StopTransmission",
|
||||||
|
params = {}
|
||||||
|
})
|
||||||
|
else
|
||||||
|
self:E("This broadcast can't be stopped. It's not looped either, so please wait for the end of the sound file playback")
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end--- This module contains the OBJECT class.
|
||||||
--
|
--
|
||||||
-- 1) @{Object#OBJECT} class, extends @{Base#BASE}
|
-- 1) @{Object#OBJECT} class, extends @{Base#BASE}
|
||||||
-- ===========================================================
|
-- ===========================================================
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ COPY /b Moose.lua + %1\Core\Set.lua Moose.lua
|
|||||||
COPY /b Moose.lua + %1\Core\Point.lua Moose.lua
|
COPY /b Moose.lua + %1\Core\Point.lua Moose.lua
|
||||||
COPY /b Moose.lua + %1\Core\Message.lua Moose.lua
|
COPY /b Moose.lua + %1\Core\Message.lua Moose.lua
|
||||||
COPY /b Moose.lua + %1\Core\Fsm.lua Moose.lua
|
COPY /b Moose.lua + %1\Core\Fsm.lua Moose.lua
|
||||||
|
COPY /b Moose.lua + %1\Core\Radio.lua Moose.lua
|
||||||
|
|
||||||
rem Wrapper Classes
|
rem Wrapper Classes
|
||||||
COPY /b Moose.lua + %1\Wrapper\Object.lua Moose.lua
|
COPY /b Moose.lua + %1\Wrapper\Object.lua Moose.lua
|
||||||
|
|||||||
+6
-6
@@ -50,7 +50,7 @@ BatumiRadio:Broadcast()
|
|||||||
|
|
||||||
-- Now, if Viktor answered imedately, the two radio broadcasts would overlap. We need to delay Viktor's answer.
|
-- Now, if Viktor answered imedately, the two radio broadcasts would overlap. We need to delay Viktor's answer.
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
SCHEDULER:New( nil,
|
CommunitcationScheduler = SCHEDULER:New( nil,
|
||||||
function()
|
function()
|
||||||
ViktorRadio:SetFileName("Viktor - Enter left base ack.ogg"):SetFrequency(115):SetModulation(radio.modulation.AM):Broadcast() -- We don't specify a subtitle since we don't want one
|
ViktorRadio:SetFileName("Viktor - Enter left base ack.ogg"):SetFrequency(115):SetModulation(radio.modulation.AM):Broadcast() -- We don't specify a subtitle since we don't want one
|
||||||
end, {}, 10 -- 10s delay
|
end, {}, 10 -- 10s delay
|
||||||
@@ -58,7 +58,7 @@ SCHEDULER:New( nil,
|
|||||||
|
|
||||||
-- Viktor takes 145s to be 5km final, and need to contact Batumi Tower.
|
-- Viktor takes 145s to be 5km final, and need to contact Batumi Tower.
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
SCHEDULER:New( nil,
|
CommunitcationScheduler:Schedule( nil,
|
||||||
function()
|
function()
|
||||||
ViktorRadio:SetFileName("Viktor - Request landing clearance.ogg"):Broadcast() --We only specify the new file name, since frequency and modulation didn't change
|
ViktorRadio:SetFileName("Viktor - Request landing clearance.ogg"):Broadcast() --We only specify the new file name, since frequency and modulation didn't change
|
||||||
end, {}, 145
|
end, {}, 145
|
||||||
@@ -66,25 +66,25 @@ SCHEDULER:New( nil,
|
|||||||
|
|
||||||
-- Now that you understand everything about the RADIO class, the rest is pretty trivial
|
-- Now that you understand everything about the RADIO class, the rest is pretty trivial
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
SCHEDULER:New( nil,
|
CommunitcationScheduler:Schedule( nil,
|
||||||
function()
|
function()
|
||||||
BatumiRadio:SetFileName("Batumi Tower - Clear to land.ogg"):Broadcast()
|
BatumiRadio:SetFileName("Batumi Tower - Clear to land.ogg"):Broadcast()
|
||||||
end, {}, 154
|
end, {}, 154
|
||||||
)
|
)
|
||||||
|
|
||||||
SCHEDULER:New( nil,
|
CommunitcationScheduler:Schedule( nil,
|
||||||
function()
|
function()
|
||||||
ViktorRadio:SetFileName("Viktor - Clear to land ack.ogg"):Broadcast()
|
ViktorRadio:SetFileName("Viktor - Clear to land ack.ogg"):Broadcast()
|
||||||
end, {}, 160
|
end, {}, 160
|
||||||
)
|
)
|
||||||
|
|
||||||
SCHEDULER:New( nil,
|
CommunitcationScheduler:Schedule( nil,
|
||||||
function()
|
function()
|
||||||
ViktorRadio:SetFileName("Viktor - Touchdown.ogg"):Broadcast()
|
ViktorRadio:SetFileName("Viktor - Touchdown.ogg"):Broadcast()
|
||||||
end, {}, 210
|
end, {}, 210
|
||||||
)
|
)
|
||||||
|
|
||||||
SCHEDULER:New( nil,
|
CommunitcationScheduler:Schedule( nil,
|
||||||
function()
|
function()
|
||||||
BatumiRadio:SetFileName("Batumi Tower - Taxi to parking.ogg"):Broadcast()
|
BatumiRadio:SetFileName("Batumi Tower - Taxi to parking.ogg"):Broadcast()
|
||||||
end, {}, 215
|
end, {}, 215
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -49,6 +49,7 @@
|
|||||||
<li><a href="Positionable.html">Positionable</a></li>
|
<li><a href="Positionable.html">Positionable</a></li>
|
||||||
<li><a href="Process_JTAC.html">Process_JTAC</a></li>
|
<li><a href="Process_JTAC.html">Process_JTAC</a></li>
|
||||||
<li><a href="Process_Pickup.html">Process_Pickup</a></li>
|
<li><a href="Process_Pickup.html">Process_Pickup</a></li>
|
||||||
|
<li><a href="Radio.html">Radio</a></li>
|
||||||
<li><a href="Route.html">Route</a></li>
|
<li><a href="Route.html">Route</a></li>
|
||||||
<li><a href="Scenery.html">Scenery</a></li>
|
<li><a href="Scenery.html">Scenery</a></li>
|
||||||
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>
|
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>
|
||||||
|
|||||||
@@ -2426,7 +2426,6 @@ The UNIT carrying the package.</p>
|
|||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<em></em>
|
|
||||||
<a id="#(AI_CARGO_UNIT).CargoCarrier" >
|
<a id="#(AI_CARGO_UNIT).CargoCarrier" >
|
||||||
<strong>AI_CARGO_UNIT.CargoCarrier</strong>
|
<strong>AI_CARGO_UNIT.CargoCarrier</strong>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ If the DCS Unit object does not exist or is nil, the CLIENT methods will return
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="name" nowrap="nowrap"><a href="##(CLIENT).Find">CLIENT:Find(ClientName, ClientBriefing, DCSUnit)</a></td>
|
<td class="name" nowrap="nowrap"><a href="##(CLIENT).Find">CLIENT:Find(ClientName, ClientBriefing, DCSUnit, Error)</a></td>
|
||||||
<td class="summary">
|
<td class="summary">
|
||||||
<p>Finds a CLIENT from the _DATABASE using the relevant DCS Unit.</p>
|
<p>Finds a CLIENT from the _DATABASE using the relevant DCS Unit.</p>
|
||||||
</td>
|
</td>
|
||||||
@@ -594,7 +594,7 @@ Create a function that will be called when a player joins the slot.</p>
|
|||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<a id="#(CLIENT).Find" >
|
<a id="#(CLIENT).Find" >
|
||||||
<strong>CLIENT:Find(ClientName, ClientBriefing, DCSUnit)</strong>
|
<strong>CLIENT:Find(ClientName, ClientBriefing, DCSUnit, Error)</strong>
|
||||||
</a>
|
</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
@@ -619,6 +619,11 @@ Text that describes the briefing of the mission when a Player logs into the Clie
|
|||||||
|
|
||||||
<p><code><em> DCSUnit </em></code>: </p>
|
<p><code><em> DCSUnit </em></code>: </p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
|
||||||
|
<p><code><em> Error </em></code>: </p>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h3>Return value</h3>
|
<h3>Return value</h3>
|
||||||
|
|||||||
@@ -601,18 +601,48 @@ YYYY-MM-DD: CLASS:<strong>NewFunction( Params )</strong> added</p>
|
|||||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).Weapon">EVENTDATA.Weapon</a></td>
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).Weapon">EVENTDATA.Weapon</a></td>
|
||||||
<td class="summary">
|
<td class="summary">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponCategory">EVENTDATA.WeaponCategory</a></td>
|
||||||
|
<td class="summary">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponCoalition">EVENTDATA.WeaponCoalition</a></td>
|
||||||
|
<td class="summary">
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponName">EVENTDATA.WeaponName</a></td>
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponName">EVENTDATA.WeaponName</a></td>
|
||||||
<td class="summary">
|
<td class="summary">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponPlayerName">EVENTDATA.WeaponPlayerName</a></td>
|
||||||
|
<td class="summary">
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponTgtDCSUnit">EVENTDATA.WeaponTgtDCSUnit</a></td>
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponTgtDCSUnit">EVENTDATA.WeaponTgtDCSUnit</a></td>
|
||||||
<td class="summary">
|
<td class="summary">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponTypeName">EVENTDATA.WeaponTypeName</a></td>
|
||||||
|
<td class="summary">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponUNIT">EVENTDATA.WeaponUNIT</a></td>
|
||||||
|
<td class="summary">
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -1930,6 +1960,32 @@ Note that at the beginning of each field description, there is an indication whi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="function">
|
||||||
|
<dt>
|
||||||
|
|
||||||
|
<a id="#(EVENTDATA).WeaponCategory" >
|
||||||
|
<strong>EVENTDATA.WeaponCategory</strong>
|
||||||
|
</a>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="function">
|
||||||
|
<dt>
|
||||||
|
|
||||||
|
<a id="#(EVENTDATA).WeaponCoalition" >
|
||||||
|
<strong>EVENTDATA.WeaponCoalition</strong>
|
||||||
|
</a>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
@@ -1943,6 +1999,19 @@ Note that at the beginning of each field description, there is an indication whi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="function">
|
||||||
|
<dt>
|
||||||
|
|
||||||
|
<a id="#(EVENTDATA).WeaponPlayerName" >
|
||||||
|
<strong>EVENTDATA.WeaponPlayerName</strong>
|
||||||
|
</a>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
@@ -1956,6 +2025,36 @@ Note that at the beginning of each field description, there is an indication whi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="function">
|
||||||
|
<dt>
|
||||||
|
|
||||||
|
<a id="#(EVENTDATA).WeaponTypeName" >
|
||||||
|
<strong>EVENTDATA.WeaponTypeName</strong>
|
||||||
|
</a>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="function">
|
||||||
|
<dt>
|
||||||
|
|
||||||
|
<em></em>
|
||||||
|
<a id="#(EVENTDATA).WeaponUNIT" >
|
||||||
|
<strong>EVENTDATA.WeaponUNIT</strong>
|
||||||
|
</a>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p> Sometimes, the weapon is a player unit!</p>
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
|
|||||||
@@ -1555,7 +1555,7 @@ A string defining the start state.</p>
|
|||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<em></em>
|
<em>#string</em>
|
||||||
<a id="#(FSM)._StartState" >
|
<a id="#(FSM)._StartState" >
|
||||||
<strong>FSM._StartState</strong>
|
<strong>FSM._StartState</strong>
|
||||||
</a>
|
</a>
|
||||||
@@ -1854,7 +1854,6 @@ A string defining the start state.</p>
|
|||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<em></em>
|
|
||||||
<a id="#(FSM).current" >
|
<a id="#(FSM).current" >
|
||||||
<strong>FSM.current</strong>
|
<strong>FSM.current</strong>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -191,6 +191,7 @@ on defined intervals (currently every minute).</p>
|
|||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
|
<em>#number</em>
|
||||||
<a id="#(MOVEMENT).AliveUnits" >
|
<a id="#(MOVEMENT).AliveUnits" >
|
||||||
<strong>MOVEMENT.AliveUnits</strong>
|
<strong>MOVEMENT.AliveUnits</strong>
|
||||||
</a>
|
</a>
|
||||||
@@ -199,6 +200,9 @@ on defined intervals (currently every minute).</p>
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p> Contains the counter how many units are currently alive</p>
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
|
|||||||
@@ -39,11 +39,11 @@
|
|||||||
<li><a href="Fsm.html">Fsm</a></li>
|
<li><a href="Fsm.html">Fsm</a></li>
|
||||||
<li><a href="Group.html">Group</a></li>
|
<li><a href="Group.html">Group</a></li>
|
||||||
<li><a href="Identifiable.html">Identifiable</a></li>
|
<li><a href="Identifiable.html">Identifiable</a></li>
|
||||||
<li><a href="MOVEMENT.html">MOVEMENT</a></li>
|
|
||||||
<li><a href="Menu.html">Menu</a></li>
|
<li><a href="Menu.html">Menu</a></li>
|
||||||
<li><a href="Message.html">Message</a></li>
|
<li><a href="Message.html">Message</a></li>
|
||||||
<li><a href="MissileTrainer.html">MissileTrainer</a></li>
|
<li><a href="MissileTrainer.html">MissileTrainer</a></li>
|
||||||
<li><a href="Mission.html">Mission</a></li>
|
<li><a href="Mission.html">Mission</a></li>
|
||||||
|
<li><a href="Movement.html">Movement</a></li>
|
||||||
<li><a href="Object.html">Object</a></li>
|
<li><a href="Object.html">Object</a></li>
|
||||||
<li><a href="Point.html">Point</a></li>
|
<li><a href="Point.html">Point</a></li>
|
||||||
<li><a href="Positionable.html">Positionable</a></li>
|
<li><a href="Positionable.html">Positionable</a></li>
|
||||||
@@ -62,8 +62,8 @@
|
|||||||
<li><a href="Static.html">Static</a></li>
|
<li><a href="Static.html">Static</a></li>
|
||||||
<li><a href="Task.html">Task</a></li>
|
<li><a href="Task.html">Task</a></li>
|
||||||
<li><a href="Task_A2G.html">Task_A2G</a></li>
|
<li><a href="Task_A2G.html">Task_A2G</a></li>
|
||||||
|
<li><a href="Task_A2G_Dispatcher.html">Task_A2G_Dispatcher</a></li>
|
||||||
<li><a href="Task_PICKUP.html">Task_PICKUP</a></li>
|
<li><a href="Task_PICKUP.html">Task_PICKUP</a></li>
|
||||||
<li><a href="Task_SEAD.html">Task_SEAD</a></li>
|
|
||||||
<li><a href="Unit.html">Unit</a></li>
|
<li><a href="Unit.html">Unit</a></li>
|
||||||
<li><a href="Utils.html">Utils</a></li>
|
<li><a href="Utils.html">Utils</a></li>
|
||||||
<li><a href="Zone.html">Zone</a></li>
|
<li><a href="Zone.html">Zone</a></li>
|
||||||
@@ -167,13 +167,13 @@ If a FC3 airacraft is used, it will <strong>hear every communication, whatever t
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="name" nowrap="nowrap"><a href="##(RADIO).NewGenericTransmission">RADIO:NewGenericTransmission(Filename, Frequency, Modulation, Power, ...)</a></td>
|
<td class="name" nowrap="nowrap"><a href="##(RADIO).NewGenericTransmission">RADIO:NewGenericTransmission(FileName, Frequency, Modulation, Power)</a></td>
|
||||||
<td class="summary">
|
<td class="summary">
|
||||||
<p>Create a new transmission, that is to say, populate the RADIO with relevant data</p>
|
<p>Create a new transmission, that is to say, populate the RADIO with relevant data</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="name" nowrap="nowrap"><a href="##(RADIO).NewUnitTransmission">RADIO:NewUnitTransmission(Filename, Subtitle, SubtitleDuration, Frequency, Modulation, Loop, ...)</a></td>
|
<td class="name" nowrap="nowrap"><a href="##(RADIO).NewUnitTransmission">RADIO:NewUnitTransmission(FileName, Subtitle, SubtitleDuration, Frequency, Modulation, Loop)</a></td>
|
||||||
<td class="summary">
|
<td class="summary">
|
||||||
<p>Create a new transmission, that is to say, populate the RADIO with relevant data</p>
|
<p>Create a new transmission, that is to say, populate the RADIO with relevant data</p>
|
||||||
</td>
|
</td>
|
||||||
@@ -221,9 +221,15 @@ If a FC3 airacraft is used, it will <strong>hear every communication, whatever t
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="name" nowrap="nowrap"><a href="##(RADIO).SetSubtitle">RADIO:SetSubtitle(SubTitle, SubTitleDuration)</a></td>
|
<td class="name" nowrap="nowrap"><a href="##(RADIO).SetSubtitle">RADIO:SetSubtitle(Subtitle, SubtitleDuration)</a></td>
|
||||||
<td class="summary">
|
<td class="summary">
|
||||||
<p>Check validity of the subtitle and the subtitleDuration passed and sets RADIO.subtitle and RADIO.subtitleDuration</p>
|
<p>Check validity of the subtitle and the subtitleDuration passed and sets RADIO.subtitle and RADIO.subtitleDuration</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="name" nowrap="nowrap"><a href="##(RADIO).StopBroadcast">RADIO:StopBroadcast()</a></td>
|
||||||
|
<td class="summary">
|
||||||
|
<p>Stops a transmission</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -453,7 +459,7 @@ If Positionable is invalid</p>
|
|||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<a id="#(RADIO).NewGenericTransmission" >
|
<a id="#(RADIO).NewGenericTransmission" >
|
||||||
<strong>RADIO:NewGenericTransmission(Filename, Frequency, Modulation, Power, ...)</strong>
|
<strong>RADIO:NewGenericTransmission(FileName, Frequency, Modulation, Power)</strong>
|
||||||
</a>
|
</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
@@ -464,7 +470,7 @@ If Positionable is invalid</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
|
||||||
<p><code><em>#string Filename </em></code>: </p>
|
<p><code><em>#string FileName </em></code>: </p>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@@ -484,11 +490,6 @@ either radio.modulation.AM or radio.modulation.FM</p>
|
|||||||
<p><code><em>#number Power </em></code>:
|
<p><code><em>#number Power </em></code>:
|
||||||
in W</p>
|
in W</p>
|
||||||
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
|
|
||||||
<p><code><em> ... </em></code>: </p>
|
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h3>Return value</h3>
|
<h3>Return value</h3>
|
||||||
@@ -507,7 +508,7 @@ but it will work with a UNIT or a GROUP anyway
|
|||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<a id="#(RADIO).NewUnitTransmission" >
|
<a id="#(RADIO).NewUnitTransmission" >
|
||||||
<strong>RADIO:NewUnitTransmission(Filename, Subtitle, SubtitleDuration, Frequency, Modulation, Loop, ...)</strong>
|
<strong>RADIO:NewUnitTransmission(FileName, Subtitle, SubtitleDuration, Frequency, Modulation, Loop)</strong>
|
||||||
</a>
|
</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
@@ -518,7 +519,7 @@ but it will work with a UNIT or a GROUP anyway
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
|
||||||
<p><code><em>#string Filename </em></code>: </p>
|
<p><code><em>#string FileName </em></code>: </p>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@@ -548,11 +549,6 @@ either radio.modulation.AM or radio.modulation.FM</p>
|
|||||||
|
|
||||||
<p><code><em>#boolean Loop </em></code>: </p>
|
<p><code><em>#boolean Loop </em></code>: </p>
|
||||||
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
|
|
||||||
<p><code><em> ... </em></code>: </p>
|
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h3>Return value</h3>
|
<h3>Return value</h3>
|
||||||
@@ -736,7 +732,7 @@ self</p>
|
|||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<a id="#(RADIO).SetSubtitle" >
|
<a id="#(RADIO).SetSubtitle" >
|
||||||
<strong>RADIO:SetSubtitle(SubTitle, SubTitleDuration)</strong>
|
<strong>RADIO:SetSubtitle(Subtitle, SubtitleDuration)</strong>
|
||||||
</a>
|
</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
@@ -747,12 +743,12 @@ self</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
|
||||||
<p><code><em>#string SubTitle </em></code>: </p>
|
<p><code><em>#string Subtitle </em></code>: </p>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
|
||||||
<p><code><em>#number SubTitleDuration </em></code>:
|
<p><code><em>#number SubtitleDuration </em></code>:
|
||||||
in s</p>
|
in s</p>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
@@ -765,6 +761,28 @@ self</p>
|
|||||||
<h3>Usage:</h3>
|
<h3>Usage:</h3>
|
||||||
<pre class="example"><code>-- Both parameters are mandatory, since it wouldn't make much sense to change the Subtitle and not its duration</code></pre>
|
<pre class="example"><code>-- Both parameters are mandatory, since it wouldn't make much sense to change the Subtitle and not its duration</code></pre>
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="function">
|
||||||
|
<dt>
|
||||||
|
|
||||||
|
<a id="#(RADIO).StopBroadcast" >
|
||||||
|
<strong>RADIO:StopBroadcast()</strong>
|
||||||
|
</a>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
<p>Stops a transmission</p>
|
||||||
|
|
||||||
|
<h3>Return value</h3>
|
||||||
|
|
||||||
|
<p><em><a href="##(RADIO)">#RADIO</a>:</em>
|
||||||
|
self</p>
|
||||||
|
|
||||||
|
<h3>Usage:</h3>
|
||||||
|
<pre class="example"><code>-- Especially usefull to stop the broadcast of looped transmissions
|
||||||
|
-- Only works with broadcasts from UNIT or GROUP</code></pre>
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
|
|||||||
@@ -80,8 +80,6 @@ and create a CSV file logging the scoring events for use at team or squadron web
|
|||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<h1>1) <a href="Scoring.html##(SCORING)">Scoring#SCORING</a> class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
|
|
||||||
|
|
||||||
<p>The <a href="##(SCORING)">#SCORING</a> class administers the scoring of player achievements,
|
<p>The <a href="##(SCORING)">#SCORING</a> class administers the scoring of player achievements,
|
||||||
and creates a CSV file logging the scoring events and results for use at team or squadron websites.</p>
|
and creates a CSV file logging the scoring events and results for use at team or squadron websites.</p>
|
||||||
|
|
||||||
@@ -136,6 +134,8 @@ These CSV files can be used to:</p>
|
|||||||
Use the radio menu F10 to consult the scores while running the mission.
|
Use the radio menu F10 to consult the scores while running the mission.
|
||||||
Scores can be reported for your user, or an overall score can be reported of all players currently active in the mission.</p>
|
Scores can be reported for your user, or an overall score can be reported of all players currently active in the mission.</p>
|
||||||
|
|
||||||
|
<h1>1) <a href="Scoring.html##(SCORING)">Scoring#SCORING</a> class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
|
||||||
|
|
||||||
<h2>1.1) Set the destroy score or penalty scale</h2>
|
<h2>1.1) Set the destroy score or penalty scale</h2>
|
||||||
|
|
||||||
<p>Score scales can be set for scores granted when enemies or friendlies are destroyed.
|
<p>Score scales can be set for scores granted when enemies or friendlies are destroyed.
|
||||||
@@ -169,8 +169,6 @@ For example, this can be done as follows:</p>
|
|||||||
<pre><code> Scoring:RemoveUnitScore( UNIT:FindByName( "Unit #001" ) )
|
<pre><code> Scoring:RemoveUnitScore( UNIT:FindByName( "Unit #001" ) )
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h2>1.3) Define destruction zones that will give extra scores.</h2>
|
<h2>1.3) Define destruction zones that will give extra scores.</h2>
|
||||||
|
|
||||||
<p>Define zones of destruction. Any object destroyed within the zone of the given category will give extra points.
|
<p>Define zones of destruction. Any object destroyed within the zone of the given category will give extra points.
|
||||||
|
|||||||
@@ -1871,6 +1871,9 @@ The group that was spawned. You can use this group for further actions.</p>
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p> Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.</p>
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
@@ -2324,9 +2327,6 @@ when nothing was spawned.</p>
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p> Overwrite unit names by default with group name.</p>
|
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
@@ -2341,9 +2341,6 @@ when nothing was spawned.</p>
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p> By default, no InitLimit</p>
|
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
@@ -2379,7 +2376,7 @@ when nothing was spawned.</p>
|
|||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<em>#number</em>
|
<em></em>
|
||||||
<a id="#(SPAWN).SpawnMaxGroups" >
|
<a id="#(SPAWN).SpawnMaxGroups" >
|
||||||
<strong>SPAWN.SpawnMaxGroups</strong>
|
<strong>SPAWN.SpawnMaxGroups</strong>
|
||||||
</a>
|
</a>
|
||||||
@@ -2396,7 +2393,7 @@ when nothing was spawned.</p>
|
|||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<em>#number</em>
|
<em></em>
|
||||||
<a id="#(SPAWN).SpawnMaxUnitsAlive" >
|
<a id="#(SPAWN).SpawnMaxUnitsAlive" >
|
||||||
<strong>SPAWN.SpawnMaxUnitsAlive</strong>
|
<strong>SPAWN.SpawnMaxUnitsAlive</strong>
|
||||||
</a>
|
</a>
|
||||||
@@ -2714,7 +2711,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
|
|||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
<em>#boolean</em>
|
<em></em>
|
||||||
<a id="#(SPAWN).SpawnUnControlled" >
|
<a id="#(SPAWN).SpawnUnControlled" >
|
||||||
<strong>SPAWN.SpawnUnControlled</strong>
|
<strong>SPAWN.SpawnUnControlled</strong>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
<li><a href="Positionable.html">Positionable</a></li>
|
<li><a href="Positionable.html">Positionable</a></li>
|
||||||
<li><a href="Process_JTAC.html">Process_JTAC</a></li>
|
<li><a href="Process_JTAC.html">Process_JTAC</a></li>
|
||||||
<li><a href="Process_Pickup.html">Process_Pickup</a></li>
|
<li><a href="Process_Pickup.html">Process_Pickup</a></li>
|
||||||
|
<li><a href="Radio.html">Radio</a></li>
|
||||||
<li><a href="Route.html">Route</a></li>
|
<li><a href="Route.html">Route</a></li>
|
||||||
<li><a href="Scenery.html">Scenery</a></li>
|
<li><a href="Scenery.html">Scenery</a></li>
|
||||||
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>
|
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
<li><a href="Positionable.html">Positionable</a></li>
|
<li><a href="Positionable.html">Positionable</a></li>
|
||||||
<li><a href="Process_JTAC.html">Process_JTAC</a></li>
|
<li><a href="Process_JTAC.html">Process_JTAC</a></li>
|
||||||
<li><a href="Process_Pickup.html">Process_Pickup</a></li>
|
<li><a href="Process_Pickup.html">Process_Pickup</a></li>
|
||||||
|
<li><a href="Radio.html">Radio</a></li>
|
||||||
<li><a href="Route.html">Route</a></li>
|
<li><a href="Route.html">Route</a></li>
|
||||||
<li><a href="Scenery.html">Scenery</a></li>
|
<li><a href="Scenery.html">Scenery</a></li>
|
||||||
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>
|
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>
|
||||||
|
|||||||
@@ -353,8 +353,6 @@ and create a CSV file logging the scoring events for use at team or squadron web
|
|||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<h1>1) <a href="Scoring.html##(SCORING)">Scoring#SCORING</a> class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
|
|
||||||
|
|
||||||
<p>The <a href="##(SCORING)">#SCORING</a> class administers the scoring of player achievements,
|
<p>The <a href="##(SCORING)">#SCORING</a> class administers the scoring of player achievements,
|
||||||
and creates a CSV file logging the scoring events and results for use at team or squadron websites.</p>
|
and creates a CSV file logging the scoring events and results for use at team or squadron websites.</p>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
Reference in New Issue
Block a user