Jump to content

MOOSE - Mission Object Oriented Scripting Framework


Recommended Posts

Hello eric, just wanted to say thanks a bunch for resolving that problem. Seems to work fine now, it also help me to understand the language as well. I would however, like to know how to launch more than 1 aircraft. tried the syntax and could not get more than 1 aircraft to launch. just wondering if you know how to do that? I wont bother you after this...

 

Here's what I got son far.

 

A2ADispatcher:SetSquadron( "Sochi", AIRBASE.Caucasus.Sochi_Adler, { "DF CCCP MiG-21 01" }, 10 )

A2ADispatcher:SetSquadronGci( "Sochi", 900, 1200 )

A2ADispatcher:SetSquadronGrouping( "Sochi", 2 )

A2ADispatcher:SetSquadronTakeoffFromParkingCold( "Sochi" )

 

The only way I know is to use this..


[color=black][size=2]A2ADispatcher:SetSquadronOverhead( [/size][size=2][size=2]"Sochi"[/size][/size][size=2], [/size][size=2][size=2]2[/size][/size][size=2] )[/size][/color][/Code]

The number 2 is a modifier used with the number of detected planes.

 

So, in the test mission with the one F5 being detected you get this

1(Number detected planes) x 2 = 2 GCI planes launched.

 

 

And don't worry about asking the questions, trust me I have asked many..

Link to comment
Share on other sites

Having an issue where my if then statements are not working.

function BatumiResupply()
local side = BatumiFlagS:Get()
-- local supplies = BatumiFlagR:Get()
US_CC = COMMANDCENTER:New( GROUP:FindByName( "BLUEHQ" ), "USA HQ" )
US_CC:MessageTypeToCoalition( string.format( "%s is the side", BatumiFlagS:Get() ), MESSAGE.Type.Information )

if ( 1 == 1 ) then
 US_CC:MessageTypeToCoalition( "ROH ****" )
end

if BatumiFlagS:Is( 1 ) then
	US_CC:MessageTypeToCoalition( "Roger Resupply is on its way" )
else
	US_CC:MessageTypeToCoalition( "Roger Resupply is on its way22" )
end

end

 

As you can see im just using those messages as a debug. The first message is displayed when called but anything with if then does not work. I even tried doing

if 1 == 1 then 
  my message code
end

in triggers in the editor but nothing works.

Link to comment
Share on other sites

Having an issue where my if then statements are not working.

function BatumiResupply()
   local side = BatumiFlagS:Get()
   -- local supplies = BatumiFlagR:Get()
   US_CC = COMMANDCENTER:New( GROUP:FindByName( "BLUEHQ" ), "USA HQ" )
   US_CC:MessageTypeToCoalition( string.format( "%s is the side", BatumiFlagS:Get() ), MESSAGE.Type.Information )

   if ( 1 == 1 ) then
    US_CC:MessageTypeToCoalition( "ROH ****" )
   end

   if BatumiFlagS:Is( 1 ) then
       US_CC:MessageTypeToCoalition( "Roger Resupply is on its way" )
   else
       US_CC:MessageTypeToCoalition( "Roger Resupply is on its way22" )
   end

end

As you can see im just using those messages as a debug. The first message is displayed when called but anything with if then does not work. I even tried doing

if 1 == 1 then 
  my message code
end

in triggers in the editor but nothing works.

 

Have a look at this example:

 

self:GetCommandCenter():MessageTypeToCoalition( self:GetText() .. " has been completed! Good job guys!", MESSAGE.Type.Information )

 

 

You miss the second parameter, which uses an enumeration MESSAGE.Type.

 

I guess you're looking at flags, correct?

 

In order to ensure that you're understanding the errors that may happen when building your scripts, are you familiar with the tracing and debugging of your scripts? In order to provide some guidance, have a look at this explanation:

 

 

hope this helps

FC

[TABLE][sIGPIC][/sIGPIC]|

[/TABLE]

Link to comment
Share on other sites

Have a look at this example:

 

self:GetCommandCenter():MessageTypeToCoalition( self:GetText() .. " has been completed! Good job guys!", MESSAGE.Type.Information )

 

 

You miss the second parameter, which uses an enumeration MESSAGE.Type.

 

Thanks for the reply really appreciate it that’s probaly the reason why my if then did not work I’ll have to test it when I get home. If you don’t mind I just have two more questions then I’m done bothering you haha.

1. How do I script waypoints as in add them mid mission. I tried a couple methods in your scripts and looked at some examples but having a hard time understanding. I think I used buildwp function, move to zone function and one more can’t think of it. I get the unit to move to a location but can’t make them go from there as in add another waypoint.

 

2. How do I have a repeating script. So if I’m checking for a condition I want the script to repeat every 10 seconds and once the condition is met run my code and exit it. In other scripting language it looks somthing like this

While {true} do 
{
If () exitwith { code }
Sleep 10
}

Link to comment
Share on other sites

Hello, I have a small problem...

 

I created RED interceptors groups with A2ADispatcher.

It works fine.

 

I wanted in the same time to have 2 BLUE F16 spawning and patroling a Patrol Zone, with an order to intercept only when RED would enter an Engage Zone.

 

 

My problem is that the F16 are landing after spawn... ?

 

The script for the BLUE separated from the RED A2ADispatcher is as follow:

 

CapPlane = SPAWN:New( "SQ NATO F-16" ):InitLimit( 2, 10 )
CapPlane:SpawnScheduled( 180,0 )

PatrolZone = ZONE_POLYGON:New( "PatrolZone", GROUP:FindByName( "CAP PatrolZone" ) )

AICapZone = AI_CAP_ZONE:New( PatrolZone, 8000, 10000, 600, 900 )

CapEngageZone = ZONE_POLYGON:New( "Engage Zone", GROUP:FindByName( "Engage Zone NTO" ) )
AICapZone:SetEngageZone( CapEngageZone )

AICapZone:SetControllable( CapPlane )

AICapZone:__Start( 1 ) -- They should statup, and start patrolling in the PatrolZone.

 

In ME the name "SQ NATO F-16", "CAP PatrolZone" and "Engage Zone NTO" are correct.

 

Any idea why the F16 do not rejoin their CAP PatrolZone ?

Link to comment
Share on other sites

You need to use OnSpawnGroup to catch when the F16 is spawned or respawned and then add to the CAPZONE. In your code you are attempting to add the F16 to the zone before it might even exist. Well, with yours probably the first one will work but any spawned via the schedule or due to InitLimit will not join. There should be examples out there using OnSpawnGroup for things like this.

 

Hello, I have a small problem...

 

I created RED interceptors groups with A2ADispatcher.

It works fine.

 

I wanted in the same time to have 2 BLUE F16 spawning and patroling a Patrol Zone, with an order to intercept only when RED would enter an Engage Zone.

 

 

My problem is that the F16 are landing after spawn... ?

 

The script for the BLUE separated from the RED A2ADispatcher is as follow:

 

CapPlane = SPAWN:New( "SQ NATO F-16" ):InitLimit( 2, 10 )
CapPlane:SpawnScheduled( 180,0 )

PatrolZone = ZONE_POLYGON:New( "PatrolZone", GROUP:FindByName( "CAP PatrolZone" ) )

AICapZone = AI_CAP_ZONE:New( PatrolZone, 8000, 10000, 600, 900 )

CapEngageZone = ZONE_POLYGON:New( "Engage Zone", GROUP:FindByName( "Engage Zone NTO" ) )
AICapZone:SetEngageZone( CapEngageZone )

AICapZone:SetControllable( CapPlane )

AICapZone:__Start( 1 ) -- They should statup, and start patrolling in the PatrolZone.

 

In ME the name "SQ NATO F-16", "CAP PatrolZone" and "Engage Zone NTO" are correct.

 

Any idea why the F16 do not rejoin their CAP PatrolZone ?

Link to comment
Share on other sites

Hi, thank you for the answer.

I'm a noob at coding so I tryied this

 

CapPlane = SPAWN
   :New( "SQ NATO F-16" )
   :InitLimit( 2, 10 )
   :SpawnScheduled( 180, 0 )
   :InitCleanUp( 300 )
   :OnSpawnGroup(
     function( SpawnGroup )
       PatrolZone = ZONE_POLYGON:New( "PatrolZone", GROUP:FindByName( "CAP PatrolZone" ) )
       AICapZone = AI_CAP_ZONE:New( PatrolZone, 8000, 10000, 600, 900 )
       CapEngageZone = ZONE_POLYGON:New( "Engage Zone", GROUP:FindByName( "Engage Zone NTO" ) )
       AICapZone:SetEngageZone( CapEngageZone )

       AICapZone:SetControllable( CapPlane )
       AICapZone:__Start( 1 ) -- They should statup, and start patrolling in the PatrolZone.
     end
    )

 

Of course i missed something cause it doesn't work...

Link to comment
Share on other sites

Try this. Note, I moved the ZONE and AI_CAP_ZONE to just be defined once ahead of time. And the SetControllable is set on the "group" passed into the function "SpawnGroup".

 

I also moved the SpawnScheduled to the end of the chain because I think it needs to be there as it will do the spawn. I could be wrong on that one. I'm now wondering if you need to move the __Start() to the top as well. If it doesn't work as is try that.

 

PatrolZone = ZONE_POLYGON:New( "PatrolZone", GROUP:FindByName( "CAP PatrolZone" ) )
AICapZone = AI_CAP_ZONE:New( PatrolZone, 8000, 10000, 600, 900 )
CapEngageZone = ZONE_POLYGON:New( "Engage Zone", GROUP:FindByName( "Engage Zone NTO" ) )
AICapZone:SetEngageZone( CapEngageZone )

CapPlane = SPAWN
   :New( "SQ NATO F-16" )
   :InitLimit( 2, 10 )
   :InitCleanUp( 300 )
   :OnSpawnGroup(
     function( SpawnGroup )
       AICapZone:SetControllable( SpawnGroup )
       AICapZone:__Start( 1 ) -- They should statup, and start patrolling in the PatrolZone.
     end
    )
    :SpawnScheduled( 180, 0 )

 

Hi, thank you for the answer.

I'm a noob at coding so I tryied this

 

CapPlane = SPAWN
   :New( "SQ NATO F-16" )
   :InitLimit( 2, 10 )
   :SpawnScheduled( 180, 0 )
   :InitCleanUp( 300 )
   :OnSpawnGroup(
     function( SpawnGroup )
       PatrolZone = ZONE_POLYGON:New( "PatrolZone", GROUP:FindByName( "CAP PatrolZone" ) )
       AICapZone = AI_CAP_ZONE:New( PatrolZone, 8000, 10000, 600, 900 )
       CapEngageZone = ZONE_POLYGON:New( "Engage Zone", GROUP:FindByName( "Engage Zone NTO" ) )
       AICapZone:SetEngageZone( CapEngageZone )

       AICapZone:SetControllable( CapPlane )
       AICapZone:__Start( 1 ) -- They should statup, and start patrolling in the PatrolZone.
     end
    )

 

Of course i missed something cause it doesn't work...

Link to comment
Share on other sites

It's better with the __start at the top.

 

The first F16 land after patrolling one or 2 random waypoints.

The 2nd F16 does it better, with a longer stay airborne.

 

Then i watched the 3rd and the 4th, and they did a nice patrol.

 

This is still a little buggy with the first plane, but it doesn't matter cause the CAP is done all the time at least by one plane.

 

Thks a lot!

Link to comment
Share on other sites

I am working on a training mission for myself and trying to learn the ME and MOOSE at the same time. But I have some problems I just cant figure out. I want to have some tankers and awacs that are always in the air. I have been looking at some tutorials and came up with the following.

 

 

 

 local SpawnTankerKC130_001 = SPAWN:New("Tanker KC-130W"):InitLimit( 1, 0 ):InitCleanUp( 60 )
 local SpawnTankerKC130_002 = SPAWN:New("Tanker KC-130E"):InitLimit( 1, 0 ):InitCleanUp( 60 )
 local SpawnTankerKC135_001 = SPAWN:New("Tanker KC-135"):InitLimit( 1, 0 ):InitCleanUp( 60 )
 local SpawnAWACS_001 = SPAWN:New("AWAC"):InitLimit( 1, 0 ):InitCleanUp( 60 )
 
 SpawnTankerKC130_001:InitRepeatOnEngineShutDown()
 SpawnTankerKC130_002:InitRepeatOnEngineShutDown()
 SpawnTankerKC135_001:InitRepeatOnEngineShutDown()
 SpawnAWACS_001:InitRepeatOnEngineShutDown()
 
 SpawnTankerKC130_001:SpawnScheduled( 30, 0 )
 SpawnTankerKC130_002:SpawnScheduled( 30, 0 )
 SpawnTankerKC135_001:SpawnScheduled( 30, 0 )
 SpawnAWACS_001:SpawnScheduled( 30, 0 )

 

 

 

The groups are each set to late activation

 

When I run this mission.

- All four spawn and when they die only two aircraft respawn and after they die nothing more happens.

- I have noticed that if the group name is "Tanker KC-130W" the script adds #001 in the end. So if I try to add escort from the ME they cant find the group they are supposed to escort because of the #001 added.

 

I also wanted to have a message display when the support aircraft arrive on station so I tried

local SupportGroup = GROUP:Find(...)
SupportGroup:MessageToAll( "On station", 20, "Arco" )

 

in do script on the waypoint but it wont work, it has worked before. Maybe adding CTLD and mist did something.

 

And I have different zones on the map where I have some enemy ground targets using

 

 

-- Find the Vehicle and create a GROUP object.
 Vehicle = GROUP:FindByName( "AG-Ground #006" )
 Vehicle1 = GROUP:FindByName( "AG-Ground #001" )
 Vehicle2 = GROUP:FindByName( "AG-Ground #002" )
 Vehicle3 = GROUP:FindByName( "AG-Ground #003" )
 
 -- Setup RespawnZone1 linking to the trigger zone ZONEVEHICLE1.
 RespawnZone = ZONE:New( "Zone10")
 RespawnZone1 = ZONE:New( "Zone1")
 RespawnZone2 = ZONE:New( "Zone2")
 RespawnZone3 = ZONE:New( "Zone3")
 
 -- Prepare the spawning to be done in RespawnZone1.
 Vehicle:InitZone( RespawnZone )
 --Vehicle:InitRandomizePositionZone( true )
 
 Vehicle1:InitZone( RespawnZone1 )
 --Vehicle1:InitRandomizePositionZone( true )
 
 Vehicle2:InitZone( RespawnZone2 )
 --Vehicle2:InitRandomizePositionZone( true )
 
 Vehicle3:InitZone( RespawnZone3 )
 --Vehicle3:InitRandomizePositionZone( true )
 
 
 Vehicle:HandleEvent( EVENTS.Dead )
 function Vehicle:OnEventDead( EventData )
 
   self:E( { "Size ", Size = Vehicle:GetSize() } )
   
   -- When the last vehicle of the group is declared dead, respawn the group.
   if Vehicle:GetSize() == 1 then
     -- Respawn the vehicle in RespawnZone1.
     Vehicle:Respawn()
     MessageToAll("Enemy Respawned", 20,"Traning Mission")
   end
 end
 
  Vehicle1:HandleEvent( EVENTS.Dead )
 function Vehicle1:OnEventDead( EventData )
 
   self:E( { "Size ", Size = Vehicle1:GetSize() } )
   
   -- When the last vehicle of the group is declared dead, respawn the group.
   if Vehicle1:GetSize() == 1 then
     -- Respawn the vehicle in RespawnZone1.
     Vehicle1:Respawn()
     MessageToAll("Enemy Respawned", 20,"Traning Mission")
   end
 end
 
  Vehicle2:HandleEvent( EVENTS.Dead )
 function Vehicle2:OnEventDead( EventData )
 
   self:E( { "Size ", Size = Vehicle2:GetSize() } )
   
   -- When the last vehicle of the group is declared dead, respawn the group.
   if Vehicle2:GetSize() == 1 then
     -- Respawn the vehicle in RespawnZone1.
     Vehicle2:Respawn()
     MessageToAll("Enemy Respawned", 20,"Traning Mission")
   end
 end
 
  Vehicle3:HandleEvent( EVENTS.Dead )
 function Vehicle3:OnEventDead( EventData )
 
   self:E( { "Size ", Size = Vehicle3:GetSize() } )
   
   -- When the last vehicle of the group is declared dead, respawn the group.
   if Vehicle3:GetSize() == 1 then
     -- Respawn the vehicle in RespawnZone1.
     Vehicle3:Respawn()
     MessageToAll("Enemy Respawned", 20,"Traning Mission")
   end
 end

 

 

I cant seem to find a way to timeout or pause when the group respawns, now it just resets as soon as the last is killed and I would like some time to be able to get away before the air defense respawns.

 

I would appreciate all the help I could get :). I really like tinkering with my own mission in the editor

Training Mission.lua

Training Mission.miz

Link to comment
Share on other sites

Checking your dcs.log file will probably give you an indication of what is going wrong.

 

Help, I am using 2.3.0 and I set a MISSION START trigger to take a DO_SCRIPT_FILE action to load Moose.lua from here:

 

https://github.com/FlightControlMaster/MOOSE/releases/download/2.3.0/Moose.lua

 

I can't get anything in Moose to run after that.

Link to comment
Share on other sites

Dynamic Spawning Causing Problems

 

Trying to understanding how things are working here. Working with the Zone-100 Normal Zone code.

 

HummerGroup = GROUP:FindByName("Test Inside Polygon")

ZoneA = ZONE:New("testZone")
ZoneA:SmokeZone(SMOKECOLOR.White, 90)

Messager = SCHEDULER:New(nil,
 function()
   HummerGroup:MessageToAll((HummerGroup:IsCompletelyInZone(ZoneA)) and "Inside Zone A" or "Outside Zone A", 1)
   if HummerGroup:IsCompletelyInZone(ZoneA) then
     HummerGroup:GetUnit(1):SmokeRed()
   end
 end, 
 {}, 0, 1)

 

All works just fine, but if I set the "Test Inside Polygon" vehicle to Late Activation and spawn it dynamically (as seen below) at the top of the page, it no longer works. Why not? How could I fix this?

 

Spawn_Vehicle_1 = SPAWN:New("Test Inside Polygon")
Spawn_Group_1 = Spawn_Vehicle_1:Spawn()

The State Military (MAG 13)

 

[sIGPIC][/sIGPIC]



 

SHEEP WE-01

AV-8B BuNo 164553

VMA-214

Col J. “Poe” Rasmussen

http://www.statelyfe.com

 

Specs: Gigabyte Z390 Pro Wifi; i9-9900K; EVGA 2080 Ti Black; 32GB Corsair Vengeance LPX DDR4; Samsung 970 EVO Series M.2 SSD; WIN10; ASUS VG248QE; CV-1 and Index



Modules: A-10C; AV8B; CA; FC3; F-5; F-14; F-18; F-86; HAWK; L-39; P-51; UH1H; NTTR; Normandy; Persian Gulf

Link to comment
Share on other sites

I believe the Spawn() returns the group so in your second iteration you need to be using Spawn_Group_1 variable in your scheduler in place of HummerGroup variable. I assume you've made code changes there too otherwise it makes sense this does not work because the GROUP:FindByName is looking for a different name than what was actually spawned.

 

Trying to understanding how things are working here. Working with the Zone-100 Normal Zone code.

 

HummerGroup = GROUP:FindByName("Test Inside Polygon")

ZoneA = ZONE:New("testZone")
ZoneA:SmokeZone(SMOKECOLOR.White, 90)

Messager = SCHEDULER:New(nil,
 function()
   HummerGroup:MessageToAll((HummerGroup:IsCompletelyInZone(ZoneA)) and "Inside Zone A" or "Outside Zone A", 1)
   if HummerGroup:IsCompletelyInZone(ZoneA) then
     HummerGroup:GetUnit(1):SmokeRed()
   end
 end, 
 {}, 0, 1)

 

All works just fine, but if I set the "Test Inside Polygon" vehicle to Late Activation and spawn it dynamically (as seen below) at the top of the page, it no longer works. Why not? How could I fix this?

 

Spawn_Vehicle_1 = SPAWN:New("Test Inside Polygon")
Spawn_Group_1 = Spawn_Vehicle_1:Spawn()

Link to comment
Share on other sites

Ok. I see that now. Got it working. Thanks.

The State Military (MAG 13)

 

[sIGPIC][/sIGPIC]



 

SHEEP WE-01

AV-8B BuNo 164553

VMA-214

Col J. “Poe” Rasmussen

http://www.statelyfe.com

 

Specs: Gigabyte Z390 Pro Wifi; i9-9900K; EVGA 2080 Ti Black; 32GB Corsair Vengeance LPX DDR4; Samsung 970 EVO Series M.2 SSD; WIN10; ASUS VG248QE; CV-1 and Index



Modules: A-10C; AV8B; CA; FC3; F-5; F-14; F-18; F-86; HAWK; L-39; P-51; UH1H; NTTR; Normandy; Persian Gulf

Link to comment
Share on other sites

Question was trying to get an event handler to work with a scripted spawned helicopter group to execute my code when they land. Was trying to use the event.land or somthing like that and could not for the life of me get it to work. Would someone be able to give me and example and an event handler (land) with a scripted spawned unit.

Link to comment
Share on other sites

All,

 

Would like to let you all know that I've posted some new videos as part of the Release 2.4 beta. The first video series is about APC cargo transportation.

 

Check in the comments of the video the download location of the demo mission.

Ensure you watch all the videos, but if you don't have a lot of time, watch video 4 then...

PE1URmcxIp8

 

i8F3AEwS-Zs

 

tN59Pwh_1jw

 

DSuK31YuoL8


Edited by FlightControl

[TABLE][sIGPIC][/sIGPIC]|

[/TABLE]

Link to comment
Share on other sites

There is more to come, this is only the start :-)

 

And these videos are about AI only. There is also a human tasker, the TASK_CARGO_ classes, which handle cargo transportation tasks for human players.

It just is a lot of work to make all these videos and document and make demo mission et all...

 

Sven


Edited by FlightControl

[TABLE][sIGPIC][/sIGPIC]|

[/TABLE]

Link to comment
Share on other sites

MOOSE for Non-Coders

 

I am a total coding novice who decided to try using MOOSE to enhance my missions. Despite FlightControl's enormous documentation effort, I encountered many frustrations due mainly to my ignorance of basic coding principles. I documented some of these myself and offer them here. Other coding novices out there may find it useful. I will entertain any suggestions for improvement.

MOOSE for Non-Coders.pdf

Link to comment
Share on other sites

I am a total coding novice who decided to try using MOOSE to enhance my missions. Despite FlightControl's enormous documentation effort, I encountered many frustrations due mainly to my ignorance of basic coding principles. I documented some of these myself and offer them here. Other coding novices out there may find it useful. I will entertain any suggestions for improvement.
THIS is fantastic! Though a lot of it, I already learned the hard way, I see this as extremely(!!!) valuable for beginners.

@sven this should be linked or added to the Moose tutorials on GitHub!

 

Lots of these little misunderstandings and misconceptions pointed out and explained.

Shagrat

 

- Flying Sims since 1984 -:pilotfly:

Win 10 | i5 10600K@4.1GHz | 64GB | GeForce RTX 3090 - Asus VG34VQL1B  | TrackIR5 | Simshaker & Jetseat | VPForce Rhino Base & VIRPIL T50 CM2 Stick on 200mm curved extension | VIRPIL T50 CM2 Throttle | VPC Rotor TCS Plus/Apache64 Grip | MFG Crosswind Rudder Pedals | WW Top Gun MIP | a hand made AHCP | 2x Elgato StreamDeck (Buttons galore)

Link to comment
Share on other sites

Is it possible with MOOSE to set up the fuel status of an AAR Tanker like the S3B or the KC-130?
No, you can only access, what the DCS scripting engine offers.

Shagrat

 

- Flying Sims since 1984 -:pilotfly:

Win 10 | i5 10600K@4.1GHz | 64GB | GeForce RTX 3090 - Asus VG34VQL1B  | TrackIR5 | Simshaker & Jetseat | VPForce Rhino Base & VIRPIL T50 CM2 Stick on 200mm curved extension | VIRPIL T50 CM2 Throttle | VPC Rotor TCS Plus/Apache64 Grip | MFG Crosswind Rudder Pedals | WW Top Gun MIP | a hand made AHCP | 2x Elgato StreamDeck (Buttons galore)

Link to comment
Share on other sites

What you can do, is define an AI tanker with fuel set to a certain value and spawn that.

Shagrat

 

- Flying Sims since 1984 -:pilotfly:

Win 10 | i5 10600K@4.1GHz | 64GB | GeForce RTX 3090 - Asus VG34VQL1B  | TrackIR5 | Simshaker & Jetseat | VPForce Rhino Base & VIRPIL T50 CM2 Stick on 200mm curved extension | VIRPIL T50 CM2 Throttle | VPC Rotor TCS Plus/Apache64 Grip | MFG Crosswind Rudder Pedals | WW Top Gun MIP | a hand made AHCP | 2x Elgato StreamDeck (Buttons galore)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...