From 65c61a15b4c61628335cc69bc3dc846013daf788 Mon Sep 17 00:00:00 2001 From: Grey-Echo Date: Fri, 10 Mar 2017 23:33:21 +0100 Subject: [PATCH] Fix various bugs in RADIO This is the first implementation that PLAY A SOUND ! The whole RADIO class isn't tested thoroughly though --- Moose Development/Moose/Core/Radio.lua | 56 ++++++++++-------- .../Moose/Wrapper/Positionable.lua | 12 ++-- .../l10n/DEFAULT/Moose.lua | 2 +- Moose Mission Setup/Moose.lua | 2 +- .../RAD-000 - Radio Test Mission.lua | 20 +++++-- .../RAD-000 - Radio Test Mission.miz | Bin 95768 -> 96451 bytes 6 files changed, 54 insertions(+), 38 deletions(-) diff --git a/Moose Development/Moose/Core/Radio.lua b/Moose Development/Moose/Core/Radio.lua index 9d1226669..cd024c8cd 100644 --- a/Moose Development/Moose/Core/Radio.lua +++ b/Moose Development/Moose/Core/Radio.lua @@ -18,9 +18,9 @@ --- The RADIO class -- @type RADIO -- @extends Core.Base#BASE -MESSAGE = { +RADIO = { ClassName = "RADIO", - Positionable = POSITIONABLE:New(), + Positionable, FileName = "", Frequency = 0, Modulation = 0, @@ -37,20 +37,21 @@ MESSAGE = { -- @return self -- @usage -- -- If you want to create a RADIO, you probably should use @{Positionable#POSITIONABLE.GetRadio} -function RADIO.New(positionable) +function RADIO:New(positionable) local self = BASE:Inherit( self, BASE:New() ) - -- self:F( { MessageText, MessageDuration, MessageCategory } ) + self:F(positionable) self.Positionable = positionable return self end --- Add the 'l10n/DEFAULT/' in the file name if necessary --- @param #string File name --- @return #string Corrected file name +-- @param #RADIO self +-- @param #string FileName Filename of the sound +-- @return #string FileName Corrected file name -- @usage -- -- internal use only -function RADIO.VerifyFileName(filename) +function RADIO:VerifyFileName(filename) if filename:find("l10n/DEFAULT/") == nil then filename = "l10n/DEFAULT/" .. filename end @@ -68,15 +69,16 @@ end -- -- 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:NewTransmission(filename, frequency, mod, power) - self.FileName = RADIO.VerifyFile(filename) - if frequency ~= nil then +function RADIO:NewGenericTransmission(filename, frequency, mod, power) + self:F2({self, filename, frequency, mod, power}) + self.FileName = RADIO:VerifyFileName(filename) + if frequency ~= "" then self.Frequecy = frequency * 1000 -- Convert to Hz end - if mod ~= nil then + if mod ~= 3 then self.Modulation = mod end - if power ~= nil then + if power ~= 0 then self.Power = power end return self @@ -96,21 +98,22 @@ end -- -- but it will work for any POSITIONABLE -- -- Only the RADIO and the Filename are mandatory -- -- Loop : O is no loop, 1 is loop -function RADIO:NewTransmissionForUnit(filename, subtitle, subtitleDuraction, frequency, mod, loop) - self.FileName = RADIO.VerifyFile(filename) - if subtitle ~= nil then +function RADIO:NewUnitTransmission(filename, subtitle, subtitleDuration, frequency, mod, loop) + self:F2({filename, subtitle, subtitleDuration, frequency, mod, loop}) + self.FileName = RADIO:VerifyFileName(filename) + if subtitle ~= "" then self.Subtitle = subtitle end - if subtitleDuration ~= nil then + if subtitleDuration ~= 0 then self.SubtitleDuration = subtitleDuration end - if frequency ~= nil then - self.Frequecy = frequency * 1000 -- Convert to Hz + if frequency ~= 0 then + self.Frequency = frequency * 1000 -- Convert to Hz end - if mod ~= nil then + if mod ~= 3 then self.Modulation = mod end - if loop ~= nil then + if loop ~= 3 then self.Loop = loop end return self @@ -127,13 +130,14 @@ end -- -- 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 function - if Positionable.ClassName == "UNIT" or Positionable.ClassName == "GROUP" then + if self.Positionable.ClassName == "UNIT" or self.Positionable.ClassName == "GROUP" then -- If the user didn't change the frequency, he wants to use the on defined in the Mission Editor. -- Else we set the frequency of the UNIT or the GROUP in DCS - if self.Frequency == 0 then - self.Positionable:GetDCSUnit():getController():setCommand({ - id = 'SetFrequency', + if self.Frequency ~= 0 then + self.Positionable:GetDCSObject():getController():setCommand({ + id = "SetFrequency", params = { frequency = self.Frequency, modulation = self.Modulation, @@ -141,7 +145,7 @@ function RADIO:Broadcast() }) end - self.Positionable:GetDCSUnit():getController():setCommand({ + self.Positionable:GetDCSObject():getController():setCommand({ id = "TransmitMessage", params = { file = self.FileName, @@ -152,7 +156,7 @@ function RADIO:Broadcast() }) else -- If the POSITIONABLE is anything else, we revert to the general function - trigger.action.radioTransmission(ClassName, self.Positionable:PositionVec3(), Modulation, 1, Frequency, Power) + trigger.action.radioTransmission(self.FileName, self.Positionable:PositionVec3(), self.Modulation, 1, self.Frequency, self.Power) end return self end diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index b9acd2e5a..537750cfe 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -433,10 +433,10 @@ function POSITIONABLE:Message( Message, Duration, Name ) end --- Create a @{Radio#RADIO}, to allow radio transmission for this POSITIONABLE --- Set parameters with the methods provided, then use @{Radio#RADIO.Broadcast} to actually broadcast the message --- @param self --- @return #RADIO +-- Set parameters with the methods provided, then use RADIO:Broadcast() to actually broadcast the message +-- @param #POSITIONABLE self +-- @return #RADIO Radio function POSITIONABLE:GetRadio() - local Radio = RADIO.New(self) - return Radio -end \ No newline at end of file + self:F2(self) + return RADIO:New(self) +end diff --git a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua index 585ab52c8..ca3f7a692 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20170308_1432' ) +env.info( 'Moose Generation Timestamp: 20170308_2255' ) local base = _G diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 585ab52c8..ca3f7a692 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20170308_1432' ) +env.info( 'Moose Generation Timestamp: 20170308_2255' ) local base = _G diff --git a/Moose Test Missions/RAD - Radio/RAD-000 - Radio Test Mission/RAD-000 - Radio Test Mission.lua b/Moose Test Missions/RAD - Radio/RAD-000 - Radio Test Mission/RAD-000 - Radio Test Mission.lua index a6d95fd13..6f3d42910 100644 --- a/Moose Test Missions/RAD - Radio/RAD-000 - Radio Test Mission/RAD-000 - Radio Test Mission.lua +++ b/Moose Test Missions/RAD - Radio/RAD-000 - Radio Test Mission/RAD-000 - Radio Test Mission.lua @@ -1,6 +1,18 @@ +BASE:TraceAll(1) +BASE:TraceLevel(3) local Player = UNIT:FindByName("Player") -Player:MessageToAll("MainScript Started", 10, "") +Player:MessageToAll("MainScript Started 2", 10, "") -local PlayerRadio = Player:GetRadio() -PlayerRadio:NewTransmission("Noise.ogg", "Subtitle", 10, 251000, 0, 0) -PlayerRadio:Broadcast() \ No newline at end of file +local Transmiter = UNIT:FindByName("Transmiter") + +local TransmiterRadio = Transmiter:GetRadio() +TransmiterRadio:NewUnitTransmission("Noise.ogg", "Subtitle", 10, 251000, 0, 0) +TransmiterRadio:E({ + TransmiterRadio.Positionable, + TransmiterRadio.FileName, + TransmiterRadio.Subtitle, + TransmiterRadio.SubtitleDuration, + TransmiterRadio.Frequency, + TransmiterRadio.Modulation, + }) +TransmiterRadio:Broadcast() \ No newline at end of file diff --git a/Moose Test Missions/RAD - Radio/RAD-000 - Radio Test Mission/RAD-000 - Radio Test Mission.miz b/Moose Test Missions/RAD - Radio/RAD-000 - Radio Test Mission/RAD-000 - Radio Test Mission.miz index 96df0b963b491d940b484574bf8de4a8459b7cad..99472ddb6824f86e8db1f9763c1909c902edbd65 100644 GIT binary patch delta 5519 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 A&j0`b delta 4796 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 C{(;H>