2025-09-08 00:35:54 +02:00

834 lines
41 KiB
Lua

-- Do not edit this line or the following line
-- assert(loadfile("C:\\Users\\Taco\\Documents\\Github\\SoundHandler\\SoundHandlerByTaco.lua"))()
MESSAGE:New("*SOUNDHANDLER 0.1 LOADING*", 5, "MISSION", false):ToAll():ToLog()
Soundhandler_options = {
["SoundsToGroupOnly"] = true,
["ShipSamSounds"] = false,
["RedShootingSounds"] = true,
["Debug"] = false
}
-----------------------------------------------------------------------------------------------------------------------------------
-- USER SETTINGS
-----------------------------------------------------------------------------------------------------------------------------------
-- On/Off?
SoundHandler = true
-- Do you want ALL Clients to hear sounds, or only those associated with the sound event?
SoundOnlyToGroup = Soundhandler_options
.SoundsToGroupOnly -- true means only the affected group will hear the sound. False will play to all. If no valid group is associated with the EVENT, sound will play to all.
-- Quick fix: SAMs and Red Missiles will play to Target Group ONLY
-- Do you want ship firing SAMs to play SAM Sounds?
ShipSamSounds = Soundhandler_options.ShipSamSounds -- true means they will play sounds with each missile launched
-- Do you want red airplanes to play sounds when they fire their gun cannons?
PlayRedShootingGuns = Soundhandler_options.RedShootingSounds -- true means they will play sounds with each gun burst
-----------------------------------------------------------------------------------------------------------------------------------
-- DEBUG
-----------------------------------------------------------------------------------------------------------------------------------
SoundDebug = Soundhandler_options.Debug -- Will enable messages on-screen and in log
if SoundDebug then
trigger.action.outText("---SOUND DEBUG IS ON!---", 10)
if SoundHandler then
trigger.action.outText("Soundhandler ON!", 10)
else
trigger.action.outText("Soundhandler OFF!", 10)
end
if SoundOnlyToGroup then
trigger.action.outText("Sounds will only play to the involved GROUP", 10)
else
trigger.action.outText("Sounds will play to ALL Clients", 10)
end
if ShipSamSounds then
trigger.action.outText("Ships firing SAMs will play sounds", 10)
else
trigger.action.outText("Ships firing SAMs will NOT play sounds", 10)
end
if PlayRedShootingGuns then
trigger.action.outText("Red Airplane Gun Bursts will play sounds", 10)
else
trigger.action.outText("Red Airplane Gun Bursts will NOT play sounds", 10)
end
end
-- Debug output to DCS log
env.info("--------- SoundsToGroupOnly=" .. tostring(SoundOnlyToGroup) ..
" | ShipSamSounds=" .. tostring(ShipSamSounds) ..
" | RedShootingSounds=" .. tostring(PlayRedShootingGuns) ..
" | Debug=" .. tostring(SoundDebug))
-----------------------------------------------------------------------------------------------------------------------------------
-- SOUNDS FILEPATH
-----------------------------------------------------------------------------------------------------------------------------------
SoundFilePath = ""
-----------------------------------------------------------------------------------------------------------------------------------
-- SOUND FILES
-----------------------------------------------------------------------------------------------------------------------------------
-- Global Sound Tables (make sure you have all these files, named exactly like these, loaded into the .mix file)
Sounds = {}
-- A2A Kill Sound Table
Sounds.Air_Unit_Sound_Table = { "AAGoodKill", "AAKill4", "AAKillGoodhiton1", "AAKillSplash", "AAKillSplashone",
"AASplashOne", "AASplashOne_2" }
-- Red Jet Missile Sound Table
Sounds.RedMissile_Sound_Table = { "Misil1", "Misil2", "Misil3", "Misil4", "Misil5", "Misil6" }
-- Red Ground Unit Dead Sound Table
Sounds.Ground_Unit_Sound_Table = { "AGKillBOOM1", "AGKillCOMEONBABY", "AGKillGoodBOOM", "AGKillSeeTheSmoke",
"AGKill_TARGET_DESTROYED", "AGKillBeautiful_beautiful", "AGKillMotherFucker" }
-- SAM Sound Table
Sounds.SamSoundTable = { "SAM1", "SAM2", "SAM3", "SAM4", "SAM5", "SAM6", "SAM7", "Defending", "Singer" }
-- Balistic Missile Launch Table
Sounds.Ballistic = { "SCUD_Long", "Fireball" }
-- AGM_154 Sound Table
Sounds.PigsAway_Sound_Table = { "PigsAway", "PigsAway2" }
-- Paveway_Sound_Table for LGBs
Sounds.Paveway_Sound_Table = { "Paveway" }
-- Bruiser Sound Table for Harpoons
Sounds.Bruiser_Sound_Table = { "Bruiser", "Bruiser2", "Bruiser3" }
-- Fox 2 Sound Table
Sounds.Fox2_Sound_Table = { "Fox2A", "Fox2B", "Fox2C", "Fox2D", "Fox2E" }
-- Fox 3 Sound Table
Sounds.Fox3_Sound_Table = { "Fox3A", "Fox3B", "Fox3C", "Fox3D", "Fox3E", "Fox3F" }
-- Fox 1 Sound Table
Sounds.Fox1_Sound_Table = { "Fox1A", "Fox1B" }
-- Magnum Sound Table
Sounds.Magnum_Sound_Table = { "Magnum", "Magnum2" }
-- Rifle Sound Table
Sounds.Rifle_Sound_Table = { "RifleA", "RifleB", "RifleC", "RifleD", "RifleE" }
-- Pickle Sound Table
Sounds.Pickle_Sound_Table = { "Pickle1", "Pickle2", "Pickle3", "Pickle4", "Pickle5", "Pickle6", "Pickle7" }
-- Blue Air Unit Dead Sound Table
Sounds.Blue_Air_Unit_Sound_Table = { "OhJesus", "SOS_Beacon", "HitEjecting1", "HitEjecting2", "HitEjecting3" } -- just for fun
-- Blue Guns Sounds
Sounds.Blue_Guns_Table = { "BlueGuns1", "BlueGuns2", "BlueGuns3" }
-- Red Guns Sounds
Sounds.Red_Guns_Table = { "Guns_Break_Right", "Guns_Break_Left" }
-- Blue Decoy Sounds
Sounds.Decoy_Table = { "A2G_Duck1" }
-- Blue Cruise Missile Sounds
Sounds.CruiseMissile_Table = { "A2G_Greyhound1" }
-- Red Anti-Ship Missile Sounds
Sounds.Vampires_Table = { "A2G_Vampires1" }
-- Blue Tomahawk/Ship-Launched Cruise Missile Sounds
Sounds.Tomahawk_Table = { "S2G_Tomahawk1" }
-- Friendly Fire Sounds
Sounds.Friendly_Fire_Table = { "FriendlyFire1", "FriendlyFire2" }
-- Friendly SAM Sounds
Sounds.Friendly_SAM_Table = { "BirdsAway" }
-----------------------------------------------------------------------------------------------------------------------------------
-- PRINT SOUNDS
-----------------------------------------------------------------------------------------------------------------------------------
if SoundDebug then
for _, tbl in pairs(Sounds) do
local txt = UTILS.OneLineSerialize(tbl)
env.info("EventData Debug: " .. txt)
trigger.action.outText("Sounds Loaded: " .. txt, 10)
end
end
-----------------------------------------------------------------------------------------------------------------------------------
-- EVENT HANDLERS
-----------------------------------------------------------------------------------------------------------------------------------
EventHandler = EVENTHANDLER:New()
EventHandler:HandleEvent(EVENTS.Shot)
EventHandler:HandleEvent(EVENTS.Kill)
EventHandler:HandleEvent(EVENTS.Dead)
-----------------------------------------------------------------------------------------------------------------------------------
-- KILL EVENTS
-----------------------------------------------------------------------------------------------------------------------------------
function EventHandler:OnEventKill(EventData)
-- UTILS.PrintTableToLog(EventData)
if SoundHandler then
if SoundDebug then
BASE:I("---------KILL DETECTED: EVALUATING FOR COALITION & TYPE----------")
BASE:I(EventData)
end
-- KILL SECTION (BLUE KILLS RED)
if EventData.IniCoalition == coalition.side.BLUE or EventData.TgtCoalition == coalition.side.RED then
if SoundDebug then BASE:I("BLUE UNIT KILLED RED...") end
if (EventData.TgtCategory == 0 or EventData.TgtCategory == 1) and EventData.TgtObjectCategory == 1 and
GROUP:FindByName(EventData.IniGroupName):IsAirPlane() then -- 0 is plane, 1 is helo https://wiki.hoggitworld.com/view/DCS_Class_Unit
if SoundDebug then BASE:I("...AIRPLANE") end
random_Air_Unit_Sound = Sounds.Air_Unit_Sound_Table[math.random(1, #Sounds.Air_Unit_Sound_Table)]
local Air_Unit_Sound_Ogg = random_Air_Unit_Sound .. ".ogg"
-- Sound Chosen
RedA2ASound = USERSOUND:New(SoundFilePath .. Air_Unit_Sound_Ogg)
-- Determine who to play sound to
if EventData.IniGroup and SoundOnlyToGroup then
local SoundGroup = EventData.IniGroup
if SoundDebug then
BASE:I("-----SOUNDFILE PLAYED is " ..
random_Air_Unit_Sound .. " TO " .. SoundGroup:GetName())
end
RedA2ASound:ToGroup(SoundGroup)
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Air_Unit_Sound .. " TO " ..
SoundGroup:GetName(), 10)
end
else
RedA2ASound:ToCoalition(coalition.side.BLUE)
if SoundDebug then BASE:I("-----SOUNDFILE PLAYED is " .. random_Air_Unit_Sound .. " TO ALL-----") end
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Air_Unit_Sound .. " TO ALL", 10)
end
end
end
if EventData.IniGroupName then -- If we don't have an IniGroupName, then don't proceed
if EventData.TgtCategory == 2 and EventData.IniCoalition ~= EventData.TgtCoalition and
GROUP:FindByName(EventData.IniGroupName):IsAirPlane() and EventData.TgtObjectCategory == 1 then -- TgtCategory 2 is Ground, TgtObjectCategory is Unit
if SoundDebug then BASE:I("...GROUND UNIT (KILLED BY A BLUE AIRPLANE)") end
math.random()
random_Ground_Unit_Sound = Sounds.Ground_Unit_Sound_Table[math.random(1,
#Sounds.Ground_Unit_Sound_Table)]
local Ground_Unit_Sound_Ogg = random_Ground_Unit_Sound .. ".ogg"
-- Sound Chosen
RedGroundKillSound = USERSOUND:New(SoundFilePath .. Ground_Unit_Sound_Ogg)
-- Determine who to play sound to
if EventData.IniGroup and SoundOnlyToGroup then
local SoundGroup = EventData.IniGroup
BASE:I("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO " .. SoundGroup:GetName())
RedGroundKillSound:ToGroup(SoundGroup)
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO " ..
SoundGroup:GetName(), 10)
end
else
RedGroundKillSound:ToCoalition(coalition.side.BLUE)
BASE:I("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO ALL-----")
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO ALL",
10)
end
end
end
else
env.info("-----No EventData.IniGroupName-----")
end
if EventData.IniGroupName then -- If we don't have an IniGroupName, then don't proceed
if EventData.TgtCategory == 3 and EventData.TgtObjectCategory == 1 and
GROUP:FindByName(EventData.IniGroupName):IsAirPlane() then -- 3 is Ship
BASE:I("...SHIP")
math.random()
random_Ground_Unit_Sound = Sounds.Ground_Unit_Sound_Table[math.random(1,
#Sounds.Ground_Unit_Sound_Table)]
local Ground_Unit_Sound_Ogg = random_Ground_Unit_Sound .. ".ogg"
-- Sound Chosen
RedGroundKillSound = USERSOUND:New(SoundFilePath .. Ground_Unit_Sound_Ogg)
-- Determine who to play sound to
if EventData.IniGroup and SoundOnlyToGroup then
local SoundGroup = EventData.IniGroup
BASE:I("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO " .. SoundGroup:GetName())
RedGroundKillSound:ToGroup(SoundGroup)
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO " ..
SoundGroup:GetName(), 10)
end
else
RedGroundKillSound:ToCoalition(coalition.side.BLUE)
BASE:I("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO ALL-----")
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO ALL",
10)
end
end
end
else
env.info("-----No EventData.IniGroupName-----")
end
end
-- Blue Dead, and/or Initiated by Red, and its a Plane
if (EventData.IniCoalition == coalition.side.RED and EventData.TgtCoalition == coalition.side.BLUE) and
EventData.TgtCategory == 0 then
if EventData.TgtGroupName then
BASE:I("---------BLUE UNIT GOT KILLED---------(" .. EventData.TgtGroupName .. ")")
else
BASE:I("---------BLUE UNIT GOT KILLED--------- (No Name)")
end
random_Blue_Air_Unit_Sound = Sounds.Blue_Air_Unit_Sound_Table[math.random(1,
#Sounds.Blue_Air_Unit_Sound_Table)]
local Blue_Air_Unit_Sound_Ogg = random_Blue_Air_Unit_Sound .. ".ogg"
A2GSound = USERSOUND:New(SoundFilePath .. Blue_Air_Unit_Sound_Ogg)
A2GSound:ToCoalition(coalition.side.BLUE)
BASE:I("---------SOUNDFILE PLAYED---------is " .. Blue_Air_Unit_Sound_Ogg)
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Blue_Air_Unit_Sound_Ogg .. " TO ALL", 10)
end
end
-- Blue Dead, and Initiated by Blue, and its a Plane
if (EventData.IniCoalition == coalition.side.BLUE and EventData.TgtCoalition == coalition.side.BLUE) and
EventData.TgtCategory == 0 then
if EventData.TgtGroupName then
BASE:I("---------BLUE ON BLUE---------(" .. EventData.TgtGroupName .. ")")
else
BASE:I("---------BLUE ON BLUE--------- (No Name)")
end
random_Friendly_Fire_Sound = Sounds.Friendly_Fire_Table[math.random(1, #Sounds.Friendly_Fire_Table)]
local Friendly_Fire_Sound_Ogg = random_Friendly_Fire_Sound .. ".ogg"
FFSound = USERSOUND:New(SoundFilePath .. Friendly_Fire_Sound_Ogg)
if EventData.IniGroup and SoundOnlyToGroup then
local SoundGroup = EventData.IniGroup
BASE:I("-----SOUNDFILE PLAYED is " .. random_Friendly_Fire_Sound .. " TO " .. SoundGroup:GetName())
FFSound:ToGroup(SoundGroup)
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Friendly_Fire_Sound .. " TO " ..
SoundGroup:GetName(), 10)
end
else
FFSound:ToCoalition(coalition.side.BLUE)
BASE:I("-----SOUNDFILE PLAYED is " .. random_Friendly_Fire_Sound .. " TO ALL-----")
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Friendly_Fire_Sound .. " TO ALL", 10)
end
end
end
end -- end of If SoundHandler
end -- KILL EventHandler Function End
-----------------------------------------------------------------------------------------------------------------------------------
-- DEAD EVENTS
-----------------------------------------------------------------------------------------------------------------------------------
function EventHandler:OnEventDead(EventData)
if SoundHandler then
if SoundDebug then
BASE:I("---------DEAD DETECTED: EVALUATING FOR COALITION & TYPE----------")
BASE:I(EventData)
end
-- STATIC SECTION
if EventData.IniObjectCategory == 3 then -- STATIC DEAD
if EventData.IniCoalition == 1 then -- RED STATIC DEAD
BASE:I("RED STATIC DEAD")
random_Ground_Unit_Sound =
Sounds.Ground_Unit_Sound_Table[math.random(1, #Sounds.Ground_Unit_Sound_Table)]
local Ground_Unit_Sound_Ogg = random_Ground_Unit_Sound .. ".ogg"
-- Sounnd Chosen
RedStaticKillSound = USERSOUND:New(SoundFilePath .. Ground_Unit_Sound_Ogg)
-- Determine who to play sound to
if EventData.IniGroup and SoundOnlyToGroup then
local SoundGroup = EventData.IniGroup
BASE:I("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO " .. SoundGroup:GetName())
RedStaticKillSound:ToGroup(SoundGroup)
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO " ..
SoundGroup:GetName(), 10)
end
elseif not EventData.IniGroup and SoundOnlyToGroup then
env.info("-----NO EventData.IniGroup Available-----")
end
if not SoundOnlyToGroup then
env.info("-----SOUND INTENDED FOR ALL-----")
RedStaticKillSound:ToCoalition(coalition.side.BLUE)
BASE:I("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO ALL-----")
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. random_Ground_Unit_Sound .. " TO ALL", 10)
end
end
end
if EventData.IniCoalition == 2 then -- BLUE STATIC DEAD
-- Consider if we want sounds for this
BASE:I("---------BLUE STATIC DEAD, NO SOUND FOR NOW----------")
end
end -- Static Logic End
end -- End of If Soundhandler
end -- DEAD EventHandler Function End
-----------------------------------------------------------------------------------------------------------------------------------
-- SHOT EVENTS
-----------------------------------------------------------------------------------------------------------------------------------
function EventHandler:OnEventShot(EventData)
if SoundDebug then
BASE:I("---------SHOT DETECTED: EVALUATING FOR COALITION & WEAPON----------")
-- UTILS.PrintTableToLog(EventData)
BASE:I(EventData)
end
math.random()
local WeaponDesc = EventData.Weapon:getDesc()
if SoundDebug then
BASE:I({ WeaponDesc })
end
local Brevity = "none"
soundDelay = false
if SoundHandler then
-- Weapon data.
local _weapon = EventData.Weapon:getTypeName() -- should be the same as Event.WeaponTypeName
local _weaponStrArray = UTILS.Split(_weapon, "%.")
local _weaponName = _weaponStrArray[#_weaponStrArray]
-- Weapon descriptor.
local desc = EventData.Weapon:getDesc()
-- Weapon category: 0=SHELL, 1=MISSILE, 2=ROCKET, 3=BOMB (Weapon.Category.X)
local weaponcategory = desc.category
local weaponguidance = WeaponDesc.guidance
-- Debug info.
if SoundDebug then
BASE:I("-----PREPARING GENERAL SHOT INFORMATION...------")
if EventData.IniUnitName then
BASE:I("EVENT SHOT: Ini unit = " .. EventData.IniUnitName)
end
if EventData.IniGroupName then
BASE:I("EVENT SHOT: Ini group = " .. EventData.IniGroupName)
end
BASE:I("EVENT SHOT: Weapon type = " .. _weapon)
BASE:I("EVENT SHOT: Weapon name = " .. _weaponName)
if weaponcategory then
BASE:I("EVENT SHOT: Weapon category = " .. weaponcategory)
else
BASE:I('NO WEAPON CATEGORY VALUE')
end
if weaponguidance then
BASE:I("EVENT SHOT: Weapon guidance = " .. weaponguidance)
else
BASE:I('NO WEAPON GUIDANCE VALUE')
end
end
-- Blue and a SAM
if EventData.IniCoalition == 2 and GROUP:FindByName(EventData.IniGroupName):IsSAM() then
BASE:I("BLUE SAM SHOT CONFIRMED")
RandomBlueSamSound = Sounds.Friendly_SAM_Table[math.random(1, #Sounds.Friendly_SAM_Table)]
Brevity = tostring(RandomBlueSamSound)
BASE:I("---------RANDOM FRIENDLY SAM SOUND IS " .. Brevity)
end
-- Blue and an Airplane
if EventData.IniCoalition == 2 and GROUP:FindByName(EventData.IniGroupName):IsAirPlane() then
BASE:I("BLUE AIRPLANE SHOT CONFIRMED")
-- We want a specific sound for a glide weapon, so it needs to be added manually.
if _weapon == "AGM_154" or _weapon == "AGM_154A" then
math.random()
RandomPigsAwaySound = Sounds.PigsAway_Sound_Table[math.random(1, #Sounds.PigsAway_Sound_Table)]
Brevity = tostring(RandomPigsAwaySound)
BASE:I("---------RANDOM PIGS AWAY SOUND IS " .. Brevity)
-- DCS mis-classifies the GBU_32_V_2B, so it needs to be added manually.
-- Duck for ADMs
elseif string.find(_weapon, "ADM", 1, true) then
math.random()
RandomDuckSound = Sounds.Decoy_Table[math.random(1, #Sounds.Decoy_Table)]
Brevity = tostring(RandomDuckSound)
BASE:I("---------RANDOM DUCK SOUND IS " .. Brevity)
elseif WeaponDesc.category == 3 and WeaponDesc.guidance == 1 or _weapon == "GBU_32_V_2B" or
string.find(_weapon, "MK", 1, true) or string.find(_weapon, "ROCKEYE", 1, true) then
math.random()
math.random()
RandomPickleSound = Sounds.Pickle_Sound_Table[math.random(1, #Sounds.Pickle_Sound_Table)]
Brevity = tostring(RandomPickleSound)
BASE:I("---------RANDOM PICKLE SOUND (3, 1, Specific) IS " .. Brevity)
elseif WeaponDesc.category == 3 and WeaponDesc.guidance == 7 then
-- LASER GUIDED SOUND TABLES
math.random()
RandomPavewaySound = Sounds.Paveway_Sound_Table[math.random(1, #Sounds.Paveway_Sound_Table)]
Brevity = tostring(RandomPavewaySound)
BASE:I("---------RANDOM PAVEWAY SOUND IS " .. Brevity)
-- DCS mis-classifies the Harpoon, so it needs to be added manually.
elseif _weapon == "AGM_84D" then
math.random()
RandomBruiserSound = Sounds.Bruiser_Sound_Table[math.random(1, #Sounds.Bruiser_Sound_Table)]
Brevity = tostring(RandomBruiserSound)
BASE:I("---------RANDOM BRUISER SOUND IS " .. Brevity)
-- Cruise Missiles are "Greyhound".
elseif _weapon == "AGM_84H" or string.find(_weapon, "84E", 1, true) then
math.random()
RandomGreyhoundSound = Sounds.CruiseMissile_Table[math.random(1, #Sounds.CruiseMissile_Table)]
Brevity = tostring(RandomGreyhoundSound)
BASE:I("---------RANDOM GREYHOUND SOUND IS " .. Brevity)
elseif WeaponDesc.category == 1 and WeaponDesc.guidance == 2 then
math.random()
RandomFox2Sound = Sounds.Fox2_Sound_Table[math.random(1, #Sounds.Fox2_Sound_Table)]
Brevity = tostring(RandomFox2Sound)
BASE:I("---------FOX 2 SOUND----------" .. Brevity)
elseif WeaponDesc.category == 1 and WeaponDesc.guidance == 3 then
math.random()
RanddomFox3Sound = Sounds.Fox3_Sound_Table[math.random(1, #Sounds.Fox3_Sound_Table)]
Brevity = tostring(RanddomFox3Sound)
BASE:I("---------FOX 3 SOUND----------" .. Brevity)
elseif WeaponDesc.category == 1 and WeaponDesc.guidance == 4 then
math.random()
RanddomFox1Sound = Sounds.Fox1_Sound_Table[math.random(1, #Sounds.Fox1_Sound_Table)]
Brevity = tostring(RanddomFox1Sound)
BASE:I("---------Fox 1 SOUND----------")
elseif WeaponDesc.category == 1 and WeaponDesc.guidance == 5 and WeaponDesc.missileCategory == 6 then
RandomMagnumSound = Sounds.Magnum_Sound_Table[math.random(1, #Sounds.Magnum_Sound_Table)]
Brevity = tostring(RandomMagnumSound)
BASE:I("---------MAGNUM SOUND IS " .. Brevity)
elseif WeaponDesc.category == 1 and WeaponDesc.guidance == 7 or string.find(_weapon, "65", 1, true) then
math.random()
RandomRifleSound = Sounds.Rifle_Sound_Table[math.random(1, #Sounds.Rifle_Sound_Table)]
Brevity = tostring(RandomRifleSound)
BASE:I("---------RIFLE SOUND (Includes Zuni Rockets)----------")
-- "0" = Shells
elseif WeaponDesc.category == 0 then
math.random()
RandomRifleSound = Sounds.Rifle_Sound_Table[math.random(1, #Sounds.Rifle_Sound_Table)]
Brevity = tostring(RandomRifleSound)
BASE:I("---------GUNS SOUND----------")
-- If we still don't know what kind it is, and its a missile, let's call it a Rifle
elseif WeaponDesc.category == 1 then
math.random()
RandomRifleSound = Sounds.Rifle_Sound_Table[math.random(1, #Sounds.Rifle_Sound_Table)]
Brevity = tostring(RandomRifleSound)
BASE:I("---------RIFLE SOUND (UNKNOWN MISSILE)----------")
-- Rockets = Rifle (for lack of a better brevity code)
elseif WeaponDesc.category == 2 then
math.random()
RandomRifleSound = Sounds.Rifle_Sound_Table[math.random(1, #Sounds.Rifle_Sound_Table)]
Brevity = tostring(RandomRifleSound)
BASE:I("---------ROCKET SOUND (RIFLE FOR NOW))----------")
-- If we still don't know what kind it is, and its a bomb, let's call it a Pickle
elseif WeaponDesc.category == 3 then
math.random()
RandomPickleSound = Sounds.Pickle_Sound_Table[math.random(1, #Sounds.Pickle_Sound_Table)]
Brevity = tostring(RandomPickleSound)
BASE:I("---------RANDOM PICKLE (UNKNOWN) SOUND IS " .. Brevity)
end
end
if EventData.IniCoalition == 2 and GROUP:FindByName(EventData.IniGroupName):IsShip() then
BASE:I("BLUE NAVAL SHOT CONFIRMED")
if string.find(_weapon, "BGM_109B", 1, true) then
RandomTomahawkSound = Sounds.Tomahawk_Table[math.random(1, #Sounds.Tomahawk_Table)]
Brevity = tostring(RandomTomahawkSound)
BASE:I("---------BLUE TOMAHAWK SOUND IS: " .. Brevity)
end
end
-- LOGIC FOR RED AIRPLANE SHOTS
-- if Red and an Airplane
if EventData.IniCoalition == 1 and GROUP:FindByName(EventData.IniGroupName):IsAirPlane() then
BASE:I("RED PLANE SHOT CONFIRMED")
soundDelay = true
BASE:I("DELAY ACTIVATED")
if WeaponDesc.category == 1 and WeaponDesc.guidance == 2 then
RandomRedMissileSound = Sounds.RedMissile_Sound_Table[math.random(1, #Sounds.RedMissile_Sound_Table)]
Brevity = tostring(RandomRedMissileSound)
BASE:I("---------RED MISSILE (Fox2) SOUND----------" .. Brevity)
elseif WeaponDesc.category == 1 and WeaponDesc.guidance == 3 then
RandomRedMissileSound = Sounds.RedMissile_Sound_Table[math.random(1, #Sounds.RedMissile_Sound_Table)]
Brevity = tostring(RandomRedMissileSound)
BASE:I("---------RED MISSILE (Fox2) SOUND----------" .. Brevity)
elseif WeaponDesc.category == 1 and WeaponDesc.guidance == 4 then
RandomRedMissileSound = Sounds.RedMissile_Sound_Table[math.random(1, #Sounds.RedMissile_Sound_Table)]
Brevity = tostring(RandomRedMissileSound)
BASE:I("---------RED MISSILE (Fox1) SOUND----------")
elseif (WeaponDesc.category == 1 and WeaponDesc.missileCategory == 4) or
string.find(_weapon, "X_22", 1, true) or string.find(_weapon, "X_35", 1, true) or
string.find(_weapon, "X_31A", 1, true) or string.find(_weapon, "YJ_83K", 1, true) or
string.find(_weapon, "YJ_12", 1, true) or _weapon == "AGM_84D" then
RandomRedAntiShipSound = Sounds.Vampires_Table[math.random(1, #Sounds.Vampires_Table)]
Brevity = tostring(RandomRedAntiShipSound)
BASE:I("---------RED VAMPIRES SOUND----------")
end -- End of Red Shot Classification
end -- End of Red Aerial Shot Logic
-- LOGIC FOR RED GROUND MISSILES
if ShipSamSounds then
if EventData.IniCoalition == 1 and
(GROUP:FindByName(EventData.IniGroupName):IsGround() or
GROUP:FindByName(EventData.IniGroupName):IsShip()) and WeaponDesc.category == 1 and
not string.find(_weapon, "SA48N6", 1, true) and not string.find(_weapon, "SCUD_RAKETA", 1, true) then
BASE:I("RED GROUND OR SHIP SHOT CONFIRMED")
soundDelay = true
BASE:I("DELAY ACTIVATED")
-- if string.find(_weapon, "SA48N6", 1, true) then
-- BASE:I("-----WEAPON SOUND KNOWN BUT SUPPRESSED-----")
-- BASE:I("DELAY ACTIVATED, BUT NO SOUND")
-- end
RandomSamSound = Sounds.SamSoundTable[math.random(1, #Sounds.SamSoundTable)]
Brevity = tostring(RandomSamSound)
BASE:I("---------RED SAM SOUND----------" .. Brevity)
end
else
if EventData.IniCoalition == 1 and GROUP:FindByName(EventData.IniGroupName):IsGround() and
WeaponDesc.category == 1 and not string.find(_weapon, "SA48N6", 1, true) and
not string.find(_weapon, "SCUD_RAKETA", 1, true) then
BASE:I("RED GROUND (NOT SHIP) SHOT CONFIRMED")
soundDelay = true
BASE:I("DELAY ACTIVATED")
-- if string.find(_weapon, "SA48N6", 1, true) then
-- BASE:I("-----WEAPON SOUND KNOWN BUT SUPPRESSED-----")
-- end
if string.find(_weapon, "SCUD_RAKETA", 1, true) then
BASE:I("-----SCUD LAUNCH (NO SOUND PROGRAMMED)-----")
end
RandomSamSound = Sounds.SamSoundTable[math.random(1, #Sounds.SamSoundTable)]
Brevity = tostring(RandomSamSound)
BASE:I("---------RED SAM SOUND----------" .. Brevity)
end
end
-- LOGIC FOR RED SCUD / BALLISTIC MISSILE LAUNCHES
-- if Red and an Airplane
if EventData.IniCoalition == 1 and string.find(_weapon, "SCUD_RAKETA", 1, true) then
BASE:I("RED SCUD LAUNCH CONFIRMED")
RandomBallisticMissileSound = Sounds.Ballistic[math.random(1, #Sounds.Ballistic)]
Brevity = tostring(RandomBallisticMissileSound)
BASE:I("---------RED BALLISTIC MISSILE SOUND----------" .. Brevity)
end -- End of Red Scud Launch
-- Let's put it into Sound
if Brevity ~= "none" then
BASE:I("-----soundDelay value = " .. tostring(soundDelay) .. "-----")
-- Its a Blue Weapon Event
if EventData.IniCoalition == 2 and EventData.IniGroup then
local BrevitySound = Brevity .. ".ogg"
WeaponSound = USERSOUND:New(SoundFilePath .. BrevitySound)
-- Determine Who to Play Sound to
if SoundOnlyToGroup then
local SoundGroup = EventData.IniGroup
WeaponSound:ToGroup(SoundGroup)
if SoundDebug then
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO " .. SoundGroup:GetName())
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO " .. SoundGroup:GetName(),
10)
end
else
WeaponSound:ToCoalition(coalition.side.BLUE)
if SoundDebug then
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO ALL")
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO ALL", 10)
end
end
end
-- Excluded Sounds, sounds we want to play to all Blue clients regardless of who fires
if EventData.IniCoalition == 2 and EventData.IniGroup:IsShip() then
WeaponSound:ToCoalition(coalition.side.BLUE)
if SoundDebug then
BASE:I("--------- (EXCLUDED EVENT) SOUNDFILE PLAYED---------is " .. Brevity .. " TO ALL")
end
end
-- Its a Red Weapon Event (SAM, on incoming missile)
if EventData.IniCoalition == 1 then
env.info("-----Red Shot-----")
if EventData.TgtGroup then
env.info("-----TargetGroup Object Available-----")
local BrevitySound = Brevity .. ".ogg"
WeaponSound = USERSOUND:New(SoundFilePath .. BrevitySound)
local function DelayedSound()
local SoundGroup = EventData.TgtGroup
if SoundGroup then
WeaponSound:ToGroup(SoundGroup)
end
end
local soundDelayTime = math.random(3, 7)
env.info("-----soundDelayTime =" .. soundDelayTime .. "-----")
TIMER:New(DelayedSound):Start(soundDelayTime)
if SoundDebug then
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO " .. SoundGroup:GetName() ..
" ONLY")
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO " .. SoundGroup:GetName(),
10)
end
-- Sound can play if its SCUD (but not other un-guided things like Artillery)
elseif string.find(_weapon, "SCUD_RAKETA", 1, true) then
env.info("-----TargetGroup Object NOT Available Sound ToAll(Must be a SCUD) -----")
local BrevitySound = Brevity .. ".ogg"
WeaponSound = USERSOUND:New(SoundFilePath .. BrevitySound)
WeaponSound:ToCoalition(coalition.side.BLUE)
if SoundDebug then
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO All")
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO All", 10)
end
end
end -- End of Red Shot Event
end -- Sound Action End
soundDelay = false -- reset value
if SoundDebug then
env.info("-----soundDelay value reset to false-----")
end
else
env.info("-----SOUNDHANDLER OFF------")
end
end -- Function End
BASE:I("-----MISSILE/BOMB SOUNDS SET------")
-----------------------------------------------------------------------------------------------------------------------------------
-- SHOOTING (RAPID FIRE) EVENT
-----------------------------------------------------------------------------------------------------------------------------------
ShootingEventHandler = EVENTHANDLER:New()
ShootingEventHandler:HandleEvent(EVENTS.ShootingStart)
function ShootingEventHandler:OnEventShootingStart(EventData)
if SoundDebug then
BASE:I("-----RAPID GUNS SHOOTING START, EVALUATING------")
end
local txt = UTILS.OneLineSerialize(EventData)
env.info("Guns Shooting EventData Debug: " .. txt)
local ShooterGroupName = EventData.IniGroupName
local ShooterUnitName = EventData.IniUnitName
if ShooterGroupName ~= nil and ShooterUnitName ~= nil then
ShooterGroup = GROUP:FindByName(ShooterGroupName)
ShooterUnit = UNIT:FindByName(ShooterUnitName)
end
if ShooterGroup:IsAirPlane() and ShooterUnit:IsClient() then
BASE:I("BLUE AIRPLANE GUNS DETECTED (FROM CLIENT)")
math.random()
Blue_Guns_Sound = Sounds.Blue_Guns_Table[math.random(1, #Sounds.Blue_Guns_Table)]
Brevity = tostring(Blue_Guns_Sound)
BASE:I("---------RANDOM BLUE GUNS SOUND SELECTED IS: " .. Brevity)
local GunsSound = Brevity .. ".ogg"
-- Sound Chosen
GunsSound = USERSOUND:New(SoundFilePath .. GunsSound)
-- Determine Who to Play Sound to
if SoundOnlyToGroup and EventData.IniGroup then
local SoundGroup = EventData.IniGroup
GunsSound:ToGroup(SoundGroup)
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO " .. SoundGroup:GetName())
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO " .. SoundGroup:GetName(), 10)
end
else
GunsSound:ToCoalition(coalition.side.BLUE)
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO ALL")
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO ALL", 10)
end
end
end
if ShooterGroup:IsAirPlane() and EventData.IniCoalition == 1 and PlayRedShootingGuns then
BASE:I("-----RED AIRPLANE GUNS DETECTED (AT CLIENT)------")
math.random()
Red_Guns_Sound = Sounds.Red_Guns_Table[math.random(1, #Sounds.Red_Guns_Table)]
Brevity = tostring(Red_Guns_Sound)
BASE:I("---------RANDOM RED GUNS SOUND SELECTED IS: " .. Brevity)
local GunsSound = Brevity .. ".ogg"
-- Sound Chosen
GunsSound = USERSOUND:New(SoundFilePath .. GunsSound)
-- Determine Who to Play Sound to
if SoundOnlyToGroup and EventData.TgtGroup then
local SoundGroup = EventData.TgtGroup
GunsSound:ToGroup(SoundGroup)
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO " .. SoundGroup:GetName())
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO " .. SoundGroup:GetName(), 10)
end
else
GunsSound:ToCoalition(coalition.side.BLUE)
BASE:I("---------SOUNDFILE PLAYED---------is " .. Brevity .. " TO ALL")
if SoundDebug then
trigger.action.outText("-----SOUNDFILE PLAYED is " .. Brevity .. " TO ALL", 10)
end
end
end
end
BASE:I("-----GUN SHOOTING SOUNDS SET------")
-----------------------------------------------------------------
-- MENU FOR SETTINGS
-----------------------------------------------------------------
-- PARENT MENU ENTRY
local SettingsMenu = MENU_MISSION:New("SoundHandler Settings")
-- Toggle Debug On/Off
local function SoundhandlerOnOff(boolean)
SoundHandler = boolean
env.info("-----SoundHandler On = " .. tostring(boolean) .. "-----")
if boolean == true then
trigger.action.outText("**Soundhandler ON**", 5)
end
if boolean == false then
trigger.action.outText("--Soundhandler OFF--", 5)
end
end
local OnOrOff = MENU_MISSION:New("On or Off", SettingsMenu)
local SoundHandlerOn = MENU_MISSION_COMMAND:New("On", OnOrOff, SoundhandlerOnOff, true) -- #MENU
local SoundHandlerOff = MENU_MISSION_COMMAND:New("Off", OnOrOff, SoundhandlerOnOff, false) -- #MENU
-- Toggle Debug On/Off
local function SwitchDebug(boolean)
SoundDebug = boolean
env.info("-----SoundDebug Now = " .. tostring(boolean) .. "-----")
end
local SoundDebugMenu = MENU_MISSION:New("Sound Debug", SettingsMenu)
local SoundDebugMenuTrue = MENU_MISSION_COMMAND:New("On", SoundDebugMenu, SwitchDebug, true) -- #MENU
local SoundDebugMenuFalse = MENU_MISSION_COMMAND:New("Off", SoundDebugMenu, SwitchDebug, false) -- #MENU
-- Switch To Whom Sounds Play To
local function SwitchSoundsToGroup(boolean)
SoundOnlyToGroup = boolean
env.info("-----SoundOnlyToGroup Now = " .. tostring(boolean) .. "-----")
if boolean == true then
-- trigger.action.outText("**Sounds Play To Group Only**", 5)
end
if boolean == false then
trigger.action.outText("--Sounds Play To All--", 5)
end
end
local SoundsToGroupAll = MENU_MISSION:New("Sounds To Group or All", SettingsMenu)
local GroupTrue = MENU_MISSION_COMMAND:New("Play Sounds to Group Only", SoundsToGroupAll, SwitchSoundsToGroup, true) -- #MENU
local GroupFalse = MENU_MISSION_COMMAND:New("Play Sounds to All", SoundsToGroupAll, SwitchSoundsToGroup, false) -- #MENU
BASE:I("-----SOUNDHANDLER SETTING SET------")
MESSAGE:New("*SOUNDHANDLER LOADED*", 5, "MISSION", false):ToAll():ToLog()