Merge remote-tracking branch 'refs/remotes/origin/master' into FlightControl

# Conflicts:
#	Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua
#	Moose Mission Setup/Moose.lua
#	Moose Test Missions/RAD - Radio/RAD-002 - Transmission Tips and
Tricks/RAD-002 - Transmission Tips and Tricks.miz
This commit is contained in:
FlightControl 2017-03-23 18:23:08 +01:00
commit f75f9512a2
15 changed files with 194 additions and 54 deletions

View File

@ -100,7 +100,7 @@ function RADIO:New(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
return self
end
@ -117,8 +117,8 @@ function RADIO:SetFileName(FileName)
self:F2(FileName)
if type(FileName) == "string" then
if FileName:find(".ogg") ~= nil or FileName:find(".wav") ~= nil then
if FileName:find("l10n/DEFAULT/") == nil 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
@ -142,7 +142,7 @@ function RADIO:SetFrequency(Frequency)
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:GetDCSObject():getController():setCommand({
self.Positionable:SetCommand({
id = "SetFrequency",
params = {
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
function RADIO:Broadcast()
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
self:T2("Broadcasting from a UNIT or a GROUP")
self.Positionable:GetDCSObject():getController():setCommand({
self.Positionable:SetCommand({
id = "TransmitMessage",
params = {
file = self.FileName,
@ -309,3 +309,22 @@ function RADIO:Broadcast()
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

View File

@ -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\Message.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
COPY /b Moose.lua + %1\Wrapper\Object.lua Moose.lua

View File

@ -50,7 +50,7 @@ BatumiRadio:Broadcast()
-- 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()
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
@ -58,7 +58,7 @@ SCHEDULER:New( nil,
-- Viktor takes 145s to be 5km final, and need to contact Batumi Tower.
------------------------------------------------------------------------------------------------------------------------------------------------------
SCHEDULER:New( nil,
CommunitcationScheduler:Schedule( nil,
function()
ViktorRadio:SetFileName("Viktor - Request landing clearance.ogg"):Broadcast() --We only specify the new file name, since frequency and modulation didn't change
end, {}, 145
@ -66,25 +66,25 @@ SCHEDULER:New( nil,
-- Now that you understand everything about the RADIO class, the rest is pretty trivial
-------------------------------------------------------------------------------------------------------------------------------------------------------
SCHEDULER:New( nil,
CommunitcationScheduler:Schedule( nil,
function()
BatumiRadio:SetFileName("Batumi Tower - Clear to land.ogg"):Broadcast()
end, {}, 154
)
SCHEDULER:New( nil,
CommunitcationScheduler:Schedule( nil,
function()
ViktorRadio:SetFileName("Viktor - Clear to land ack.ogg"):Broadcast()
end, {}, 160
)
SCHEDULER:New( nil,
CommunitcationScheduler:Schedule( nil,
function()
ViktorRadio:SetFileName("Viktor - Touchdown.ogg"):Broadcast()
end, {}, 210
)
SCHEDULER:New( nil,
CommunitcationScheduler:Schedule( nil,
function()
BatumiRadio:SetFileName("Batumi Tower - Taxi to parking.ogg"):Broadcast()
end, {}, 215

View File

@ -49,6 +49,7 @@
<li><a href="Positionable.html">Positionable</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="Radio.html">Radio</a></li>
<li><a href="Route.html">Route</a></li>
<li><a href="Scenery.html">Scenery</a></li>
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>

View File

@ -2426,7 +2426,6 @@ The UNIT carrying the package.</p>
<dl class="function">
<dt>
<em></em>
<a id="#(AI_CARGO_UNIT).CargoCarrier" >
<strong>AI_CARGO_UNIT.CargoCarrier</strong>
</a>

View File

@ -210,7 +210,7 @@ If the DCS Unit object does not exist or is nil, the CLIENT methods will return
</td>
</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">
<p>Finds a CLIENT from the _DATABASE using the relevant DCS Unit.</p>
</td>
@ -594,7 +594,7 @@ Create a function that will be called when a player joins the slot.</p>
<dt>
<a id="#(CLIENT).Find" >
<strong>CLIENT:Find(ClientName, ClientBriefing, DCSUnit)</strong>
<strong>CLIENT:Find(ClientName, ClientBriefing, DCSUnit, Error)</strong>
</a>
</dt>
<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>
</li>
<li>
<p><code><em> Error </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>

View File

@ -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="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>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponName">EVENTDATA.WeaponName</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponPlayerName">EVENTDATA.WeaponPlayerName</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).WeaponTgtDCSUnit">EVENTDATA.WeaponTgtDCSUnit</a></td>
<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>
</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>
</dl>
<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>
</dl>
<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>
</dl>
<dl class="function">

View File

@ -1555,7 +1555,7 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em></em>
<em>#string</em>
<a id="#(FSM)._StartState" >
<strong>FSM._StartState</strong>
</a>
@ -1854,7 +1854,6 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em></em>
<a id="#(FSM).current" >
<strong>FSM.current</strong>
</a>

View File

@ -191,6 +191,7 @@ on defined intervals (currently every minute).</p>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(MOVEMENT).AliveUnits" >
<strong>MOVEMENT.AliveUnits</strong>
</a>
@ -199,6 +200,9 @@ on defined intervals (currently every minute).</p>
<p> Contains the counter how many units are currently alive</p>
</dd>
</dl>
<dl class="function">

View File

@ -39,11 +39,11 @@
<li><a href="Fsm.html">Fsm</a></li>
<li><a href="Group.html">Group</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="Message.html">Message</a></li>
<li><a href="MissileTrainer.html">MissileTrainer</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="Point.html">Point</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="Task.html">Task</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_SEAD.html">Task_SEAD</a></li>
<li><a href="Unit.html">Unit</a></li>
<li><a href="Utils.html">Utils</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>
</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">
<p>Create a new transmission, that is to say, populate the RADIO with relevant data</p>
</td>
</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">
<p>Create a new transmission, that is to say, populate the RADIO with relevant data</p>
</td>
@ -221,9 +221,15 @@ If a FC3 airacraft is used, it will <strong>hear every communication, whatever t
</td>
</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">
<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>
</tr>
<tr>
@ -453,7 +459,7 @@ If Positionable is invalid</p>
<dt>
<a id="#(RADIO).NewGenericTransmission" >
<strong>RADIO:NewGenericTransmission(Filename, Frequency, Modulation, Power, ...)</strong>
<strong>RADIO:NewGenericTransmission(FileName, Frequency, Modulation, Power)</strong>
</a>
</dt>
<dd>
@ -464,7 +470,7 @@ If Positionable is invalid</p>
<ul>
<li>
<p><code><em>#string Filename </em></code>: </p>
<p><code><em>#string FileName </em></code>: </p>
</li>
<li>
@ -484,11 +490,6 @@ either radio.modulation.AM or radio.modulation.FM</p>
<p><code><em>#number Power </em></code>:
in W</p>
</li>
<li>
<p><code><em> ... </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
@ -507,7 +508,7 @@ but it will work with a UNIT or a GROUP anyway
<dt>
<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>
</dt>
<dd>
@ -518,7 +519,7 @@ but it will work with a UNIT or a GROUP anyway
<ul>
<li>
<p><code><em>#string Filename </em></code>: </p>
<p><code><em>#string FileName </em></code>: </p>
</li>
<li>
@ -548,11 +549,6 @@ either radio.modulation.AM or radio.modulation.FM</p>
<p><code><em>#boolean Loop </em></code>: </p>
</li>
<li>
<p><code><em> ... </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
@ -736,7 +732,7 @@ self</p>
<dt>
<a id="#(RADIO).SetSubtitle" >
<strong>RADIO:SetSubtitle(SubTitle, SubTitleDuration)</strong>
<strong>RADIO:SetSubtitle(Subtitle, SubtitleDuration)</strong>
</a>
</dt>
<dd>
@ -747,12 +743,12 @@ self</p>
<ul>
<li>
<p><code><em>#string SubTitle </em></code>: </p>
<p><code><em>#string Subtitle </em></code>: </p>
</li>
<li>
<p><code><em>#number SubTitleDuration </em></code>:
<p><code><em>#number SubtitleDuration </em></code>:
in s</p>
</li>
@ -765,6 +761,28 @@ self</p>
<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>
</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>
</dl>
<dl class="function">

View File

@ -80,8 +80,6 @@ and create a CSV file logging the scoring events for use at team or squadron web
<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,
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.
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>
<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" ) )
</code></pre>
<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.

View File

@ -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>
</dl>
<dl class="function">
@ -2324,9 +2327,6 @@ when nothing was spawned.</p>
<p> Overwrite unit names by default with group name.</p>
</dd>
</dl>
<dl class="function">
@ -2341,9 +2341,6 @@ when nothing was spawned.</p>
<p> By default, no InitLimit</p>
</dd>
</dl>
<dl class="function">
@ -2379,7 +2376,7 @@ when nothing was spawned.</p>
<dl class="function">
<dt>
<em>#number</em>
<em></em>
<a id="#(SPAWN).SpawnMaxGroups" >
<strong>SPAWN.SpawnMaxGroups</strong>
</a>
@ -2396,7 +2393,7 @@ when nothing was spawned.</p>
<dl class="function">
<dt>
<em>#number</em>
<em></em>
<a id="#(SPAWN).SpawnMaxUnitsAlive" >
<strong>SPAWN.SpawnMaxUnitsAlive</strong>
</a>
@ -2714,7 +2711,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
<dl class="function">
<dt>
<em>#boolean</em>
<em></em>
<a id="#(SPAWN).SpawnUnControlled" >
<strong>SPAWN.SpawnUnControlled</strong>
</a>

View File

@ -49,6 +49,7 @@
<li><a href="Positionable.html">Positionable</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="Radio.html">Radio</a></li>
<li><a href="Route.html">Route</a></li>
<li><a href="Scenery.html">Scenery</a></li>
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>

View File

@ -49,6 +49,7 @@
<li><a href="Positionable.html">Positionable</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="Radio.html">Radio</a></li>
<li><a href="Route.html">Route</a></li>
<li><a href="Scenery.html">Scenery</a></li>
<li><a href="ScheduleDispatcher.html">ScheduleDispatcher</a></li>

View File

@ -353,8 +353,6 @@ and create a CSV file logging the scoring events for use at team or squadron web
<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,
and creates a CSV file logging the scoring events and results for use at team or squadron websites.</p>
</td>