diff --git a/DCS_Syria/Battle for Rayak Valley/Carrier_Layouts.lua b/DCS_Syria/Battle for Rayak Valley/Carrier_Layouts.lua index 1345f76..dff0946 100644 --- a/DCS_Syria/Battle for Rayak Valley/Carrier_Layouts.lua +++ b/DCS_Syria/Battle for Rayak Valley/Carrier_Layouts.lua @@ -1,8 +1,16 @@ -- This script takes Layouts orginally created by Redkite: https://www.youtube.com/user/RedKiteRender/ -- and rotates through the layouts to spawn them on the carrier deck. -- Adds a menu item to clear the deck of all spawned objects. +-- Adds menu items to spawn the layouts on the deck. + +local RotateLayoutInterval = 900 -- Time in seconds to rotate through the layouts + +local shipName = "CVN-72 Abraham Lincoln" -- Replace with the actual name of your ship +local shipUnit = Unit.getByName(shipName) +shipID = shipUnit:getID() +env.info(shipName .. ": " .. shipID) + -local RotateLayoutInterval = 300 -- Time in seconds to rotate through the layouts local function CarrierCleanDeck() @@ -2555,6 +2563,7 @@ local carrierLayouts = { local currentLayoutIndex = 1 + local function cycleCarrierLayouts() -- Clean the deck before changing the layout CarrierCleanDeck() @@ -2568,12 +2577,40 @@ local function cycleCarrierLayouts() -- Move to the next layout in the list currentLayoutIndex = currentLayoutIndex % #carrierLayouts + 1 - -- Schedule the next execution in 15 minutes (900 seconds) + -- Schedule the next layout change timer.scheduleFunction(cycleCarrierLayouts, nil, timer.getTime() + RotateLayoutInterval) end -- Start the cycle cycleCarrierLayouts() -CarrierMenu = MENU_MISSION:New("Carrier Operations", missionMenu) -CarrierLayoutCleanDeck = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Clear Deck", CarrierMenu, CarrierCleanDeck) \ No newline at end of file +CarrierMenu = MENU_MISSION:New("Carrier Operations", missionMenu) +CarrierLayouts = MENU_MISSION:New("Carrier Layouts", CarrierMenu) + +CarrierLayoutCleanDeck = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Total Clear Deck", CarrierLayouts, CarrierCleanDeck) +CarrierClearDeck8Spawns = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Clear Deck 8 Spawns", CarrierLayouts, CarrierClearDeck8Spawns) +CarrierBlockedDeck8Spawns = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Blocked Deck 8 Spawns", CarrierLayouts, CarrierBlockedDeck8Spawns) +CarrierClearDeck4Spawns = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Clear Deck 4 Spawns", CarrierLayouts, CarrierClearDeck4Spawns) +CarrierBlockedDeck4Spawns = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Blocked Deck 4 Spawns", CarrierLayouts, CarrierBlockedDeck4Spawns) +CarrierCleanDeck16Spawns = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Clean Deck 16 Spawns", CarrierLayouts, CarrierCleanDeck16Spawns) +CarrierBlockedDeck16Spawns = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Blocked Deck 16 Spawns", CarrierLayouts, CarrierBlockedDeck16Spawns) +CarrierMassRecoveryCat2Tomcats = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Mass Recovery Cat 2 Tomcats", CarrierLayouts, CarrierMassRecoveryCat2Tomcats) + +CarrierChangeIntervalMenu = MENU_MISSION:New("Change Rotate Interval", CarrierLayouts) + +-- Function to change the rotate layout interval +local function ChangeRotateLayoutInterval(newIntervalMinutes) + RotateLayoutInterval = newIntervalMinutes * 60 -- Convert minutes to seconds + MESSAGE:New("Rotate layout interval set to " .. newIntervalMinutes .. " minutes.", 15):ToAll() +end + + -- Add the menu items to change the interval +CarrierChangeInterval15 = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Set Rotate Interval to 15 Minutes", CarrierChangeIntervalMenu, ChangeRotateLayoutInterval, 15) +CarrierChangeInterval30 = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Set Rotate Interval to 30 Minutes", CarrierChangeIntervalMenu, ChangeRotateLayoutInterval, 30) +CarrierChangeInterval60 = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Set Rotate Interval to 60 Minutes", CarrierChangeIntervalMenu, ChangeRotateLayoutInterval, 60) +CarrierChangeInterval120 = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Set Rotate Interval to 2 Hours", CarrierChangeIntervalMenu, ChangeRotateLayoutInterval, 120) +CarrierChangeInterval240 = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Set Rotate Interval to 4 Hours", CarrierChangeIntervalMenu, ChangeRotateLayoutInterval, 240) +CarrierChangeInterval480 = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Set Rotate Interval to 8 Hours", CarrierChangeIntervalMenu, ChangeRotateLayoutInterval, 480) + + + diff --git a/DCS_Syria/Battle for Rayak Valley/F99th-Battle for Rayak Valley-1.0.7.miz b/DCS_Syria/Battle for Rayak Valley/F99th-Battle for Rayak Valley-1.0.7.miz new file mode 100644 index 0000000..81b19a7 Binary files /dev/null and b/DCS_Syria/Battle for Rayak Valley/F99th-Battle for Rayak Valley-1.0.7.miz differ diff --git a/DCS_Syria/Battle for Rayak Valley/Moose_Awacs.lua b/DCS_Syria/Battle for Rayak Valley/Moose_Awacs.lua index a826187..92a7e90 100644 --- a/DCS_Syria/Battle for Rayak Valley/Moose_Awacs.lua +++ b/DCS_Syria/Battle for Rayak Valley/Moose_Awacs.lua @@ -1,9 +1,6 @@ -BlueAWACS = SPAWN:New("BLUE EWR AWACS") - :InitLimit(1, 99) - :InitRepeatOnLanding() - :SpawnScheduled(30, 0.5) + RedAWACS = SPAWN:New("RED EWR AWACS") :InitLimit(1, 99) diff --git a/DCS_Syria/Battle for Rayak Valley/Moose_BattleForRayakValley.lua b/DCS_Syria/Battle for Rayak Valley/Moose_BattleForRayakValley.lua index ed21e59..6fa5573 100644 --- a/DCS_Syria/Battle for Rayak Valley/Moose_BattleForRayakValley.lua +++ b/DCS_Syria/Battle for Rayak Valley/Moose_BattleForRayakValley.lua @@ -12,10 +12,7 @@ local RedDefaultCAP = 1 local BlueA2ADefaultOverhead = 1 local BlueDefaultCAP = 1 -local shipName = "CVN-72 Abraham Lincoln" -- Replace with the actual name of your ship -local shipUnit = Unit.getByName(shipName) -shipID = shipUnit:getID() -env.info(shipName .. ": " .. shipID) + -- Create the main mission menu. missionMenu = MENU_MISSION:New("Mission Menu") @@ -52,7 +49,7 @@ BLUEA2ADispatcher:SetDefaultLandingAtRunway() BLUEA2ADispatcher:SetDefaultTakeoffInAir() BLUEA2ADispatcher:SetTacticalDisplay(TAC_DISPLAY) BLUEA2ADispatcher:SetDefaultFuelThreshold( 0.20 ) -BLUEA2ADispatcher:SetRefreshTimeInterval( 300 ) +BLUEA2ADispatcher:SetRefreshTimeInterval( 900 ) BLUEA2ADispatcher:SetDefaultOverhead(BlueA2ADefaultOverhead) BLUEA2ADispatcher:SetDisengageRadius( 100000 ) BLUEA2ADispatcher:SetEngageRadius( 50000 ) @@ -64,7 +61,7 @@ RedA2ADispatcher:SetDefaultLandingAtRunway() RedA2ADispatcher:SetDefaultTakeoffInAir() RedA2ADispatcher:SetTacticalDisplay(TAC_DISPLAY) RedA2ADispatcher:SetDefaultFuelThreshold( 0.20 ) -RedA2ADispatcher:SetRefreshTimeInterval( 300 ) +RedA2ADispatcher:SetRefreshTimeInterval( 900 ) RedA2ADispatcher:SetDefaultOverhead(RedA2ADefaultOverhead) RedA2ADispatcher:SetDisengageRadius( 100000 ) RedA2ADispatcher:SetEngageRadius( 50000 ) diff --git a/DCS_Syria/Battle for Rayak Valley/Moose_CTLD.lua b/DCS_Syria/Battle for Rayak Valley/Moose_CTLD.lua index 2faafa4..3d48f59 100644 --- a/DCS_Syria/Battle for Rayak Valley/Moose_CTLD.lua +++ b/DCS_Syria/Battle for Rayak Valley/Moose_CTLD.lua @@ -166,8 +166,8 @@ red_ctld:AddCratesCargo("T-90",{"Red-T90"},CTLD_CARGO.Enum.VEHICLE, 1, 8500, 25) blue_ctld:AddCratesCargo("M1A2",{"Blue-M1A2"},CTLD_CARGO.Enum.VEHICLE, 1, 8500, 25) -- Add FOBs -red_ctld:AddCratesCargo("Forward Ops Base",{"Red-FOB"},CTLD_CARGO.Enum.FOB, 4, 500, 3) -blue_ctld:AddCratesCargo("Forward Ops Base",{"Blue-FOB"},CTLD_CARGO.Enum.FOB, 4, 500, 3) +red_ctld:AddCratesCargo("Forward Ops Base",{"Red-FOB"},CTLD_CARGO.Enum.FOB, 4, 500, 5) +blue_ctld:AddCratesCargo("Forward Ops Base",{"Blue-FOB"},CTLD_CARGO.Enum.FOB, 4, 500, 5) -- AA Crates red_ctld:AddCratesCargo("SA-8",{"SA8"},CTLD_CARGO.Enum.CRATE, 4, 500, 10) diff --git a/DCS_Syria/Battle for Rayak Valley/Moose_DynamicGroundBattle.lua b/DCS_Syria/Battle for Rayak Valley/Moose_DynamicGroundBattle.lua index 27d4078..9beabd6 100644 --- a/DCS_Syria/Battle for Rayak Valley/Moose_DynamicGroundBattle.lua +++ b/DCS_Syria/Battle for Rayak Valley/Moose_DynamicGroundBattle.lua @@ -1,7 +1,7 @@ --[[ Script: Moose_DynamicGroundBattle.lua Written by: [F99th-TracerFacer] - Version: 1.0.3 + Version: 1.0.4 Date: 11 November 2024 Updated: 12 Dec 2024 Description: This script creates a dynamic ground battle between Red and Blue coalitions @@ -98,7 +98,7 @@ -- Due to some maps or locations where infantry moving is either not desired or has problems with the terrain you can disable infantry moving patrols. -- Set to false, infantry units will spawn, and never move from their spawn location. This could be considered a defensive position and probably a good idea. -local ENABLE_CAPTURE_ZONE_MESSAGES = false -- Enable or disable attack messages when a zone is attacked. +local ENABLE_CAPTURE_ZONE_MESSAGES = true -- Enable or disable attack messages when a zone is attacked. local MOVING_ARMOR_PATROLS = true -- Units with armor will move to patrol zones if set to true. (default is true) local MOVING_INFANTRY_PATROLS = false -- Units with infantry will not move to patrol zones if set to false. (default is false, to many moving units can cause performance issues) local MOVING_UNITS_CAP = 10 -- Too many moving ground units can cause performance issues. @@ -316,13 +316,13 @@ local function addMarkPoints(warehouses, coalition) if warehouse:GetCoalition() == 2 then details = "Warehouse: " .. warehouse:GetName() .. "\nThis warehouse needs to be protected.\n" else - details = "Warehouse: " .. warehouse:GetName() .. "\nThis is a primary target as it is directly supplying enemy units.\n" + details = "Warehouse: " .. warehouse:GetName() .. "\nThis is a primary target! Reduce the enmey capacity to replenish their units!\n" end elseif coalition == 1 then if warehouse:GetCoalition() == 1 then - details = "Warehouse: " .. warehouse:GetName() .. "\nThis warehouse needs to be protected.\nNearby Units:\n" + details = "Warehouse: " .. warehouse:GetName() .. "\nThis warehouse needs to be protected.\n" else - details = "Warehouse: " .. warehouse:GetName() .. "\nThis is a primary target as it is directly supplying enemy units.\n" + details = "Warehouse: " .. warehouse:GetName() .. "\nThis is a primary target! Reduce the enmey capacity to replenish their units!\n" end end else @@ -381,14 +381,14 @@ function ZONE_CAPTURE_COALITION:OnEnterCaptured(From, Event, To) if Coalition == coalition.side.BLUE then self:UndrawZone() self:DrawZone(-1, {0, 0, 1}, 2) -- Draw the zone on the map for 30 seconds, blue color, and thickness 2 - if ENABLE_CAPTURE_ZONE_MESSAGES == true - MESSAGE:New(string.format("%s has been captured by the USA", zoneName)), 6):ToAll() + if ENABLE_CAPTURE_ZONE_MESSAGES == true then + MESSAGE:New(string.format("%s has been captured by the USA", self:GetZoneName()), 6):ToAll() end else self:UndrawZone() self:DrawZone(-1, {1, 0, 0}, 2) -- Draw the zone on the map for 30 seconds, red color, and thickness 2 - if ENABLE_CAPTURE_ZONE_MESSAGES == true - MESSAGE:New(string.format("%s has been captured by Russia", zoneName)), 6):ToAll() + if ENABLE_CAPTURE_ZONE_MESSAGES == true then + MESSAGE:New(string.format("%s has been captured by Russia", self:GetZoneName()), 6):ToAll() end end end @@ -743,6 +743,7 @@ local function AssignTasks(group, zoneStates) group:PatrolZones(patrolZones, speed, formation, delayMin, delayMax) movingUnitsCount = movingUnitsCount + 1 -- Increment the counter when a unit starts moving + MESSAGE:New("Moving Units Count: " .. movingUnitsCount, 10):ToAll() else env.info("AssignTasks: No suitable zone found for group " .. group:GetName()) end @@ -752,11 +753,23 @@ end -- Function to decrement the moving units counter when a unit stops moving local function OnUnitStopMoving() movingUnitsCount = movingUnitsCount - 1 + MESSAGE:New("Moving Units Count: " .. movingUnitsCount, 10):ToAll() end -- Function to spawn infantry units from a template at a given location -local function SpawnInfantryAtLocation(location) - local spawnTemplate = SPAWN:New("InfantryTemplate") -- Replace "InfantryTemplate" with your actual template name +local function SpawnInfantryAtLocation(location, coalition) + local spawnTemplateName + + if coalition == coalition.side.RED then + spawnTemplateName = "RedInfantry1" -- Replace with your actual red coalition template name + elseif coalition == coalition.side.BLUE then + spawnTemplateName = "BlueInfantry1" -- Replace with your actual blue coalition template name + else + env.info("SpawnInfantryAtLocation: Invalid coalition") + return + end + + local spawnTemplate = SPAWN:New(spawnTemplateName) spawnTemplate:SpawnFromCoordinate(location) end @@ -765,19 +778,21 @@ local function OnUnitReachedLastWaypoint(unit) OnUnitStopMoving() local unitCoordinate = unit:GetCoordinate() - SpawnInfantryAtLocation(unitCoordinate) + local unitCoalition = unit:GetCoalition() + SpawnInfantryAtLocation(unitCoordinate, unitCoalition) end --- Event handler for waypoint reached +-- Create an event handler class local EventHandler = EVENTHANDLER:New() +-- Define the event handler function for waypoint reached function EventHandler:OnEventWaypointReached(EventData) if EventData and EventData.IniUnit then OnUnitReachedLastWaypoint(EventData.IniUnit) end end --- Set up the event handler globally +-- Set up the event handler to handle the WaypointReached event EventHandler:HandleEvent(EVENTS.WaypointReached) -- Function to check if a group contains infantry units diff --git a/DCS_Syria/Battle for Rayak Valley/Moose_NavalGroup.lua b/DCS_Syria/Battle for Rayak Valley/Moose_NavalGroup.lua new file mode 100644 index 0000000..ca3810b --- /dev/null +++ b/DCS_Syria/Battle for Rayak Valley/Moose_NavalGroup.lua @@ -0,0 +1,201 @@ +-- Expected Behavior +-- CVN Will patrol designated patrol zones. Staying in the zone assigned. +-- Player can designate which zone to move to. +-- Plyaer can request turning into the wind. +-- After turning into the wind, CVN should return to orignal coord then resume waypoints. + + -- + --- +local msgTime = 15 +local SetCVNActivePatrolZone = 1 --if active waypoint is 1, steam between 1 and 2, if active is 2, steam between 2 and 3. + + +local CVN_carrier_group = GROUP:FindByName("CVN-72 Abraham Lincoln Carrier Group") -- put the exact GROUP name of your carrier-group as set in the mission editor within the " " +local CVN_beacon_unit = UNIT:FindByName("CVN-72 Abraham Lincoln")-- -- put the exact UNIT name of your carrier-unit as set in the mission editor within the " " +local CVN_ICLS_Channel = 1 -- replace with the ICLS channel you want +local CVN_ICLS_Name = "CVN" -- put the 3-letter ICLS identifier you want to use for the ICLS channel +local CVN_TACAN_Channel = 72 -- replace with the TACAN channel you want +local CVN_TACAN_Name = "CVN" -- put the 3-letter TACAN identifier you want to use for the TACAN channel +local CVN_RecoveryWindowTime = 20 -- time in minutes for how long recovery will be open, feel free to change the number + + +-- Functions to move ship to designated waypoint/zones +local msgCVNPatrol = "Sending Carrier Group to Patrol Zone: " +function SetCVNWayPoint1() + SetCVNActivePatrolZone = 1 + MESSAGE:New(msgCVNPatrol .. SetCVNActivePatrolZone, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + BlueCVNGroup:GotoWaypoint(1) +end + +function SetCVNWayPoint2() + SetCVNActivePatrolZone = 2 + MESSAGE:New(msgCVNPatrol .. SetCVNActivePatrolZone, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + BlueCVNGroup:GotoWaypoint(3) +end + +function SetCVNWayPoint3() + SetCVNActivePatrolZone = 3 + MESSAGE:New(msgCVNPatrol .. SetCVNActivePatrolZone, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + BlueCVNGroup:GotoWaypoint(5) +end + + +if CVN_beacon_unit then + BlueCVNGroup_Beacon = CVN_beacon_unit:GetBeacon() + BlueCVNGroup_Beacon:ActivateICLS(CVN_ICLS_Channel,CVN_ICLS_Name) +end +SCHEDULER:New(nil,function() + if CVN_beacon_unit then + BlueCVNGroup_Beacon = CVN_beacon_unit:GetBeacon() + BlueCVNGroup_Beacon:ActivateTACAN(CVN_TACAN_Channel,"X",CVN_TACAN_Name,true) + end +end,{},5,5*60) + +-- Function to turn ship into the wind. +function start_recovery() + + if BlueCVNGroup:IsSteamingIntoWind() == true then + MESSAGE:New(CVN_beacon_unit:GetName() .. " is currently launching/recovering aircraft, currently active recovery window closes at time " .. timerecovery_end, msgTime, "CVNNAVINFO",false):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + else + local timenow=timer.getAbsTime( ) + local timeend=timenow+CVN_RecoveryWindowTime*60 -- this sets the recovery window to 45 minutes, you can change the numbers as you wish + local timerecovery_start = UTILS.SecondsToClock(timenow,true) + timerecovery_end = UTILS.SecondsToClock(timeend,true) + BlueCVNGroup:AddTurnIntoWind(timerecovery_start,timerecovery_end,25,true,-9) + MESSAGE:New(CVN_beacon_unit:GetName().." is turning into the wind to begin " .. CVN_RecoveryWindowTime .. " mins of aircraft operations.\nLaunch/Recovery Window will be open from time " .. timerecovery_start .. " until " .. timerecovery_end, msgTime, "CVNNAVINFO",false):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end +end + + + + BlueAwacs = nil + Spawn_US_AWACS = SPAWN:New("BLUE EWR AWACS") + :InitLimit(1,500) + :InitRepeatOnLanding() + + :OnSpawnGroup( function (SpawnGroup) + BlueAwacs = SpawnGroup + end + ):SpawnScheduled(30,.5) + +function ResetAwacs() + BlueAwacs:Destroy() + MESSAGE:New("Resetting AWACS...", msgTime, "CVNNAVINFO",false):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) +end + +-- Build the Menu +local CarrierMovement = MENU_COALITION:New(coalition.side.BLUE, "Carrier Movement", CarrierMenu) +MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CVN Group - Patrol Zone 1", CarrierMovement, SetCVNWayPoint1) +MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CVN Group - Patrol Zone 2", CarrierMovement, SetCVNWayPoint3) +MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CVN Group - Patrol Zone 3", CarrierMovement, SetCVNWayPoint5) +MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Reset AWACS", CarrierMovement,ResetAwacs) +MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Launch/Recover Aircraft (Turn carrier into the wind)", CarrierMovement, start_recovery) + + + + + + + +-- Create a NAVYGROUP object and activate the late activated group. +BlueCVNGroup=NAVYGROUP:New("CVN-72 Abraham Lincoln Carrier Group") +BlueCVNGroup:SetVerbosity(1) +BlueCVNGroup:MarkWaypoints() + + + +--- Function called each time the group passes a waypoint. +function BlueCVNGroup:OnAfterPassingWaypoint(From, Event, To, Waypoint) + local waypoint=Waypoint --Ops.OpsGroup#OPSGROUP.Waypoint + + -- Debug info. + local text=string.format(CVN_beacon_unit:GetName().." passed waypoint ID=%d (Index=%d) %d times", waypoint.uid, BlueCVNGroup:GetWaypointIndex(waypoint.uid), waypoint.npassed) + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + env.info(text) +--- Patrol zone 1 + if SetCVNActivePatrolZone == 1 and waypoint == 1 then + BlueCVNGroup:GotoWaypoint(2) + end + + if SetCVNActivePatrolZone == 1 and waypoint == 2 then + BlueCVNGroup:GotoWaypoint(1) + end +---- Patrol zone 2 + if SetCVNActivePatrolZone == 2 and waypoint == 3 then + BlueCVNGroup:GotoWaypoint(4) + end + + if SetCVNActivePatrolZone == 2 and waypoint == 4 then + BlueCVNGroup:GotoWaypoint(3) + end +---- Patrol Zone 3 + if SetCVNActivePatrolZone == 3 and waypoint == 5 then + BlueCVNGroup:GotoWaypoint(6) + end + + if SetCVNActivePatrolZone == 3 and waypoint == 6 then + BlueCVNGroup:GotoWaypoint(5) + end + +end + +--- Function called when the group is cruising. This is the "normal" state when the group follows its waypoints. +function BlueCVNGroup:OnAfterCruise(From, Event, To) + local text=CVN_beacon_unit:GetName().." is cruising straight and steady." + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + env.info(text) +end + +--- Function called when the groups starts to turn. +function BlueCVNGroup:OnAfterTurningStarted(From, Event, To) + local text=CVN_beacon_unit:GetName().." has started turning!" + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + env.info(text) +end + +--- Function called when the group stopps to turn. +function BlueCVNGroup:OnAfterTurningStopped(From, Event, To) + local text=CVN_beacon_unit:GetName().." has stopped turning..proceeding to next waypoint." + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + env.info(text) +end + +-- Turn the carrier into the wind for a few mins +function + BlueCVNGroup:AddTurnIntoWind() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) +end + + + +-- Monitor entering and leaving zones. +local ZoneSet=SET_ZONE:New():FilterPrefixes("CVN Patrol"):FilterOnce() + +-- Set zones which are checked if the group enters or leaves it. +BlueCVNGroup:SetCheckZones(ZoneSet) + +--- Function called when the group enteres a zone. +function BlueCVNGroup:OnAfterEnterZone(From, Event, To, Zone) + local text=string.format(CVN_beacon_unit:GetName().." has entered patrol zone %s.", Zone:GetName()) + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + env.info(text) +end + +--- Function called when the group leaves a zone. +function BlueCVNGroup:OnAfterLeaveZone(From, Event, To, Zone) + local text=string.format(CVN_beacon_unit:GetName().." left patrol zone %s.", Zone:GetName()) + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + env.info(text) +end \ No newline at end of file diff --git a/resume.lua b/resume.lua new file mode 100644 index 0000000..33cc5f3 --- /dev/null +++ b/resume.lua @@ -0,0 +1,60 @@ +Kenneth “Scott” Kalous +kskalous@gmail.com • (945) 260-5398 • https://www.linkedin.com/in/kenneth-kalous-821a8b26/ + +Professional Summary +Results-driven IT professional with over 20 years of experience in managing and supporting Windows Server operating systems and infrastructure. Proven expertise in SCCM and Adaptiva, providing enterprise-level solutions for a global organization supporting 250,000+ devices. Adept at implementing scalable IT infrastructure, optimizing system performance, and driving operational efficiency. + +Key Skills + • SCCM and Adaptiva Design and Administration. + • Windows Server Management (2008/2012/2016/2019/2022) + • IT Infrastructure Design & Optimization + • Patch Management & Software Deployment + • Active Directory & Group Policy Administration + • C#, SQL, PowerShell Scripting & Automation + • Incident & Problem Management (ITIL Framework) + • Global IT Operations Support + +Professional Experience +Senior Systems Advisor II +FedEx Services • 2016 – Current + • Team Lead on the design, implementation, administration and maintenance of a federated global SCCM and Adaptiva infrastructure environment. + • Ensured seamless operations for over 250,000 devices world wide supporting several hundred windows system administrators in diverse locations around the world. + • Streamlined software distribution processes, reducing deployment times by 30% through effective SCCM and Adaptiva configurations. + • Developed and maintained PowerShell scripts to automate repetitive tasks, improving team efficiency by 25%. + • Collaborated with cross-functional teams to implement a comprehensive patch management strategy, achieving a 99% compliance rates. + • Provided Tier 3 support for complex IT issues, resolving 95% of incidents within SLA. + • Spearheaded the migration of legacy Windows Server systems to newer versions, enhancing system reliability and security. + • Trained junior IT staff on Windows Server management, SCCM, Adaptiva and troubleshooting best practices. + +IT Systems Administrator +FedEx Services • 2005 – 2016 + • Managed a Windows Server environment supporting 50,000+ users, ensuring 99.9% up-time. + • Implemented Group Policy Objects (GPOs) to standardize user environments and enforce security measures. + • Coordinated server patching and upgrades, minimizing downtime and ensuring system compliance. + • Trained junior IT staff on Windows Server management and troubleshooting best practices. + • Analyzed system performance metrics, recommending and implementing upgrades that improved efficiency by 20%. + +IT Support Specialist +Kinko’s Office & Print • 2001 – 2005 + • Provided desktop and server support for Windows environments, resolving hardware and software issues efficiently. + • Assisted in the roll-out of a new Active Directory structure, improving authentication and resource management. + • Maintained detailed documentation for all IT processes and configurations, facilitating knowledge transfer. + • Delivered exceptional end-user support, achieving a 98% satisfaction rate in customer surveys. + +United States Navy +Aviation Machinist Mate • 1990 – 2001 +After high school, I spent 10 years in the navy, working on airplanes mostly, but was always relied upon for my computer skills. The last 3 years of my Navy career was spent as an IT Support Specialist for a small squadron while stationed in Hawaii. + + + +Education + + + +Certifications + • Microsoft Certified: MCSE + + +Additional Information + • Available for relocation and willing to travel for business needs. + • Experience working in 24/7 high paced global support environments.