Jump to content

DCS Mods structure : How to create your plugin from scratch


Recommended Posts

Guess I gotta build an LAU-127, as I dont see one in the shapes folder.

 

Right now I'm declaring new settings for LAU-115C+AIM-7M, LAU-115C+LAU-127 For Dual AIM-120, etc etc.

 

Edit: Exported a LAU127 from another project I was doing..

 

So now new Declares so far for:

LAU127 (with Shape in SH's Shape Folder) + AIM-120C

LAU115C+LAU127 + 2* AIM120B/C

LAU115C + AIM-7M

 

Dual AIM-120 Rack is Tweaked, Need to finish adjusting points for AIM-7 and LAU127+AIM120B/C (Well AIM-120C, as the SH's dont use the -Bs)

 

Also Havent Added Connector for pylon itself yet.


Edited by SkateZilla

Windows 10 Pro, Ryzen 2700X @ 4.6Ghz, 32GB DDR4-3200 GSkill (F4-3200C16D-16GTZR x2),

ASRock X470 Taichi Ultimate, XFX RX6800XT Merc 310 (RX-68XTALFD9)

3x ASUS VS248HP + Oculus HMD, Thrustmaster Warthog HOTAS + MFDs

Link to comment
Share on other sites

Looking nice :)

 

As for the Connector, how do you procede to add them ?

Do I have to add a dummy in 3dsmax, change its properties, rename it ? If so, to what ?

Do I have to link things to it ? etc etc

If you've already done it in one of your other mods, please let me know and help me out, I've found ways around it, but I'd rather do it the right way...


Edited by archimaede
Link to comment
Share on other sites

Looking nice :)

 

As for the Connector, how do you procede to add them ?

Do I have to add a dummy in 3dsmax, change its properties, rename it ? If so, to what ?

Do I have to link things to it ? etc etc

If you've already done it in one of your other mods, please let me know and help me out, I've found ways around it (as you can see on the screenshot), but I'd rather do it the right way...

 

 

Helper Points, Will post image in a minute.

 

(Image Uploaded, Basically, You place a Helper Point, and line it up with the pylon (position and rotation orientation.)

 

that way you dont have to worry about setting YZX coordinates etc in the LUA,

 

EACH Point should be Named "Pylon1, Pylon2" etc. the corresponding pylon number in the LUA will place Stores w/ the point number.

 

Code:

pylon(<Pylon Number> <Pylon Type> <Y,Z,X Coordinates if needed>

 

ie:

			pylon(1, 0, 0.0,0.0,0.0,  
			{use_full_connector_position = true,}, -- Left Wingtip Station (1)
			{
                               { CLSID = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}"}, -- AIM-9M SIDEWINDER
                               { CLSID = "{9BFD8C90-F7AE-4e90-833B-BFD0CED0E536}"}, -- AIM-9P SIDEWINGER
			{ CLSID = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}"}, -- AIM-9X SIDEWINGER
			{ CLSID = "{D3F65166-1AB8-490f-AF2F-2FB6E22568B3}"}, -- Blue Smoke
			{ CLSID = "{A4BCC903-06C8-47bb-9937-A30FEDB4E743}"}, -- Blue Smokewinder
			{ CLSID = "{D3F65166-1AB8-490f-AF2F-2FB6E22568B1}"}, -- Red Smoke
			{ CLSID = "{A4BCC903-06C8-47bb-9937-A30FEDB4E741}"}, -- Red Smokewinder
			}	
		),  --End Of Pylon


Edited by SkateZilla

Windows 10 Pro, Ryzen 2700X @ 4.6Ghz, 32GB DDR4-3200 GSkill (F4-3200C16D-16GTZR x2),

ASRock X470 Taichi Ultimate, XFX RX6800XT Merc 310 (RX-68XTALFD9)

3x ASUS VS248HP + Oculus HMD, Thrustmaster Warthog HOTAS + MFDs

Link to comment
Share on other sites

gonna have to define a custom loadout for fuel tank too, but I wanna make sure I got this right:

 

declare_loadout(
			{
--Got it			category		= CAT_FUEL_TANKS,
--Got it			CLSID			= "{PTB_120_F86F35}",
--Got it			attribute		=  {wsType_Air,wsType_Free_Fall,wsType_FuelTank,WSTYPE_PLACEHOLDER},
--Got it			Picture			= "PTB.png",
--Got it			displayName		= _("Fuel Tank 480 gallons"),
--Is lbs or kg?		Weight_Empty	= 50,
--same as above		Weight			= 50 +  3.028 * 120,
--Drag Coefficient	Cx_pil			= 0.001313754,
--Got it					shape_table_data = 
				{
						{
							name 	= "",
							file	= "";
							life	= 1;
							fire	= { 0, 1};
							username	= "";
							index	= WSTYPE_PLACEHOLDER;
						},
				},
				Elements	= 
					{
						{
							ShapeName	= "",
						}, 
					}, 
			}
)

 

 

Im Assuming it's KG, So...

1lb = .453592kg, So for 480 US GAL Drop Tank of JP-5 at 6.8 lbs per gallon

480x6.8 LBs = 3264 LBs x .453592 = 1480.524288 KG

 

EDIT: This Worked perfectly.

 

declare_loadout(
{
	category		= CAT_FUEL_TANKS,
	CLSID			= "{PTB_480_F18EFG}",
	attribute		=  {wsType_Air,wsType_Free_Fall,wsType_FuelTank,WSTYPE_PLACEHOLDER},
	Picture			= "PTB.png",
	displayName		= _("Fuel Tank 480 gallons"),
	Weight_Empty	= 50, --kg
	Weight			= 50 +  3.084 * 480, --kg
	Cx_pil			= 0.001313754,  
	shape_table_data = 
	{
		{
			name 	= "PTB_480_F18EFG",
			file	= "f-18-fuel-tank-480";
			life	= 1;
			fire	= { 0, 1};
			username	= "PTB_480_F18EFG";
			index	= WSTYPE_PLACEHOLDER;
		},
	},
	Elements	= 
	{
		{
			ShapeName	= "PTB_480_F18EFG",
		}, 
	}, 
}
)


Edited by SkateZilla

Windows 10 Pro, Ryzen 2700X @ 4.6Ghz, 32GB DDR4-3200 GSkill (F4-3200C16D-16GTZR x2),

ASRock X470 Taichi Ultimate, XFX RX6800XT Merc 310 (RX-68XTALFD9)

3x ASUS VS248HP + Oculus HMD, Thrustmaster Warthog HOTAS + MFDs

Link to comment
Share on other sites

You were too quick for me to reply, but yes that was exactly it. Also they will act as fuel tanks with this code (whereas with a slightly different code, they seem to act like tanks but don't actually add fuel, they're just useless weights).

 

I'm trying to add my custom cockpit, but it only partially works.

 

In the aircraft.lua, I have :

HumanCockpit 		= true,
HumanCockpitPath    = current_mod_path..'/Cockpit/Scripts/',

 

In the entry.lua, I only have the dofile :

dofile(current_mod_path..'/aircraft.lua')

 

That's pretty much all I have to load my cockpit, and it works. However, I then lose all my external animations (flaps, gear, etc)... What did I miss ?


Edited by archimaede
Link to comment
Share on other sites

  • 4 weeks later...

OK, Trying to bring in my own AN/AAS-38 FLIR Pod, As the ingame one has the F-18 Pylon Attached to it.. And I already have my own Pylon for it..

 

So:

I did the code below, Problem is, despite my own Elements/Shapes, the Engine is still loadign the F-18C FLIR POD Shape and ignoring my PylonShape and FLIR Pod Shape Declarations.

 

declare_loadout(
{	--
category		=	CAT_PODS,
CLSID			= 	"{ALQ_AN_AAS38}",
Picture			=	"ANAAS38.png",
wsTypeOfWeapon	=	wsType_Weapon,wsType_GContainer,wsType_Control_Cont, 74},
displayName		=	_("ALQ Pylon - AN/AAS-38 FLIR"),
attribute		=	{4,	15,	44, 74},
Cx_pil			=	0.001959765625,
Count			=	1,
Weight			=	200,
Elements	=	
{
	{	ShapeName	=	"ALQ_Pylon",	IsAdapter   =   true		   }, 
	{	ShapeName	=	"AN_AAS-38_EFG" ,	Position	=	{-0.20,-0.082,0.017}, Rotation = {45.0, 0.0, 0.0}},
	
}, -- end of Elements
})

Windows 10 Pro, Ryzen 2700X @ 4.6Ghz, 32GB DDR4-3200 GSkill (F4-3200C16D-16GTZR x2),

ASRock X470 Taichi Ultimate, XFX RX6800XT Merc 310 (RX-68XTALFD9)

3x ASUS VS248HP + Oculus HMD, Thrustmaster Warthog HOTAS + MFDs

Link to comment
Share on other sites

I think as similar with my problems to generate new weapons on DCS: W. the engine ignore the new shape declarations (engine limitations?).

 

It's only doing it for the POD right now afaik,

 

Missiles, Fuel tanks, etc, I can load up whatever shape on the Pylon and Stores elements.

 

If I Change the last attribute, I can change the POD Loaded (ie 74 for AAS-38 FLIR, 101 for AAQ-38, etc),

 

But it wont load the shape table to load a new shape while retaining the actual pod attributes.

 

 

I'm Guessing I'm gonna have to define the entire pod's attributes in local declaration w/ new name?


Edited by SkateZilla

Windows 10 Pro, Ryzen 2700X @ 4.6Ghz, 32GB DDR4-3200 GSkill (F4-3200C16D-16GTZR x2),

ASRock X470 Taichi Ultimate, XFX RX6800XT Merc 310 (RX-68XTALFD9)

3x ASUS VS248HP + Oculus HMD, Thrustmaster Warthog HOTAS + MFDs

Link to comment
Share on other sites

trying a few things:

 

So far, this is what I came up with and is the only one NOT to crash DCS on Loadup, or cause the Aircraft to go missing due to string errors etc.

 

However Both seem to cause Mission Editor to Hang......

 

local AAS38SH =   {
	category		= CAT_PODS,
	name			= "AAS_38_SH", 
	user_name		= _("AAS_38_SH"),
	wsTypeOfWeapon 	= {wsType_Weapon,wsType_GContainer,wsType_Control_Cont,WSTYPE_PLACEHOLDER},
       Cx_pil			= 0.001313754,
	type = OPTIC_SENSOR_IR,
           scan_volume =
           {
               azimuth = {-35.0, 35.0},
               elevation = {-150.0, 30.0}
           },
           view_volume_max = 
           {
               azimuth_sector = 12.0,
               elevation_sector = 12.0
           },
           magnifications = {5.8, 23.3},
           resolution = 0.05,
           laserRanger = true,
	shape_table_data =
	{
		{
			name	 = "AAS_38_SH",
			file	 = "F_18EFG_Super_Hornet_AN_AAS-38",
			life	 = 1,
			fire	 = { 0, 1},
			username = "AAS_38_SH",
			index = WSTYPE_PLACEHOLDER,
		},
	},
	
   }

declare_weapon(AAS38SH)

declare_loadout({
category		=	CAT_PODS,
CLSID			= 	"{F_18_EFG_ALQ_AN_AAS38}",
Picture			=	"ANAAS38.png",
wsTypeOfWeapon	=	AAS38SH.wsTypeOfWeapon,
displayName		=	_("ALQ Pylon - AN/AAS-38 FLIR"),
attribute		=	{4,	15,	44,	WSTYPE_PLACEHOLDER},
Cx_pil			=	0.001959765625,
Count			=	1,
Weight			=	170,
Elements	=	
{
	{	ShapeName	=	"GAR-8" ,	Position	=	{0.0,0.0,0.0}},
}, -- end of Elements
})

 

or

 

local AAS38SH =   {
	category		= CAT_PODS,
	name			= "AAS_38_SH", 
	user_name		= _("AAS_38_SH"),
	wsTypeOfWeapon 	= {wsType_Weapon,wsType_GContainer,wsType_Control_Cont,WSTYPE_PLACEHOLDER},
               Cx_pil			= 0.001313754,
               OPTIC = "AN/AAS-38 FLIR/LDT",
	shape_table_data =
	{
		{
			name	 = "AAS_38_SH",
			file	 = "F_18EFG_Super_Hornet_AN_AAS-38",
			life	 = 1,
			fire	 = { 0, 1},
			username = "AAS_38_SH",
			index = WSTYPE_PLACEHOLDER,
		},
	},
	
   }

declare_weapon(AAS38SH)

declare_loadout({
category		=	CAT_PODS,
CLSID			= 	"{F_18_EFG_ALQ_AN_AAS38}",
Picture			=	"ANAAS38.png",
wsTypeOfWeapon	=	AAS38SH.wsTypeOfWeapon,
displayName		=	_("ALQ Pylon - AN/AAS-38 FLIR"),
attribute		=	{4,	15,	44,	WSTYPE_PLACEHOLDER},
Cx_pil			=	0.001959765625,
Count			=	1,
Weight			=	170,
Elements	=	
{
	{	ShapeName	=	"GAR-8" ,	Position	=	{0.0,0.0,0.0}},
}, -- end of Elements
})


Edited by SkateZilla

Windows 10 Pro, Ryzen 2700X @ 4.6Ghz, 32GB DDR4-3200 GSkill (F4-3200C16D-16GTZR x2),

ASRock X470 Taichi Ultimate, XFX RX6800XT Merc 310 (RX-68XTALFD9)

3x ASUS VS248HP + Oculus HMD, Thrustmaster Warthog HOTAS + MFDs

Link to comment
Share on other sites

OK, got the POD to show up using:

 

Now I just have to figure out how and where the parameters for the sensor goes.. :)

 

declare_loadout(
{
	category	= CAT_PODS,
	CLSID		= "{F_18_EFG_ALQ_AN_AAS38}",
	attribute	=  {wsType_Weapon,wsType_GContainer,wsType_Control_Cont,WSTYPE_PLACEHOLDER},
	Picture		= "ANAAS38.png",
	displayName	= _("ALQ Pylon - AN/AAS-38 FLIR"),
	Weight		= 175,
	Cx_pil		= 0.002,
	shape_table_data = 
	{
		{
			name 	= "ANAAS38_F18EFG",
			file	= "F_18EFG_Super_Hornet_AN_AAS-38";
			life	= 1;
			fire	= { 0, 1};
			username	= "ANAAS38_F18EFG";
			index	= WSTYPE_PLACEHOLDER;
		},
	},
	Elements	= 
	{
		{
			ShapeName	= "ANAAS38_F18EFG",
		}, 
	}, 
}
)

Windows 10 Pro, Ryzen 2700X @ 4.6Ghz, 32GB DDR4-3200 GSkill (F4-3200C16D-16GTZR x2),

ASRock X470 Taichi Ultimate, XFX RX6800XT Merc 310 (RX-68XTALFD9)

3x ASUS VS248HP + Oculus HMD, Thrustmaster Warthog HOTAS + MFDs

Link to comment
Share on other sites

  • 1 month later...

Does anyone know how to declare the gun pod container?

I could declare shells, gun and the gun pod container but can't get pod to shoot.

 

--GPU-5A Gun Pod declaration

   -- GAU13_30_HE Shell
   declare_weapon({category = CAT_SHELLS, name = "GAU8_30_HE", user_name = _("GAU8_30_HE"),
       model_name      = "tracer_bullet_A-10",
       mass            = 0.360, -- Bullet mass
       round_mass      = 0.700, -- Assembled shell
       cartridge_mass  = 0.360, -- Empty shell
       explosive       = 0.360,
       v0              = 950.0,
       Dv0             = 0.0060,
       Da0             = 0.0017,
       Da1             = 0.0,
       life_time       = 31.0,
       caliber         = 30,
       s               = 0.0,
       j               = 0.0,
       l               = 0.0,
       charTime        = 0,
       cx                = {0.5,0.80,0.90,0.080,2.15},
       k1                = 5.7e-09,
       tracer_off      = 1.5,
       tracer_on       = tracer_on_time,
       smoke_tail_life_time = 0.5,
       scale_tracer    = 0,
       cartridge       = 0,
       scale_smoke     = barrel_smoke_level,
       smoke_opacity   = barrel_smoke_opacity,
       name = "30mm HE",
   })
   -- GAU13_30_AP Shell
   declare_weapon({category = CAT_SHELLS, name = "GAU8_30_AP", user_name = _("GAU8_30_AP"),
       model_name      = "tracer_bullet_A-10",
       mass            = 0.360, -- Bullet mass
       round_mass      = 0.700, -- Assembled shell
       cartridge_mass  = 0.083, -- Empty shell (+ link if links are stored as well)
       explosive       = 0.0000,
       v0              = 1080.0,
       Dv0             = 0.0060,
       Da0             = 0.0017,
       Da1             = 0.0,
       life_time       = 31.0,
       caliber         = 31,
       s               = 0.0,
       j               = 0.0,
       l               = 0.0,
       charTime        = 0,
       cx                = {0.5,0.80,0.90,0.080,2.15},
       k1                = 5.7e-09,
       tracer_off      = -100,
       tracer_on       = tracer_on_time,
       smoke_tail_life_time = 0,
       scale_tracer    = 0,
       cartridge       = 0,
       scale_smoke     = barrel_smoke_level,
       smoke_opacity   = barrel_smoke_opacity,
       name = "30mm AP",
   })
   
function GAU_13 ( tbl )

   tbl.category = CAT_GUN_MOUNT
   tbl.name      = "GAU_13"
   tbl.display_name    = "GAU_13"
   tbl.supply      = 
   {
       shells = {"GAU8_30_AP", "GAU8_30_HE"},
       mixes  = {{1,1,1,1,2}}, --  
       count  = 353,
   }
   if tbl.mixes then 
      tbl.supply.mixes =  tbl.mixes
      tbl.mixes        = nil
   end
   tbl.gun = 
   {
       max_burst_length = 100,
       rates              = {2400},
       recoil_coeff      = 0.5*1.3,
       barrels_count      = 1,
   }
   if tbl.rates then 
      tbl.gun.rates    =  tbl.rates
      tbl.rates        = nil
   end    
   tbl.ejector_pos             = tbl.ejector_pos or {0.0, 0.05, 0.0}
   tbl.ejector_dir             = tbl.ejector_dir or {0, -1, 0}
   tbl.supply_position          = tbl.supply_position   or {0, -0.3, -1.5}
   tbl.aft_gun_mount             = false
   tbl.effective_fire_distance = 2200
   tbl.drop_cartridge             = 203
   tbl.muzzle_pos                = {0,0,0}    -- all position from connector
   tbl.azimuth_initial         = tbl.azimuth_initial    or 0   
   tbl.elevation_initial         = tbl.elevation_initial  or 0   

   return declare_weapon(tbl)
end

local GPU_5A = {
category = CAT_PODS
}

declare_weapon(GPU_5A)

declare_loadout(
   {
       category        = CAT_PODS,
       CLSID            = "{GPU-5A}",
       Picture            =    "guv.png",
       displayName        =    _("GPU-5A Gun Pod"),
       attribute        =    {wsType_Weapon,wsType_GContainer,wsType_Cannon_Cont,WSTYPE_PLACEHOLDER},
       wsTypeOfWeapon    =    {wsType_Weapon,wsType_Shell,wsType_Shell_A,[b][color=Red]----???----[/color][/b]},
       Cx_pil            =    0.0020,
       Count            =    3,
       Weight            =    841,
       shape_table_data = 
               {
                   {
                       name    = "GPU-5A";
                       file    = "gpu-5a";
                       life    = 1;
                       fire    = { 0, 1};
                       username    = "GPU-5A";
                       index    = WSTYPE_PLACEHOLDER;
                   },
               },
       Elements    = 
               {
                   {
                       DrawArgs    = 
                       {
                           [1] = {1, 1},
                           [2] = {2, 1},
                       }, 
                       Position    = {0, 0, 0},
                       ShapeName    = "gpu-5a",
                   }, 
               }, 
   }
)

su-24.gif

Link to comment
Share on other sites

  • 3 weeks later...

Hello,

Is it possible to send a key command (or whatever else command) from Av Lua device in my cockpit systems? And how?

 

I.E. iPlaneEngineStart (Not sure I wrote it right)

What should I declare in command_defs.lua and in the systemname.lua?

 

I am searching and searching and it is still not clear to me. Just a little hint would help me a lot. I already understand everything I need by now (clickables, listening commands, sending arg values, params...) except how to send a command from device.

[sIGPIC][/sIGPIC]

Link to comment
Share on other sites

Not sure if it's what you're asking for, but here's an example for airbrakes :

 

In the command_defs.lua add your commands :

 

	PlaneAirBrake = 73,		
PlaneAirBrakeOn = 147,
PlaneAirBrakeOff = 148,	

 

In systemname.lua add :

 

local Airbrake  = 73 -- This is the number of the command from command_defs
local AirbrakeOn = 147
local AirbrakeOff = 148

dev:listen_command(Airbrake)
dev:listen_command(AirbrakeOn)
dev:listen_command(AirbrakeOff)

 

Then further down, for the actual code :

 

function SetCommand(command,value)			

if (command == Airbrake) then
              .......
      elseif(command == AirbrakeOn) then
              .....
       end
end

Link to comment
Share on other sites

Not sure if..

 

EDIT: I solved this using dispatch action. Maybe I was just confused by using variable name in it. Command defs value of the defined keyboard command reacts fine. It is just raw code without any systems checks.

If anyone were interested:

 

Command_defs line is

iCommandLeftEnginesStart=	311, --Keyboard command name and engine start command value from Export.lua

 

systemname.lua working code is

local m701c 	    = GetSelf()

local update_time_step = 0.1

make_default_activity(update_time_step)

local sensor_data = get_base_data()

local iCommandLeftEnginesStart=	311 -- I think this variable is not necessary
local Button_10 = 3010 -- I think this variable is not necessary

m701c:listen_command(3010) --Command value of engine start clickable
start=0
function SetCommand(command,value)	
if command==3010 then start=1 end
end

function update()
   if start>0 then
dispatch_action(nil,311)
end
end


Edited by Chlebakus

[sIGPIC][/sIGPIC]

Link to comment
Share on other sites

  • 3 weeks later...

Hi,

 

I'm trying to make a plugin (not by modifing the planes/F-15C.lua) that adds an F-15C as a new entry but with new custom weapons.

1. I've managed to make a plugin with the weapon using declare_weapon(w) and declare_loadout(l) but the missile_data entries are not be updated.

2. will copying-paste the plane info from the planes/F-15C.lua work into add_aircraft?

IAF.101_Phantom, 101 squadron XO, Preflight Community Manager

[sIGPIC][/sIGPIC]

watch your six, i'm behind you

-----

Mods: IAF_Weapons: Python 3 and 4

https://www.digitalcombatsimulator.com/en/files/2835842/

Link to comment
Share on other sites

You'll need a lot more than that to add a new aircraft. You should check the Wunderluft example, it has everything you need for that.

 

As for adding weapons, it's not supposed to do anything to missile_data. Everything should be internal to your new aircraft.

 

Also, last time I checked, adding custom weapons to the F-15C while still using an F-15C cockpit made DCS crash, so there's that...


Edited by archimaede
Link to comment
Share on other sites

Thanks!

So far I've been able to make a new weapon that appears in the mission builder for the F-15C. It didn't crash the game but the missile appears as unkn in the MFCD.

Any ideas?

 

Sent from my Nexus 4 using Tapatalk

IAF.101_Phantom, 101 squadron XO, Preflight Community Manager

[sIGPIC][/sIGPIC]

watch your six, i'm behind you

-----

Mods: IAF_Weapons: Python 3 and 4

https://www.digitalcombatsimulator.com/en/files/2835842/

Link to comment
Share on other sites

You must use visibility animation with argument number 114 (if I remember it correctly) for your external cockpit. Value 0 is visible, value 1 hidden. Game will handle the animation automatically when you have human cockpit model present.

 

 

That's right, a big thank you! :thumbup:

Link to comment
Share on other sites

Thanks!

So far I've been able to make a new weapon that appears in the mission builder for the F-15C. It didn't crash the game but the missile appears as unkn in the MFCD.

Any ideas?

 

Sent from my Nexus 4 using Tapatalk

Did you use an AIM-120/AIM-7/AIM-9 base for that new weapon ?

Does the missile appear in external view ? Can you shoot it ?

Link to comment
Share on other sites

Based on a new weapon type I've created a totally new type, which works perfectly appear with skin and fires. obviously the current cockpits can't display the new name. I was hoping it's dynamically loaded from a file somewhere...

 

Sent from my Nexus 4 using Tapatalk

IAF.101_Phantom, 101 squadron XO, Preflight Community Manager

[sIGPIC][/sIGPIC]

watch your six, i'm behind you

-----

Mods: IAF_Weapons: Python 3 and 4

https://www.digitalcombatsimulator.com/en/files/2835842/

Link to comment
Share on other sites

  • Recently Browsing   0 members

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