Jump to content

WIP: Creating an Asset from start to finish.


Recommended Posts

:confused:Creating an Asset from start to finish.:confused:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

EDITED: OK, just to have a little update spot at the top :

Here is where I am at.

Lesson one still needs to be updated to more current information.

I have had a chance to look at Blender and I have finished my JGS version of 3DS "Animated Battle Scene" tutorial, SKILL LEVEL: BEGINNER.

I have had a chance to look over a lot of the 3ds Tutorial stuff now and I don't think I will be working in 3dsMax, at least not much from now on.

What I have done has made Blender make a lot more sense to me and i feel comfortable enough with it to start using it.

I am now working on some Blender Tutorials and will make at least one tutorial for blender b4 moving back to updating Lesson One and adding these drawing tutorials to the top, so we can actually get started MODDING :wink: (intending on placing them in the Selecting your program box)

Thanks to everyone!

quote_icon.png Originally Posted by Claw viewpost-right.png

If your aim is to repackage the wiki information, please be very clear about that. It can be insulting to some people when they see their works copied and pasted elsewhere. Also, the whole point of the wiki is for users to be able to edit and update information along the way. Feel free to get an account and update links/info up there. The better the info on the wiki, the more useful it is.

Cheers,

~Claw

My aim is to become proficient in Visual C++ and if this helps other GREAT. Im not trying to repackage anything, Im just trying to learn this. But, I guess I am inadvertently "repackaging" it AND fixing dead or broken links. This could be used to update the links in KSP WiKi when i am done, if i continue.

Im hoping a few people will join me learning because 2 minds are better than one. I am retired and learning this for fun. Please do not be offended if you see your work here! Your work is VERY VALUABLE!!!! And I have sited links to ALL the reference material because i want to make sure your recognized for your work. After all, I could not have learned what I have without it. If I need to site extra recognition, I don't have a problem with that! I wouldn't mind if anyone whos work i am using to learn, follows along and helps me and who ever might join this thread.

nice to meet ya Claw

My intention is NOT to offend anyone.

That is why I said from the start that 99% of this is NOT my work, right now. I will be adding, at least one example of my own.

When I am reading to learn I take notes, I have to, and i do it in an outline. I realized that I was organizing all of this info and making it sequence, plus I have found links to relevant information where I was finding dead links.

I just got so frustrated with KSP wiki breaking my concentration every 2 min's with a dead or broken link. When everything is a clicking and you hit a dead link... it breaks the &^^%% out of my concentration, and its hard to get going again, I don't know about you.

If you guys don't want me to post this, fine, I won't. but i already have it a lot done and when I finish with my first asset this could be a great tutorial... Plus I might get some help and help others learn.

I really love this game, so much so that i am learning this. Im FREE HELP USE ME LOL but seriously, I have a lot of time on my hands and Im not afraid to say no if I don't want to do something.

EDIT 2 PLEASE READ THE ENTIRE POST B4 YOU ask questions or comment, your answer may already be here!

------------------------------------------------------------------------------------------------------------------------------------------------------------

Ok, I'm an old guy here and I know a couple OLD computer languages but Im Kinda new to Visual C++

I am self taught and by no means self proficient in C yet. I am learning and that is the point of this Thread.

I did some mods with a few friends on a game when i was in college but haven't messed with C much since then.

I went to school for Computer Information Systems (basically system annalist... Cobol stuff) CADD and Mechanical ENGR/Design,

and minored in psychology.... Wouldn't ya know I ended up working in a hospital and not on computers, much.

Well, Im retired now, both my kids are about grown and gone, Im single, I love this game lol, I want to become proficient

with C++ and all I do now is play, its kinda nice. :kiss::cool:

Reason # 2 that I am posting this Thread

I tend to be kinda unorganized... looking, but I can find everything in my madness:huh: lol

The information is out there and available but its freaking everywhere and not all the links work.

When the links don't work it breaks my concentration and I lose my place, then start making mistakes and break my game not knowing what the #@%# I did wrong. lol:P

My Plan is to break this down to single entry's, kinda like steps in creating your asset.

I have not written MOST of this but i have reorganized ALL of it AND added Links (where I could, of the broken ones)

I have a lot of time on my hands right now so I have been working on this almost everyday.

I am not going to go back to everything that brought me to this point, unless I need a refresher at some point.

Anyone is welcome to join in... or just follow along.

To keep my time on this forum to a minim, so I can keep learning, I will only check this once per day UNTIL I get to the end of creating my first asset.

So when this is finished, the last post will be up todate and should contain EVERYTHING you need to build your Asset.

This is NOT going to be finished over night but i will be moving fast, try to keep up if your doing this with me.

New posts will be added when I get tired and stop for the day.

In the post I will note where I stopped and there will be info after that so i know what i didn't get to so I can remember where i left off,

my memory sucks, I gotta take notes, or I WONT remember.

If I forget something don't get mad cuz I forgot, remember. lol

Anyway, this next post will be the Start. Day one Outline ONE.

Im tired and ready to quit for the day, after I get this posted.

Thanks in advance for anyone who would like to join me learning

or help US learn.

This is my Kerbin/Earth conversion. Its going to be a future Earth, Hot and Dry. It is a work in progress, I just started it last night.

Aussi_zps32a19849.png

Have a GREAT Night SQUAD, AND THANK YOU ALL for such an awesome game!

Edited by Enriched Uranium
Just updating 'where Im at'
Link to comment
Share on other sites

Edited *draft 2* Lesson ONE

First I would like to say that This is my second draft. I am CURRENTLY taking a break, You may read but know this is a long way from finished.

If you do read this and see points that are obviously wrong and i need to find updated info, feel free to point it out. If nobody else has.:sticktongue:

My plan is to be the first person to use this tutorial. So when I am finished... if you learn, close to the way I do, you will be able to follow

this, step by step until your mod is finished and working. (That is my hope for the mod I will be creating as my example.)

At this point, I am planning for my mod to be a small, modular, Beer/Soda cooler for Jeb when he is out on a moon rover somewhere.

I don't know if Ill be able to make it follow the rover around or not but that is what i am hoping. As I said, it will be modular so you will be able

to build it how you would like, in game, but I hope to make it look... somewhat like R2D2 lol... It may be more work than i know what im getting

myself into but I would also like for Jeb to be able to use it as a UAV and have the option of giving it the ability to fly.

(kinda like the UAV's infantry use to get a better view of... the battle field.)

Something like this but much much smaller

Anyway, Here it is:


[URL="http://wiki.kerbalspaceprogram.com/wiki/Main_Page"]SPECIAL THANKS TO
[/URL][URL="http://wiki.kerbalspaceprogram.com/w/index.php?title=User:Darrknox&action=edit&redlink=1"]Darrknox[/URL][URL="http://wiki.kerbalspaceprogram.com/wiki/Making_an_asset_from_start_to_finish"] & [/URL][URL="http://wiki.kerbalspaceprogram.com/w/index.php?title=User:Killerhurtz&action=edit&redlink=1"]Killerhurtz
[/URL][URL="http://wiki.kerbalspaceprogram.com/wiki/Making_an_asset_from_start_to_finish"]FOR THE WORK THEY HAVE CONTRIBUTED TO KSP WIKI[/URL]

[URL="http://forum.kerbalspaceprogram.com/threads/7529-Plugin-Posting-Rules-And-Official-Documentation?p=156430&viewfull=1#post156430"]This is a special Thanks to Mu for posting his hard work, and allowing us to use it so we can learn this stuff.
Awesome work Mu, i couldn't have even started this without the work you have already put into this, i hope
you like how this turns out.[/URL]

Creating a Mod

Step 1 - Choosing your programs


A list of 3d software with links to download goes here - plus a conversation about selecting your programs with a tutorial using 3ds and one using Blender.

Step 2 - Understanding Folder Design

First of all, there's your main folder.


You can name this folder anything you would like to, just make sure there's no underscore.

This Folder has what i call a VariableName, simply meaning you
can name it what ever you would like to. HOWEVER, you want to keep your
VariableName folders as short as you can yet allow youself to easily identify it.
DO NOT USE AN UNDERSCORE ON THIS FOLDER!

For my example, My main folder will be named JGSMods

Keep those names short and identifiable, by you.


When you test your mod and extract it into your game, your folder names will
work fine but you do not know the install location of the final user.

If the User is using, for example, a Steam version of KSP, it could be located as deep
into their directory as:

c:\Program Files (x86)\Steam\SteamApps\common\Kerbal Space Program\GameData\VariableName

So, you can see how, if your mods directory structer goes very deep, the end user might end up
with an error during extraction that the folder name is too long and anything that was in those
folders will not be extracted into their game. Then your mod will not work for them and you might hear about it.
There is an easy work around for the user, if they know it, but they will never get it working if they don't know it.

Did you know that you can trace from Christopher Columbus to Nikola Tesla with an EGG!

If I told you that you could place an egg, standing on end, on a table and it would stay like that...

until it rotted, you could try all day and never succeed until I tell you how to do it... Or if you

already know about the story of Christopher Columbus, Nikola Tesla, and the egg. I would let you try

until you gave up, then simply stand the egg on end, press down until the egg cracks (but not let the inner sack break)

and the egg will stand until it rots, or you throw it away... or eat it lol

The point of comparing these two stories is to show that there can be more than one acceptable solution,

to the goal of your code.

Christoper Columbus Egg Story Wiki

Prof. Dr. J. W. Kolar's 'Tesla’s Egg of Columbus:...'

Steam Version Users

[Steam Version NOTE]
EDITED: If you have the Steam Version, I recommend trying to get a refund and buying it
Threw the KSP store. I am done with Steam! Im in the process of removing Steam
and, it looks like I will have to re-purchase some software I bought threw them.

I had the Steam version of the game, and i ran it in Steam most of the time.
If you have the Steam version of KSP, you do not have to run it from the Steam Folder.
I have found that sometimes the game will run from c:\(your folder name)\ Kerbal Space Program
when you have problems with a mod and the game crashes from the Steam install location.

I am still not sure what causes the crash but i think it is the Steam Overlay (when your
mods messing up and your game is unstable because of it). So if using Steam, and your game crashs,
try running it from a different location so you can get to debugging, might save you some time. Or you
can try to get a refund and buy it from the KSP store.

2. Allowed sub-folders


a. Textures - Your texture must be in the folder labeled Textures. (a drawing for the game)
That "s" is important, tiny things like that will corrupt your part.

b. Resources - your model mesh (usually a .dae) Your part.DAE is simply your exported mesh and
its collision

c. Parts - Part.CFG is your text config file correlating all of your names (case sensitive) so the
game can run from the locations.

d. sounds - If you wish to include sounds, an additional folder named "sounds" should be created.

Step 3 - Creating The Asset (Asset being the modifcation, or mod, that you are making in the game)

A. Some things to keep in your mind while creating an asset(s);

Triscount, Unwrapping, Textures, and Boundingbox (Collision mesh)


1. Triscount
a. Tris are what every model is made out of in any 3D game to date.
No matter what program you use a game engine will split your model into the smallest geometric
shape; a triangle. This should be your unit of measure when judging the complexity of a model.
The vanilla, or stock parts, default pieces issued with the game are the best judge for what the
KSP is built for, and the mod packs on the forums are the best judge for what the limit is.

b. The triscount for most of the stock pieces are around 300 tris for small pieces like the
TT-38K Radial Decoupler, and 2000 tris for pieces like the LV-T30 Liquid Fuel Engine
and a general 1000 tris count for the boosters, fuel tanks, and pods.

c. When assessing your tris count it's necessarily to keep in mind you want an optimized number.
You want to have the lowest tricount possible, without taking away from the integrity of the
model's silhouette.

d. When modeling one can get lost in adding detail, and whilst finishing up its important to give
your model a twice over. Don't feel bad if you aren't quite satisfied with your model:
remember that what gives a soul to the model really is the texture.

Step 4 - Creating The Collision Mesh

2. Boundingbox (Collision mesh)



a. This will be the object KSP uses to calculate collisions and physics with respect to your part.

It is simply a matter of creating another separate mesh in the program you are using that has a
reasonably close resemblance to the object you have made. It must be convex, and must NOT
be parented/joined to the main mesh.

b. This collision mesh is to be called -

"node_collider"

Once it is named, add one empty material to it, and you are set to go.

Step 5 - Unwrapping Your Asset


- This step varies from program to program. Refer to your program's documentation to make sure.

1. Essentially, this part binds the faces of your model to a specific spot in your texture file.
There really isn't much to be said about this; experience is what makes good unwraps.

2. Once you have distributed the faces around the UV plan, make sure to make a render/snapshot
of the UV position, saving the resulting image in a PNG file that has a format in powers of two
(128x128 or 256x256 is ideal, 512x512 for high-detail meshes. 1024x1024 is beginning to be a bit large.)

**Location of the UV unwrapping tool in...

Maya: Polygon menu set, upper left. There's an icon for it at the very end of the lane.

3ds Max: Select an object or a group of objects. Open Modifiers menu, on the right, and select UV Unwrap.
Scroll down, click edit.

Step 6 - Exporting Your Asset


1. Again, it depends on the program, but usually you're going to want to export it using the
COLLADA exporter plugin.
(for Maya and 3ds, it's available on the Autodesk website).

2. Export it as a .dae - although here's a list of things to make sure your plugin is well configured:
a. -Your axes: make sure that the plugin is set to convert your model to the Y-up convention,
else you risk having a sideways model.

b. -The scale: set your plugin to convert your model to a scale of 1unit=1m
(setting the units measurements to meters) or You're going to have
an oversized/undersized model.

**************************this is your spot***********************************************

Step 7 - Preliminary configuration

1. At this point, you may open the part.cfg to allow partslab to load it (refer to this tutorial for the format).

>> http://wiki.kerbalspaceprogram.com/wiki/User:Greys/The_CFG_File_and_ConfigNodes

>>

>> **this is another page explaining CFG_File and ConfigNodes** http://wiki.kerbalspaceprogram.com/wiki/User:Greys/The_CFG_File_and_ConfigNodes


>>*************************************************************************************************************************************************
>> Tutorials >> [URL]http://wiki.kerbalspaceprogram.com/wiki/Tutorials[/URL]
>>
>> Complete up to asset parameters, inclusively - the rest isn't too important for now.
>>
>>> From above - Preliminary configuration - [URL]http://wiki.kerbalspaceprogram.com/wiki/CFG_File_Documentation[/URL]

I. Basic Part Making Guidelines
A. Ensure that the model itself will not break the game on loading:
B. The file must be a .dae file.
C. Everyâ€â€even the collision meshâ€â€mesh must have a material.
D. The parts must be correctly named; e.g., the collision mesh should always be called "node_collider"

E. Ultimately KSP will need a .mu file to load the file into the Game Database.
Unity contains a .mu exporting function with the KSP Part Tools.

1. 0.23 PartTools by - Mu - Developer - *might be install issues - this must be added to Unity, then using tools set it to KSP GameData directory.*

a. Here is the link for the 0.23 PartTools package.
[URL]https://kerbalspaceprogram.com/parttools/PartTools023.zip[/URL]
Not much else has changed really but will now let you export .mu files with KSPParticleEmitters for use in your mods.

b. KSPParticleEmitter was built because Unity particle emitters are notoriously hard to script and serialize.
It was impossible to save/load them from files without a wrapper of some kind.
Sadly it does lead to some limitations in the space orientation and spawning of the particles.
However for simple thrust and rcs jets it should be fine.
If Unity ever open the particle emitters up to be able to script for them properly then we will update KSPParticleEmitter
to match.

c. If you require more extreme particle emitters then you will need UnityPro and AssetBundles to export them,
alternatively you can spawn our inbuilt ones via code. -- might be

2. PartTools - from README within package - ??0.20 WTF?? this is 0.23 - ok whatever---

a. Overview -
PartTools has had a refresh and is now a lot easier to use. It comes in precompiled dlls and a nicer directory structure
and supports some more advanced features. Because of the ability to read another model's textures by name, it no longer
forces renaming of textures to modelXXX. The 'model name' is now used as the actual filename of the model.
Do not add an extension to this field.

b. To make PartTools work -
1. you need to add the new package to Unity and then set your GameData directory via Tools -

2. Tools - >KSP PartTools. This will set the GameData directory and make all paths used in PartTools relative to that.

3. KSPParticleEmitter -
a. PartTools now also supports a particle emitter, KSPParticleEmitter which is included in the PartTools package.
Unity native particle emitters will not work as they are not fully serializable. KSPParticleEmitter
is based upon the legacy particle emitter, see the unity docs for information, however it also
supports a variety of emitter shapes. The KSPParticleEmitter is fully animatable via the standard
unity animation system like other PartTools assets.

b. To create a material for a KSPParticleEmitter use the two included KSP/Particle shaders. There is an alpha blended and additive shader.

4. PropTools - PropTools, the system to create internal spaces for KSP, has had a major rebuild. It can now load and save internal space configs
and also load models and textures of the props and internal spaces. No longer having to use the awful proxy system!

a. If you are working on an existing internal space then open the PartTools window (Tools->KSP PartTools), set the game's GameData
directory and then you can instantiate internal spaces and props via that window.

b. If you are creating a new internal space then you currently need to create an INTERNAL config manually. That can then be loaded by PartTools.

NOTE: Always keep the PartTools window open as it assists in prop selection to sidestep a Unity editor bug.

II. Part file creation -

A. Save an empty notepad file, which will become the .cfg
in the directory of your addonâ€â€usually "
../KerbalSpaceProgramDirectory/Parts/yourAddon".

This empty file will become the .cfg (your config file)

B. Config file order -

PART {

// Title
// Name of your part
//

// --- general parameters ---

// --- asset parameters ---

// --- node definitions ---

// --- FX definitions ---

// --- Sound FX definition ---

// --- editor parameters ---

// --- attachment rules: stck, srfAttach, allowStack, allowSrfAttach, allowCollision ---

// --- standard part parameters ---

// --- specific part parameters ---

MODULE {

// ---specific module parameters ---

}

// --- other MODULEs ---

}

note - The slashes before each title indicate that the line thereof has been commented out; the program ignores such lines. (rem lines)

C. Title -

1. Atop most part files are a couple of lines that resemble the ones below:

// Kerbal Space Program - Configuration file
// My super awesome engine that can go at a kajillion miles per hour, lol

2. These lines are useful when others want to learn from your part file.
The first line states that this file is a part file for KSP; the second states its name.

// Kerbal Space Program - Part CFG file
// Mark V Rocket Engine

>> Onwards!

D. General Parameters -

// --- general parameters ---

1. This section follows the title and describes several properties of all parts. Below is a list of what goes under General Parameters:

name = solidBooster
//Leave this next line as is unless you have a reason
module = Part
author = Il Carnefice

a. name - It can be anything that is unique, one word, and without an underscore;
it's not commented out because KSP will internally (the user will not see this name) thus refer to the part.

name = solidBooster

b. module - This used to describe the specific part class behavior but now this is handled by the Module tags later in the file.
Set it to Part.

module = Part

d. author - Author name

e. Parts -

Part Name Description

SolidRocket Resembles a solid rocket booster - a continually burning rocket that lacks thrust control and
cannot be deactivated once lit.

LiquidEngine Resmebles an orbital maneuvering system - a rocket engine with controllable thrust.

FuelTank Contains fuel.

CommandPod Contains crew and a control system.

SASModule Holds course.

SASModule2 ???

Strut Connects rocket parts. Has no special abilities.

Decoupler Connects rocket parts and can jettison itself and the parts it's connected to.

RadialDecoupler Connects and can jettison parts much as does a Decoupler, but radially.

Parachutes Deploys a parachute.

ControlSurface Movable wing-like surface. Can act as a rudder, aileron, elevator, canard or other
aerodynamic control surface - function depends on placement on a ship.

WarpEngine A warp engine. Not functional as of 0.15.2.

Winglet A fixed, lifting part.

Stabilizer Similar to ControlSurface (recommend to not use)

StrutConnector ???

RCSFuelTank A RCS tank.

RCSModule A RCS thruster.

AtmosphericEngine Atmospheric engine with air flow parameters.

AdvSASModule An SAS-type module that alters user input allowing for control of RCS, pod torque,
gimballing engines and control surfaces.

DecouplerGUI A normal decoupler that can be disconnected via the right-click GUI.

DockingPort An unfinished docking port?

FuelLine Transfers fuel.

FuelTankGUI A fuel tank with a right-click GUI to disable flow.

LandingLeg A moving landing leg, using .cfg parameters to move.

HLandingLeg A moving landing leg, using animations to move.

HParachutes An animated parachute module?

LandingGear Wheeled, animated landing gear for spaceplanes.

SatELight A flash-light module.

LiquidFuelEngine A liquid fuel engine that uses Thrust and Isp, rather than Thrust and fuel units.

>>> f. Part Modules - Please read: "0.15 code update - PartModule, KSPField, KSPEvent, ConfigNode and PartResource"
>>>
>>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

***************************************this is your place***********************************************************

Step 8 - Texturing your Asset


1. Open your UV render in your image editing program of choice
(I personally recommend Gimp or Photoshop, but MSPaint is fine too).
2. Get artistic, following the lines of the UV map so it actually shows on your model.
3. Save it the same format, but try not overwriting the UV - it's always handy to have.
4. Again, here, there is only experience which will make you good
- although a quick tip: premade textures are quite handy to have
(such as metal textures and such) if you're feeling lazy/unambitious/unskilled.
Trial and error is quite often used here.

**** 5. You may use the PartLab, available on the download page, to check the progress/if it's right.
Some say it's possible to do so before exporting the model by importing the texture into the 3d modelling program,
but I have never found out how. Keep me updated (Killerhurtz on the forums) on how to do this if you figure it out.
side note - Nutt007 Capsule Communicator - PartLab is very out dated, and probably cannot read .mu.
I recommend not using it 11th October 2012, 12:30 #2
***********************************************************************************************


Step 9 - Back to the config

1. Now that you're satisfied with your texture, it's time to finalize your .cfg file.
Again, refer to the documentation as to how to outfit it.

2.Quick tips:
a. -NODES- Having your mesh open can help setting the different nodes
(under 3ds Max, there is even a plugin to get the correct, high-accuracy node vector available with the SDK).
b. The angles aren't really angles: they show the second point of a line with which the model is going to align itself.

c. -EFFECTSâ€â€Graphical effects You may refer to this thread for a list of effects you may use for your parts. (dead link)

Step 10 - The Last Checkup and the preparation

1. Now, in theory, you should have your full part.
However, don't get ahead of yourself - you'll only attract shrapnel if you jump right in.
Be sure to test your part thoroughly
(an easy way to do this is to have a clean install dedicated to testing new parts to make sure it works
before sending it into your main install).

2. Tweak it as you want it to feel.
Once you're satisfied, make sure to take a few screenshots of what your part(s) look like.
Upload your pictures and part(s) somewhere, and save the links.
(I wouldn't recommend dropbox - too high traffic might get your public folder disabled for sharing)

3. Once all of this is done, you may proceed to...

Step 11 - The Release

1. Using the links you have previously acquired, make a thread in the Projects and Release section of the KSP forums.
Post it, wait, and bask in your newfound success!


*********************************************************************************************************************************************************

- Preliminary configuration - [URL]http://wiki.kerbalspaceprogram.com/wiki/CFG_File_Documentation[/URL]

I. Basic Part Making Guidelines
A. Ensure that the model itself will not break the game on loading:
B. The file must be a .dae file.
C. Everyâ€â€even the collision meshâ€â€mesh must have a material.
D. The parts must be correctly named; e.g., the collision mesh should always be called "node_collider"

E. Ultimately KSP will need a .mu file to load the file into the Game Database.
Unity contains a .mu exporting function with the KSP Part Tools.

1. 0.23 PartTools by - Mu - Developer - *might be install issues - this must be added to Unity, then using tools set it to KSP GameData directory.*

a. Here is the link for the 0.23 PartTools package.
[URL]https://kerbalspaceprogram.com/parttools/PartTools023.zip[/URL]
Not much else has changed really but will now let you export .mu files with KSPParticleEmitters for use in your mods.

b. KSPParticleEmitter was built because Unity particle emitters are notoriously hard to script and serialize.
It was impossible to save/load them from files without a wrapper of some kind.
Sadly it does lead to some limitations in the space orientation and spawning of the particles.
However for simple thrust and rcs jets it should be fine.
If Unity ever open the particle emitters up to be able to script for them properly then we will update KSPParticleEmitter
to match.

c. If you require more extreme particle emitters then you will need UnityPro and AssetBundles to export them,
alternatively you can spawn our inbuilt ones via code. -- might be

2. PartTools - from README within package - ??0.20 WTF?? this is 0.23 - ok whatever---

a. Overview -
PartTools has had a refresh and is now a lot easier to use. It comes in precompiled dlls and a nicer directory structure
and supports some more advanced features. Because of the ability to read another model's textures by name, it no longer
forces renaming of textures to modelXXX. The 'model name' is now used as the actual filename of the model.
Do not add an extension to this field.

b. To make PartTools work -
1. you need to add the new package to Unity and then set your GameData directory via Tools -

2. Tools - >KSP PartTools. This will set the GameData directory and make all paths used in PartTools relative to that.

3. KSPParticleEmitter -
a. PartTools now also supports a particle emitter, KSPParticleEmitter which is included in the PartTools package.
Unity native particle emitters will not work as they are not fully serializable. KSPParticleEmitter
is based upon the legacy particle emitter, see the unity docs for information, however it also
supports a variety of emitter shapes. The KSPParticleEmitter is fully animatable via the standard
unity animation system like other PartTools assets.

b. To create a material for a KSPParticleEmitter use the two included KSP/Particle shaders. There is an alpha blended and additive shader.

4. PropTools - PropTools, the system to create internal spaces for KSP, has had a major rebuild. It can now load and save internal space configs
and also load models and textures of the props and internal spaces. No longer having to use the awful proxy system!

a. If you are working on an existing internal space then open the PartTools window (Tools->KSP PartTools), set the game's GameData
directory and then you can instantiate internal spaces and props via that window.

b. If you are creating a new internal space then you currently need to create an INTERNAL config manually. That can then be loaded by PartTools.

NOTE: Always keep the PartTools window open as it assists in prop selection to sidestep a Unity editor bug.

II. Part file creation -

A. Save an empty notepad file, which will become the .cfg
in the directory of your addonâ€â€usually "
../KerbalSpaceProgramDirectory/Parts/yourAddon".

This empty file will become the .cfg (your config file)

B. Config file order -

PART {

// Title
// Name of your part
//

// --- general parameters ---

// --- asset parameters ---

// --- node definitions ---

// --- FX definitions ---

// --- Sound FX definition ---

// --- editor parameters ---

// --- attachment rules: stck, srfAttach, allowStack, allowSrfAttach, allowCollision ---

// --- standard part parameters ---

// --- specific part parameters ---

MODULE {

// ---specific module parameters ---

}

// --- other MODULEs ---

}

note - The slashes before each title indicate that the line thereof has been commented out; the program ignores such lines. (rem lines)

C. Title -

1. Atop most part files are a couple of lines that resemble the ones below:

// Kerbal Space Program - Configuration file
// My super awesome engine that can go at a kajillion miles per hour, lol

2. These lines are useful when others want to learn from your part file.
The first line states that this file is a part file for KSP; the second states its name.

// Kerbal Space Program - Part CFG file
// Mark V Rocket Engine

>> Onwards!

D. General Parameters -

// --- general parameters ---

1. This section follows the title and describes several properties of all parts. Below is a list of what goes under General Parameters:

name = solidBooster
//Leave this next line as is unless you have a reason
module = Part
author = Il Carnefice

a. name - It can be anything that is unique, one word, and without an underscore;
it's not commented out because KSP will internally (the user will not see this name) thus refer to the part.

name = solidBooster

b. module - This used to describe the specific part class behavior but now this is handled by the Module tags later in the file.
Set it to Part.

module = Part

d. author - Author name

e. Parts -

Part Name Description

SolidRocket Resembles a solid rocket booster - a continually burning rocket that lacks thrust control and
cannot be deactivated once lit.

LiquidEngine Resmebles an orbital maneuvering system - a rocket engine with controllable thrust.

FuelTank Contains fuel.

CommandPod Contains crew and a control system.

SASModule Holds course.

SASModule2 ???

Strut Connects rocket parts. Has no special abilities.

Decoupler Connects rocket parts and can jettison itself and the parts it's connected to.

RadialDecoupler Connects and can jettison parts much as does a Decoupler, but radially.

Parachutes Deploys a parachute.

ControlSurface Movable wing-like surface. Can act as a rudder, aileron, elevator, canard or other
aerodynamic control surface - function depends on placement on a ship.

WarpEngine A warp engine. Not functional as of 0.15.2.

Winglet A fixed, lifting part.

Stabilizer Similar to ControlSurface (recommend to not use)

StrutConnector ???

RCSFuelTank A RCS tank.

RCSModule A RCS thruster.

AtmosphericEngine Atmospheric engine with air flow parameters.

AdvSASModule An SAS-type module that alters user input allowing for control of RCS, pod torque,
gimballing engines and control surfaces.

DecouplerGUI A normal decoupler that can be disconnected via the right-click GUI.

DockingPort An unfinished docking port?

FuelLine Transfers fuel.

FuelTankGUI A fuel tank with a right-click GUI to disable flow.

LandingLeg A moving landing leg, using .cfg parameters to move.

HLandingLeg A moving landing leg, using animations to move.

HParachutes An animated parachute module?

LandingGear Wheeled, animated landing gear for spaceplanes.

SatELight A flash-light module.

LiquidFuelEngine A liquid fuel engine that uses Thrust and Isp, rather than Thrust and fuel units.

>>> f. Part Modules - Please read: "0.15 code update - PartModule, KSPField, KSPEvent, ConfigNode and PartResource"
>>>

Official PartModule Documentation

Welcome to the 0.15 patch.

I want to outline a number of new bits that have come in and show you how to use them. These bits have filtered down from the new code which has been written to be easier to work with and easier to expand.


Please note that modding functionality has not changed at all.
You can continue to use whatever interface you were using, and everything currently, should be backwards compatible.

However we are moving away from functional code in Part for reasons outlined below.

II - What and why

Firstly however I want to talk about the reasons for the change so you can understand (and comment on) the

direction moving to 0.16 and beyond.


Originally KSP was designed as a single-vessel orbital physics game.

As the success of the project increased, people obviously wanted more, so more features were added
into the code. (Multiple vessels, etc.)

The community plugin development also wasn't originally planned and was tacked on at some point.

All these factors combined means that the core code is not easy for us to expand upon or,
easy for you lot to write plugins for.

No doubt we all have big plans for KSP and to implement them properly we need to expand
the base and make it fit for purpose.

Note - Personally, I am doing all my modding in the 64bit version of KSP, its time folks! I have been trying to
to use only 64bit programs for the last 2 computers (about 10 years now). x64 is not new anymore
and its freakn AWESOME. Things do have to be just right, i guess, (from some of the issues I have seen)
but i don't seem to be having those issues. I have had my game, in x64, with up to 10.3Gb loaded into
memory. Granted, not all the mods were working together correctly, but the game was running, decently,
even with all the errors (I had well over 100 mods added to the game). The 32 bit version can not handle
1/4 of what the 64bit version can, from what I have seen personally.

This is my current x64 mod list.

ModlistPic_zpsbc75f676.png

With all my custom textures, this just can't run in 32-bit but it is running nicely in x64.

I had to do a few things to get them to work, so don't expect that

you can just download these mods and they will automatically all work together.

(not getting into what I did for them all to work... mainly cuz i don't remember everything I did lol)

I am not finished adding mods to this either. When this game is finished loading, Im sitting at 5.9Gb

used memory and the game is stable!

Note2 - If everyone can get use to accomplishing tasks within their mods, in the same way and order, the code will flow

better and the game will be more stable, in my opinion.

So the plan has been to abstract what a Part and a Vessel actually are.

A Vessel =


A vessel is a collection of connected parts, but with some orbit stuff tacked on.

- Vessel gets split into PartAssembly (a list of Parts) and Vessel (some orbit stuff).

- Having PartAssembly seperate from Vessel means that we can create other types of groups of parts.
- Internal spaces, virtual cockpits, kerbal personalities, buildings, etc. Thus one editor screen can
function as an editor for all types of assembly.

A part =


A part is a physical object which can be connected to another, also has some code tacked on too.

- Part gets split into Part (model & physical connection) and PartModule (functional code).

- Having PartModule seperate from Part means we get to a smaller group of core parts which just define
types of attachment logic and they can be have many (or none) code behaviours layered onto it.

A PartModule


Basically a PartModule, Part or Vessel can send messages to things and recieve events from things.

code module ideally should be coded that it is ignorant of anything outside it. There are cases where you
may want a group of modules to communicate with eachother, these can either be done with the messaging
or ofc through direct references as before.



D. Defining attributes in your module code of KSPEvent (on methods) or KSPField (on fields) exposes that
event/field to the internal reflection. These attributes also contain data for linking the event/field to the
part action gui. You can also alter the values for your event and field attributes at runtime to control the
flow of your code.
- That last bit sounds confusing. When you see it in action later it\'ll sink in.

E. Lastly we need a simple, easy and powerful way of defining configuration files. For this purpose
ConfigNode was born. Its an incredibly simple recursive node/value list and can be used a few ways.
It contains all the code for reading and writing all the config files for the game.

1. PartModule - So, the long awaited PartModule class.

a. This is a piece of code which can be attached to any Part in its config file. You can add as many as you like and add
multiple of the same type should you need to. They are added to the Part GameObject itself and you still have access to
part and vessel directly from PartModule.

b. PartModules are very simple and currently contain only 6 overrides (compared to Part\'s.. err.. 34).
Here is a PartModule showing all of its overrides in place...
[Spoiler: code]
--------------------------------------------------------------------------------------------------------------------------------------------------------

public class ModuleTest : PartModule
{
/// <summary>
/// Constructor style setup.
/// Called in the Part\'s Awake method.
/// The model may not be built by this point.
/// </summary>
public override void OnAwake()
{
}

/// <summary>
/// Called during the Part startup.
/// StartState gives flag values of initial state
/// </summary>
public override void OnStart(StartState state)
{
}

/// <summary>
/// Per-frame update
/// Called ONLY when Part is ACTIVE!
/// </summary>
public override void OnUpdate()
{
}

/// <summary>
/// Per-physx-frame update
/// Called ONLY when Part is ACTIVE!
/// </summary>
public override void OnFixedUpdate()
{
}

/// <summary>
/// Called when PartModule is asked to save its values.
/// Can save additional data here.
/// </summary>
/// <param name='node'>The node to save in to</param>
public override void OnSave(ConfigNode node)
{
}

/// <summary>
/// Called when PartModule is asked to load its values.
/// Can load additional data here.
/// </summary>
/// <param name='node'>The node to load from</param>
public override void OnLoad(ConfigNode node)
{
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------

Defining Attributes in your modification.

 
Defining attributes in your module code of KSPEvent (on methods) or KSPField (on fields) exposes that
event/field to the internal reflection.

These attributes also contain data for linking the event/field to the part action gui.
You can also alter the values for your event and field attributes at runtime to control the
flow of your code.
- That last bit sounds confusing. When you see it in action later it'll sink in.

Defining configuration files -


Lastly we need a simple, easy and powerful way of defining configuration files. For this purpose
ConfigNode was born. Its an incredibly simple recursive node/value list and can be used a few ways.
It contains all the code for reading and writing all the config files for the game.

PartModule - So, the long awaited PartModule class.


-This is a piece of code which can be attached to any Part in its config file.
-You can add as many as you like. You can also add more than one of the same type should you need to.
-They are added to the Part GameObject itself and you still have access to both, part and vessel, directly from PartModule.

PartModules are very simple and currently contain only 6 overrides (compared to Part\'s.. err.. 34).

Here is a PartModule showing all of its overrides in place -


--------------------------------------------------------------------------------------------------------------------------------------------------------

public class ModuleTest : PartModule
{
/// <summary>
/// Constructor style setup.
/// Called in the Part\'s Awake method.
/// The model may not be built by this point.
/// </summary>
public override void OnAwake()
{
}

/// <summary>
/// Called during the Part startup.
/// StartState gives flag values of initial state
/// </summary>
public override void OnStart(StartState state)
{
}

/// <summary>
/// Per-frame update
/// Called ONLY when Part is ACTIVE!
/// </summary>
public override void OnUpdate()
{
}

/// <summary>
/// Per-physx-frame update
/// Called ONLY when Part is ACTIVE!
/// </summary>
public override void OnFixedUpdate()
{
}

/// <summary>
/// Called when PartModule is asked to save its values.
/// Can save additional data here.
/// </summary>
/// <param name='node'>The node to save in to</param>
public override void OnSave(ConfigNode node)
{
}

/// <summary>
/// Called when PartModule is asked to load its values.
/// Can load additional data here.
/// </summary>
/// <param name='node'>The node to load from</param>
public override void OnLoad(ConfigNode node)
{
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------

Note - check this link when you start writing from scratch: (the page is blank at this time, not sure what happened to what was there)

Looks rather simple doesnt it and thats because it is.

Its not set in stone and if we need more we can add them.

In reality I hope you only have to use very few of those overrides for any given module.

Most of the loading and saving will be taken care of by KSPField attributes unless you want to save complicated stuff.

Unity -


You can use any Unity MonoBehaviour method apart from Awake.

You can use OnDestroy as a destructor.

Update and FixedUpdate, are perfectly fine, but there is no guarantee of having a
rigidbody attached in the standard FixedUpdate.
(you should check if the part is controllable first)

Example #1 - KSPEvents and KSPFields -

So lets look a more complicated example with communication between two modules and some KSPEvent/KSPField malarky.

Here is ModuleCommand.

It would sit on a command pod and scream orders to everything else. In this case it just screams one order, InputGearToggle.


[Spoiler: code]
______________________________________________________________________________________________________________

public class ModuleCommand : PartModule
{
public override void OnUpdate()
{
if (FlightInputHandler.state.gearDown || FlightInputHandler.state.gearUp)
{
part.SendEvent('InputGearToggle');
}
}
}
__________________________________________________________________________________________________________

key feature of ModuleCommand -


The key feature of ModuleCommand is part.SendEvent(evtName) this tells its host part to send an event into the assembly.

The Part sends the event to all of its modules and all of its attached neighbours, who in turn send it to their modules, ad infinitum.

So we need something to respond to that order.

Here is ModuleAnimatorLandingGear. Technically it doesnt animate anything. It just changes a float from 0 to 1 and renames its gui event to reflect its current state.


-------------------------------------------------------------------------------------------------------------------------------------------------------
public class ModuleAnimatorLandingGear : PartModule
{
[KSPField]
public float gearExtension = 0f;

[KSPEvent(guiActive = true, guiName = 'Toggle Gear')]
public void InputGearToggle()
{
if (gearExtension == 0f)
{
gearExtension = 1f;

Events['InputGearToggle'].guiName = 'Retract gear';
}
else
{
gearExtension = 0f;

Events['InputGearToggle'].guiName = 'Extend gear';
}
}

public override void OnLoad(ConfigNode node)
{
if (gearExtension == 0f)
{
Events['InputGearToggle'].guiName = 'Extend gear';
}
else
{
Events['InputGearToggle'].guiName = 'Retract gear';
}
}
}
_________________________________________________________________________________________________________________________________________________________

Therefore..

'All very well and good', you say, 'but its a complicated horrible mess of interconnectedness how are we gonna deal with that?

Eh? Eh?!'. A fine question, ignorance is bliss, data and structure should be on a need to know basis.

Mu, "Having to learn how a specific thing works is a chore."

So to deal with this is an in built event messaging system. It deals, from your point of view, in strings.

(It doesnt ofc, it uses pre-reflection and ints for lil extra performance).

Plenty new going on here!

- We have one field, gearExtension which has the KSPField attribute applied.

- This makes this field persistant and it will be written to/from any saves as required.

- After KSPFields are parsed by PartModule then the OnLoad method is fired.

- As we have nothing else to load, we use OnLoad as a method for working out

- what to do with our data. In this instance that means setting the event

- gui name to be correct.


The limitation for adding the KSPField attribute is that it can only be applied to classes
which implement the IConfigNode interface or one of the types;
- string, bool, int, float, Vector2, Vector3, Vector4 or Quaternion
([URL="https://github.com/Anatid/XML-Docume...c/KSPField.cs]"]more on this later[/URL] )

Here KSPField attribute from the game source..


-------------------------------------------------------------------------------------------------------------------------------------------------------
/// <summary>
/// Attribute applied to fields to make them persistant or available to the part action GUI
///
/// Automatic persistance can only be applied to types which implement the IConfigNode interface or
/// one of the following..
/// string, bool, int, float, Vector2, Vector3, Vector4 or Quaternion
/// </summary>
[System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = false)]
public class KSPField : System.Attribute
{
/// <summary>
/// Is this field persistant?
/// </summary>
public bool isPersistant;

/// <summary>
/// Is this field active on gui
/// </summary>
public bool guiActive;

/// <summary>
/// Is this field active on gui
/// </summary>
public string guiName;

/// <summary>
/// Is this field active on gui
/// </summary>
public string guiUnits;

/// <summary>
/// The gui format string for this field (D4, F2, N0, etc). Blank if none
/// </summary>
public string guiFormat;

/// <summary>
/// string category id
/// </summary>
public string category;

public KSPField()
{
this.isPersistant = true;
this.guiName = '';
this.guiUnits = '';
this.guiFormat = '';
this.category = '';
}
}
________________________________________________________________________________________________________________________________________________________

Method - InputGearToggle


The method InputGearToggle has the KSPEvent attribute applied.
This makes this event able to be internally reflected and recieve events thus is the entry point for most functionality.
It will be fired in response to the ModuleCommand\'s part.SendEvent.

KSPEvent also makes this method available to the gui in form of a labelled button. You can change the guiActive, guiName or any
other KSPEvent value at run time by using the Events list.

- Here is the KSPEvent attribute from the game source..


/// <summary>
/// Tells the compiler that this method is an action and allows you to set up
/// the KSP specific stuff.
/// ** REQUIRED BY ALL ACTION METHODS **
/// </summary>
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = true)]
public class KSPEvent : System.Attribute
{
/// <summary>
/// The external name of this action
/// </summary>
public string name;

/// <summary>
/// Is this action assigned as the part\'s default?
/// * Will override any previous default *
/// </summary>
public bool isDefault;

/// <summary>
/// Is this action initially active?
/// </summary>
public bool active;

/// <summary>
/// Is this action available to the user?
/// </summary>
public bool guiActive;

/// <summary>
/// The guiIcon name (guiAction must be true)
/// </summary>
public string guiIcon;

/// <summary>
/// The gui name for this action (userAction must be true)
/// </summary>
public string guiName;

/// <summary>
/// A string category id so can display all actions of certain types
/// </summary>
public string category;


public KSPEvent()
{
this.name = '';

this.isDefault = false;
this.active = true;
this.allowStaging = false;
this.autoStaging = false;
this.guiActive = false;
this.guiIcon = '';
this.guiName = '';
this.category = '';
}
}

Re: 0.15 code update - PartModule, KSPField, KSPEvent and ConfigNode

**** Example #2 - IConfigNode and ConfigNode

Ok so time for something more meaty.

Here is my take on an aerodynamic lift module.

It uses a class called FloatCurve to create the lift/drag vs angle of attack graphs for standard aerofoils.

FloatCurve also implements IConfigNode so it can be used with KSPField.


public class ModuleAerodynamicLift : PartModule
{
/// <summary>
/// Planform area of lifting surface in m^2
/// </summary>
[KSPField]
public float planformArea = 10f;


/// <summary>
/// Overall lift factor for this wing
/// </summary>
[KSPField]
public float liftFactor = 1f;

/// <summary>
/// Overall drag factor for this wing
/// </summary>
[KSPField]
public float dragFactor = 1f;


/// <summary>
/// FloatCurve of lift vs angle of attack. Angle is abs cosine of angle (0 -> 1)
/// </summary>
[KSPField]
public FloatCurve liftAoA;


/// <summary>
/// FloatCurve of drag vs angle of attack. Angle is abs cosine of angle (0 -> 1)
/// </summary>
[KSPField]
public FloatCurve dragAoA;


/// <summary>
/// Model transform name for center of lift
/// </summary>
[KSPField]
public string centerOfLiftTransformName;


/// <summary>
/// grabbed OnStart from the model transform named liftTransformName
/// </summary>
public Transform centerOfLiftTransform;


/// <summary>
/// Sets up the float curves if they\'re not already set up
/// </summary>
public override void OnAwake()
{
if (liftAoA == null)
liftAoA = new FloatCurve();
if (dragAoA == null)
dragAoA = new FloatCurve();
}

/// <summary>
/// Grabs center of lift transform from model
/// </summary>
/// <param name='state'></param>
public override void OnStart(StartState state)
{
if (centerOfLiftTransform == null)
{
centerOfLiftTransform = part.FindModelTransform(centerOfLiftTransformName);

if (centerOfLiftTransform == null)
Debug.LogError('ModuleAerodynamicLift: liftTransform is null!');
}
}

/// <summary>
/// Calculates and applied the lift/drag force from the aerofoil
/// </summary>
public override void OnFixedUpdate()
{
if (centerOfLiftTransform == null)
return;

Vector3 force = CalculateForce();

part.Rigidbody.AddForceAtPosition(force, centerOfLiftTransform.position, ForceMode.Force);
}

/// <summary>
/// Calculates lift/drag according the simple aerofoil equations...
/// Lift: L = (CL)(1/2)(dens)(V^2)(area) or L = (CL)(q)(S) q(dyn pressure) = (1/2)(dens)(V^2)
/// Drag: D = (CD)(1/2)(dens)(V^2)(area) or D = (CD)(q)(S)
/// </summary>
/// <returns>Overall force vector</returns>
private Vector3 CalculateForce()
{
// grab world point and relative velocity
Vector3 worldVelocity = part.Rigidbody.GetPointVelocity(centerOfLiftTransform.position);

// note we use centerOfLiftTransfrom from the model to calculate relative. This will take into account any part mirroring
Vector3 relativeVelocity = centerOfLiftTransform.InverseTransformDirection(worldVelocity);
Vector3 velocityNorm = relativeVelocity.normalized;


// only need the speed squared - saves us a square root
float speedSqr = relativeVelocity.sqrMagnitude;


// calc the angle of attack
float vDot = Vector3.Dot(velocityNorm, centerOfLiftTransform.up.normalized);
float vDotNorm = (vDot + 1f) * 0.5f;

float absVDot = Mathf.Abs(vDot);
float abs1MVDot = 1f - absVDot;


// dynamic pressure
float dynPressure = 0.5f * (float)vessel.atmDensity * speedSqr;

// calc coefficient of lift and drag from the factors and the float curves
float cL = liftFactor * liftAoA.Evaluate(abs1MVDot);
float cD = dragFactor * dragAoA.Evaluate(abs1MVDot);

// calc lift, drag and add to get overall
Vector3 lift = centerOfLiftTransform.up * (cL * dynPressure * planformArea);
Vector3 drag = -(worldVelocity.normalized) * (cD * dynPressure * planformArea);
Vector3 force = lift + drag;


// some debug stuff
string str = '';
str += 'AoA: ' + abs1MVDot;
str += ' cL: ' + cL;
str += ' cD: ' + cD;
Debug.Log(str);

Debug.DrawLine(centerOfLiftTransform.position, centerOfLiftTransform.position + lift * 100f, Color.green);
Debug.DrawLine(centerOfLiftTransform.position, centerOfLiftTransform.position + drag * 100f, Color.cyan);
Debug.DrawLine(centerOfLiftTransform.position, centerOfLiftTransform.position + worldVelocity * 100f, Color.magenta);


// et voila
return force;
}
}

Really its a very simple module. All of its persistence is handled by its KSPField's and it basically adds lift/drag based on

standard aerofoil model. The FloatCurve class is a Unity AnimationCurve wrapped up in an IConfigNode extending

interface. Remember in order to use KSPField on a class successfully it needs to implement IConfigNode.

http://wiki.kerbalspaceprogram.com/w..._file_creation

http://wiki.kerbalspaceprogram.com/wiki/API:ConfigNode

Here is the IConfigNode interface. It requires two methods.

1. Load(ConfigNode)

2. Save(ConfigNode)


/// <summary>
/// Can this item be saved using a KSPField persitance object. KSPField creates a subnode for this type
/// </summary>
public interface IConfigNode
{
void Load(ConfigNode node);

void Save(ConfigNode node);
}

The implementing class must be able to be instantiated blind and then have OnLoad called to load its values in.

ConfigNode consists of a recursive node/value list.

In essence it looks like this.

public class ConfigNode
{
public string name;
public List<ConfigNode> nodes;
public List<ConfigNode.Value> values;

public class Value
{
public string name;
public string value;
}
}

For loading use; HasValue, GetValue, GetValues, HasNode, GetNode & GetNodes

For saving use; AddValue or AddNode

Every value you add is a string and should be parsable to/from what you set it to.

Now lets have a look in FloatCurve to see that in action..

[system.Serializable]

public class FloatCurve : IConfigNode

{

[serializeField]

private AnimationCurve fCurve;

public float minTime { get; private set; }

public float maxTime { get; private set; }

public FloatCurve()

{

fCurve = new AnimationCurve();

minTime = float.MaxValue;

maxTime = float.MinValue;

}

public void Add(float time, float value)

{

fCurve.AddKey(time, value);

minTime = Mathf.Min(minTime, time);

maxTime = Mathf.Max(maxTime, time);

}

public float Evaluate(float time)

{

return fCurve.Evaluate(time);

}

private static char[] delimiters = new char[] { \' \', \',\', \';\', \'\t\' };

public void Load(ConfigNode node)

{

string[] values = node.GetValues('key');

int vCount = values.Length;

string[] valueSplit;

for (int i = 0; i < vCount; i++)

{

valueSplit = values.Split(delimiters, System.StringSplitOptions.RemoveEmptyEntries);

if (valueSplit.Length < 2)

{

Debug.LogError('FloatCurve: Invalid line. Requires two values, \'time\' and \'value\'');

}

Add(float.Parse(valueSplit[0]), float.Parse(valueSplit[1]));

}

}

public void Save(ConfigNode node)

{

for (int i = 0; i < fCurve.keys.Length; i++)

{

node.AddValue('key', fCurve.keys.time + ' ' + fCurve.keys.value);

}

}

}

As you can see it has a list of values called \'key\' and each value is made up of a space separated time/value pair.

I've added extra delimiters into the code because we might forget and comma separate them or something.

Example #3 - part.cfg


So now we get to the point of adding these things into a part\'s config file.
You should know that every config file is parsed by ConfigNode now so can be considered in the node/value list paradigm.

Here is ModuleAerodynamicLift module from example #2 added to the end of DeltaWing\'s part.cfg

[spoiler: code]


MODULE
{
name = ModuleAerodynamicLift
liftFactor = 0.001
dragFactor = 0.001
liftTransformName = CenterOfLift

liftAoA
{
key = 0.0 1
key = 0.2 3
key = 0.4 4
key = 0.6 1
key = 0.7 0
key = 1.0 -1
}
dragAoA
{
key = 0.0 1
key = 0.2 3
key = 0.5 5
key = 0.7 6
key = 1.0 7
}
}

MODULE is a subnode of Part and you can have as many as you like.

This particular module relys on you having the transform named 'CenterOfLift' somewhere in the DeltaWing heirarchy,

which it may not when we go to press. Most of the KSPField values are in the usual style of valueName=value however

you can see how the two IConfigNode implementing FloatCurves are represented as subnodes of the module node.

KSPField will make any IConfigNode implementing class a subnode. Alternatively you can add/find your own

subnodes in the OnLoad or OnSave methods.

In this next example we\'ll add two modules, ModuleAnimatorLandingGear (from Example #1) and an as yet

unknown module called ModuleAnimateHeat.


MODULE
{
name = ModuleAnimatorLandingGear
}
MODULE
{
name = ModuleAnimateHeat
ThermalAnim = HeatAnimationEmissive;
}

Here is ModuleAnimateHeat.


public class ModuleAnimateHeat : PartModule
{
[KSPField]
public string ThermalAnim = 'HeatAnimationEmissive';

public float draperPoint = 525f; // Draper point is when solid objects begin to emit heat.

public AnimationState[] heatAnimStates;

public override void OnStart(StartState state)
{
HeatEffectStartup();
}

public void Update()
{
UpdateHeatEffect();
}

private void HeatEffectStartup()
{
Animation[] heatAnims = part.FindModelAnimators(ThermalAnim);
heatAnimStates = new AnimationState[heatAnims.Length];

int i = 0;
foreach (Animation a in heatAnims)
{
AnimationState aState = a[ThermalAnim];
aState.speed = 0;
aState.enabled = true;

a.Play(ThermalAnim);

heatAnimStates[i++] = aState;
}
}

private void UpdateHeatEffect()
{
float temperatureValue = Mathf.Clamp01((part.temperature - draperPoint) / (part.maxTemp - draperPoint));

foreach (AnimationState a in heatAnimStates)
{
a.normalizedTime = temperatureValue;
}
}
}

This was written to handle all of emissive heat glowing by heated parts. The heat is represented in the models

as animations going from 0->1 (none to full heat)

Conclusion

Well hopefully you learned vaguely how to use PartModule and ConfigNode from all that. It was all written to be

really simple and thus I hope it turns out to be. I\'m always open to questions and feedback, send me a mail if

you really need to. I will hold a few dev sessions over the coming weeks to get some feedback and answer

more detailed questions.

In part #2 I'll talk about resources, how to define them and how to use them.

THANK YOU, TO EVERYONE WHO SHARES THEIR THOUGHTS ABOUT THIS PROJECT.

This still needs a lot of work,

************************************************** ************************************

// JG you need to go threw this b4 moving on:

// http://forum.kerbalspaceprogram.com/...ks-Compilation

http://forum.kerbalspaceprogram.com/...l=1#post156430


Below is my stuff/cut and paste example stuff: IM LEARNING HERE i DO NOT KNOW THIS IS WORKING - SO DON'T USE THIS!!!!
*****************************************************************************************************************************************************
PART {

// Kerbal Space Program - Configuration file - example part config
// Mark V Rocket Engine
//
// Kerbal Space Program - Part CFG file
// Mark V Rocket Engine

// --- General Parameters ---
name = LiquidThrusterV
module = Part
author = YourName

// --- asset parameters ---

// --- node definitions ---

// --- FX definitions ---

// --- Sound FX definition ---

// --- editor parameters ---

// --- attachment rules: stck, srfAttach, allowStack, allowSrfAttach, allowCollision ---

// --- standard part parameters ---

// --- specific part parameters ---

MODULE {

// ---specific module parameters ---

}

// --- other MODULEs ---

}

Edited by Enriched Uranium
Draft 2 *done for the day*
Link to comment
Share on other sites

Uhm, did you just like.... copypasted a few pages from wiki.kerbalspaceprogram.com ?

Like that one for example?

edit: Heh of course you did, there are even reference links left. I'm a bit sleepy.

Did I just got baited?

Im a bit sleepy too, I have learned a lot today and Im about to go play lol.

That is EXACTLY what I have done, including WORKING links where they were broken.... or it goes to relevant information. I think I will put a not on what links were broken and I have provided links to relevant info.

I am including reference links for EVERYTHING because this isn't my work. I just reorganized it and fixed links so I can learn this with less interruptions. I thought Id share what im working on because i wish I could have found something like this when I first started. It COULD have saved me some time, I think.

But like I said, at this point, 99% of this is not my work its just reorganized into an outline.

Im not sure what you mean by asking if you got baited¿

Im just trying to learn this stuff and I think this will help.

Anyway, nice to meet ya dzikakulka.

Link to comment
Share on other sites

First I would like to say that I have NOT edited this for mistakes. I have done ALL of this today and im done for the day but I wanted to get this posted so I don't Forget, remember. lol:sticktongue:

If your aim is to repackage the wiki information, please be very clear about that. It can be insulting to some people when they see their works copied and pasted elsewhere. Also, the whole point of the wiki is for users to be able to edit and update information along the way. Feel free to get an account and update links/info up there. The better the info on the wiki, the more useful it is.

Cheers,

~Claw

Link to comment
Share on other sites

If your aim is to repackage the wiki information, please be very clear about that. It can be insulting to some people when they see their works copied and pasted elsewhere. Also, the whole point of the wiki is for users to be able to edit and update information along the way. Feel free to get an account and update links/info up there. The better the info on the wiki, the more useful it is.

Cheers,

~Claw

My aim is to become proficient in Visual C++ and if this helps other GREAT. Im not trying to repackage anything, Im just trying to learn this. But, I guess I am inadvertently "repackaging" it AND fixing dead or broken links. This could be used to update the links in KSP WiKi when i am done, if i continue.

Im hoping a few people will join me learning because 2 minds are better than one. I am retired and learning this for fun. Please do not be offended if you see your work here! Your work is VERY VALUABLE!!!! And I have sited links to ALL the reference material because i want to make sure your recognized for your work. After all, I could not have learned what I have without it. If I need to site extra recognition, I don't have a problem with that! I wouldn't mind if anyone whos work i am using to learn, follows along and helps me and who ever might join this thread.

nice to meet ya Claw

My intention is NOT to offend anyone.

That is why I said from the start that 99% of this is NOT my work, right now. I will be adding, at least one example of my own.

When I am reading to learn I take notes, I have to, and i do it in an outline. I realized that I was organizing all of this info and making it sequence, plus I have found links to relevant information where I was finding dead links.

I just got so frustrated with KSP wiki breaking my concentration every 2 min's with a dead or broken link. When everything is a clicking and you hit a dead link... it breaks the &^^%% out of my concentration, and its hard to get going again, I don't know about you.

If you guys don't want me to post this, fine, I won't. but i already have it a lot done and when I finish with my first asset this could be a great tutorial... Plus I might get some help and help others learn.

I really love this game, so much so that i am learning this. Im FREE HELP USE ME LOL but seriously, I have a lot of time on my hands and Im not afraid to say no if I don't want to do something.

Link to comment
Share on other sites

That's totally cool. The community can always use more help/expertise. :D

The forum is a great place for works in progress. Hopefully you didn't miss that I said you can also edit the wiki directly. Even if you're not ready for directly changing stuff, you can update links and add more info. I'm not much of a wiki or mod creator myself, so help dabbling into this area is always welcome.

Also, I've moved this to a more appropriate area so that it'll get the right attention.

Good luck!

~Claw

Edited by Claw
Link to comment
Share on other sites

alot of the information on the Wiki is outdated. you are better off looking through the links here

http://forum.kerbalspaceprogram.com/threads/94638-New-Mod-Development-Links-Compilation

Sweet, Thank you! Ill check this out tomorrow. the outdated info is another reason Im doing this. I keep finding im learing old stuff that doesn't work anymore lol I forgot who said it but i agree, it is a lot of work to learn and understand this stuff. And its the.... logic, i guess you could say. I don't know all the rules, so I make assumptions based on my other programing experience and sometimes it just doesn't work.

Well, it my bed time Gnite all

Link to comment
Share on other sites

That's totally cool. The community can always use more help/expertise. :D

Also, I've moved this to a more appropriate area so that it'll get the right attention.

Good luck!

~Claw

Sweet, Thanks Claw!

I kinda ran into a detour today that took all my time. I recently upgraded my system and im having trouble getting my video cards running in SLI correctly.

Anyway, my plan is to work on this tomorrow and then Ill work on my system again Tuesday. I should be able to finish up on my system in one more day... if everything works right after I do what I gotta do lol

Have a Great night everyone.

ps, Ill look into updating Wiki... Im not sure what all that will involve

Edited by Enriched Uranium
Link to comment
Share on other sites

Creating a Mod

Step 1 - Choosing the program

A. I am using 3ds Max as my animation program.

If you're just writing (rewriting/compiling) this just for yourself, cool. But if you are looking to add to the community, I have a suggestion for this part.

Choosing a 3D Modeling program can be daunting, especially for those of us who had zero 3D modeling experience before deciding to mod. There are so many choices, most of which are very expensive. Not to mention, the learning curve on most of them is pretty monstrous. So here is my recommendation for this first part based on my own experience. I first wanted to mod about 6 months before I actually started. I downloaded Unity and Blender. Open blender, saw a cube and panicked. Couldn't figure out what to do and quickly became discouraged and gave up. Months later, I came across a video that wasn't using blender, but was using a completely different program, Google SketchUp. It is much more user friendly and intuitive to a new modeler (caveat: it is horrible for making 3D models for KSP though). So at first, I made the models exclusively in SketchUp. A little later, I made most of the model in SketchUp and used Blender as a finishing/post-processing tool, originally just for cleaning up the vertex mess that SketchUp creates and for doing the UVMapping. As I became more comfortable with blender, I eventually migrated exclusively to blender. Blender is a good program, but I still found it rather inadequate in many areas. At this point, the I had enough experience in modeling to download virtually every high end 3D software out there that offered a trial and be able to make a decision based on my personal preferences and needs.... which I'm still doing ;). Haven't settled on my final choice yet, but I'm leaning toward zBrush.

Link to comment
Share on other sites

If you're just writing (rewriting/compiling) this just for yourself, cool. But if you are looking to add to the community, I have a suggestion for this part.

Choosing a 3D Modeling program can be daunting, especially for those of us who had zero 3D modeling experience before deciding to mod. There are so many choices, most of which are very expensive. Not to mention, the learning curve on most of them is pretty monstrous. So here is my recommendation for this first part based on my own experience. I first wanted to mod about 6 months before I actually started. I downloaded Unity and Blender. Open blender, saw a cube and panicked. Couldn't figure out what to do and quickly became discouraged and gave up. Months later, I came across a video that wasn't using blender, but was using a completely different program, Google SketchUp. It is much more user friendly and intuitive to a new modeler (caveat: it is horrible for making 3D models for KSP though). So at first, I made the models exclusively in SketchUp. A little later, I made most of the model in SketchUp and used Blender as a finishing/post-processing tool, originally just for cleaning up the vertex mess that SketchUp creates and for doing the UVMapping. As I became more comfortable with blender, I eventually migrated exclusively to blender. Blender is a good program, but I still found it rather inadequate in many areas. At this point, the I had enough experience in modeling to download virtually every high end 3D software out there that offered a trial and be able to make a decision based on my personal preferences and needs.... which I'm still doing ;). Haven't settled on my final choice yet, but I'm leaning toward zBrush.

Ya know, Im not quite ready to start coding, or drawing yet so i had not thought too much about this point. Thanks for bringing this up. Personally, I went to school to learn solid modeling. If I remember correctly the classes were called CADD for lvl 1 and Plane Geometry for lvl2, Industrial Fluid Power for lvl 3. These 3 classes covered 3 semesters, One 2d program (can't remember the name) and a solid modeling program called SilverScreen. So I was in school for a good 6 months before I touched a 3D program for the first time.

Your right, solid modeling programs are tough, you have to know the terminology and it simply takes time to learn the toolbars and menu's.

Im not sure if much has changed since I have exported a solid model. It wasn't called configNode... and I don't remember what they called it, but the other game that I have written mods for (with help lol)... In order to set the nodes, you had to import the model into the program i used (called Rino 3.0), place the nodes and use that second program to export your model into the correct format, because silver screen couldn't export in the format I needed.

I see that Rhinoceros is now up to version 5 ( http://www.rhino3d.com/download ) and i do not know the cost of this program. Some of these modeling programs cost THOUSANDS of dollars and require key so that you can send your models to a plotter. Most individuals will never have a need for that key and you can get student versions of most 3D software if you look around. So, if your in school you can look at your class catalog for their CADD classes, find a class called something like "Plane Geometry", and go to the book store and get the software package for that class (just make sure its 3D and not 2D). If you do this, you can get a student version of the software for much much less. If you not in school, try to make friends with a college student ;-) or take a cheep intro class, get the student ID, go get your program and drop the class if you want to. Most schools will offer a 100% refund for the class if you drop it by their deadline date.

Silver Screen was about $1500 for a full version with a key, the student version was under $100... I think it was under $50 but that was a long time ago.

Now my plan here is not to teach people how to use their drawing program, but I will help with specific questions if I know anything about the program they are using.

Nice to meet ya, noonespecial.

Ah, an idea... if you read this, could you post which solid modeling program you use so I can get an idea of what most people are using?

If I end up having to learn a new modeling program, It may as well be what ever people are using the most, on KSP.

Keep in mind, it does not matter which program you use, as long as you can become comfortable with it.

(I have been drawing long enough that i can pick up a new program fairly fast, I am a little rusty with my isometrics due to the fact I have been drawing 2D for the last few years)

***** :wink: I was thinking I was going to use 3dMax, but this is open for change. If I get a few replies on which program most people are using... ill use the most popular one for this :confused: *****

List of programs people are currently using:

1. leaning toward zBrush. (single user License $795.00 Win/Mac $449.95 student version)

OWCH - this tells me that once I choose the program I will use for this, Ill have the trial time to finish this. lol

Edit : I have requested a quote from ZW3D and asked if we can purchase student versions. (this one advertised low cost

and affordable)

Edited by Enriched Uranium
Link to comment
Share on other sites

I suggest blender, it's free and it is by far most popular for KSP modders, you'll most likedly to get help here with blender questions. There're few max users here; and maybe one or two maya users. maybe one lightwave person. if you use Rhino or Modo or ZW3D, you are pretty much on your own as far as KSP modding goes.

and if you are looking to do a diary of your learning progress, the Blog option might be better. Forum is mostly for specific questions and people don't really want to read pages and pages of stuff you copied and pasted from somewhere else.

Link to comment
Share on other sites

I think the greater point of my post, through it may have gotten lost in the rambling, was to start with 3DMax if that is what you are comfortable with, but eventually progress to blender. Or if you're brave, just jump straight into blender. To echo what nli2work said, I do believe that the vast majority of KSP modders exclusively use Blender and.... as he said... it's free :)

Link to comment
Share on other sites

I suggest blender, it's free and it is by far most popular for KSP modders, you'll most likedly to get help here with blender questions. There're few max users here; and maybe one or two maya users. maybe one lightwave person. if you use Rhino or Modo or ZW3D, you are pretty much on your own as far as KSP modding goes.

and if you are looking to do a diary of your learning progress, the Blog option might be better. Forum is mostly for specific questions and people don't really want to read pages and pages of stuff you copied and pasted from somewhere else.

:cool:Sweet, Cant' beat a free program with a stick.

I have modeling software I use that I know really well, its old and won't export in the format i need for this but i can get it there. With Blender being free, and a majority of KSP'ers using it, I think thats going to be the one I use, still not sure on that yet but Im getting closer to my decision.

Give me some time to get this going, I don't think you guys are seeing my vision here... and I may not be good at explaining it with out just doing it and showing you. I learn, the way I was taught to learn this stuff so as I get farther into this You going to see its.... Kinda like a lesson plan from... I don't know, maybe Intro to C++... Im not a teacher, Im more of an Engineer... who got stuck working in a hospital because i met a girl, ended up marrying her lol.

If someone visits my Thread and doesn't want to read this stuff, all in one spot, sequentially, in a follow step by step format... They don't have to! They can wade threw all the information, like I am now, and learn it as they can find it. Its no skin off my back because im not doing anything extra, just what I need to, so I KNOW this stuff.

My brother, a few states over, is in Intro to C++ right now and is planning on joining us, if he can find some extra time. He has a family, school, and work so he does not have the free time i have. We have, and will have better, education tools and materials.

honestly, Im more interested in becoming proficient, than teaching others but it dang sure can't hurt to have a possible source for... MORE BRAIN POWER. LOL

We also have a real world project we just started and both of us have to be proficient with C++ for that. Eventually Ill post some pictures of it but we are going to build it in a Sim first. So what that means is, we can actually put our little robot into this game and see it work before we ever build the first one. HOW COOL IS THAT. LOL

conclusion: Im not doing any extra work here because this is the way I learn. If others learn the way I do, they will be able to follow right along and this should be a very cool tutorial, in the end.

We have to wait and see what happens, I am flying by the seat of my pants and have no idea what direction this could turn.

For me, this is all about having fun and learning. Ill have lesson one ready soon, maybe tonight (working on it now, and hope to include part of my example).

It will be a second draft, so still not done but closer to what Im trying to do here.

I realize that this thread will get messy looking, so this will be the development Thread for my mod, and hopefully our real world robot someday.

When I get finished with... this part of it, Ill post it in releases and change it up a bit but ill also post a good tutorial.

I have already been working on this for quite some time but it just recently took a turn that made me decide to post this Thread... and see if there are others trying to do what I am so we can help each other.

I do spend hours working on this, almost everyday, so why not share the info in a format that is so much easier... for me to follow, even if others logic doesn't flow like mine lol

well, I gotta get back at it if im going to get done, what I have planned today... It will be late this afternoon - ... late tonight. lol IDK, Im feeling good and refreshed right now, so I hope to get a lot done.:)

Link to comment
Share on other sites

I think the greater point of my post, through it may have gotten lost in the rambling, was to start with 3DMax if that is what you are comfortable with, but eventually progress to blender. Or if you're brave, just jump straight into blender. To echo what nli2work said, I do believe that the vast majority of KSP modders exclusively use Blender and.... as he said... it's free :)

Im looking at 3DMax still, I have not been able to get it installed on my system... but i haven't tried that hard either. I just started their internet install program, it failed, and i decided to look at it again later. I may have clicked the wrong download, not sure.

I will try to focus on Blender, but honestly, I haven't even looked at that one yet. So, I have no idea if ill like it or not. I like my old Silver Screen over AutoCad, but that just because I know Silver Screen so well. AutoCad is much more powerful.

Link to comment
Share on other sites

I suggest not using CAD programs (Rhino; AutoCAD; SilverScreen). They are not meant for creating real-time 3d assets and you'll most likely run into issues that no one here will be able to help you with.

Oh I already know, If i do use my old silver screen it will be a pain. Ill have to import it into another program to export it in a format that a third program can export in the format i need it SO... most likly I will not be using SilverScreen, much. I have been drawing for a long long time so getting drawing in the format I need them is not too much of a problem, most of the time. KSP doesn't need all the triangles my CADD software would render so I would spend a lot of time... shrinking them, na ill just use a program that can do what I need it too. picking up a new program for me, is like learning to ride a Harley when You have been on a Honda for the last 10 years lol.

Link to comment
Share on other sites

You are correct that some of the information out there is outdated. A lot of the information out there is in fact outdated. For example:

a. This will be the object KSP uses to calculate collisions and physics with respect to your part.

It is simply a matter of creating another separate mesh in the program you are using that has a

reasonably close resemblance to the object you have made. It must be convex, and must NOT

be parented/joined to the main mesh.

b. This collision mesh is to be called -

"node_collider"

Once it is named, add one empty material to it, and you are set to go.

From personal experience. This. This isn't remotely right. Not anymore.

Link to comment
Share on other sites

You are correct that some of the information out there is outdated. A lot of the information out there is in fact outdated. For example: snip

From personal experience. This. This isn't remotely right. Not anymore.

Can't actually remember the last time in made a separate collision mesh for anything that wasn't a wheel or a sphere, wheels because they have to be just so, and spheres because they can easily run into the maximum triangle limit in unity if using a normal convex mesh collider derived from the spheres mesh , Unity has always done the job quite well enough to avoid having to bother with this seemingly unnecessary ( for most new modders ) step.

Link to comment
Share on other sites

Until, I get closer to finished, I expect there to be mistakes in this. I have been using old info from KSP Wiki and someone just gave me a link to more up to date info, but I have not had time to go threw it yet. Don't worry, Ill get the old info updated as soon as i can but I need to finish with what I already have b4 I can go threw the new links and update my old stuff. When that Lesson One says FINAL draft... or something like that, then its time to pick out my mistakes. Thanks for the input, though and please don't stop, if i miss something.

I did end up working on my system today, and this new video card is being a pain in the butt to get setup SLI with it as primary and my old card as secondary. If I let it choose for me it puts PhysX on the new card and runs my old card as primary. but If i assign physX to my old gpu, then my old GPU just sits there, not doing much. Gotta find a way, cuz I have a reason i need my old card as secondary even if Nvida says its the better card.... So, EVGA wants me to benchmark both cards individualy, in each of my PCI-E slots... Im about half way done with their... to do list. I have my fingers crossed that I will finish it all today. I wasn't thinking I was going to have to benchmark each one... jeeze lol

Link to comment
Share on other sites

Can't actually remember the last time in made a separate collision mesh for anything that wasn't a wheel or a sphere, wheels because they have to be just so, and spheres because they can easily run into the maximum triangle limit in unity if using a normal convex mesh collider derived from the spheres mesh , Unity has always done the job quite well enough to avoid having to bother with this seemingly unnecessary ( for most new modders ) step.

Honestly I haven't gotten that far yet, on this. I have not drawn any of my part yet, all I have is a sketch on... on a napkin lol jk. Back when I was in College and we were modding... what ever that game was, we had to have both. That was 10 years ago, so... See, it all looks... Unfinished... but fairly good, until I start reading the newer info lol

Link to comment
Share on other sites

Oh, man! lol I just had a chance to look at blender. Ok, I was so wrong. It is so different from what I am use to and has many features that I do not understand. This one is going to have a learning curve for me. I think I understand... the drawing part of it but it uses different terms than my old software. I am not sure about this yet, but I am trying to add to the community here, so I think I will start with 3dMax and then move up to Blender when I understand the features, on Blender, that I don't understand right now. I can't tell you how surprised I am of how different these programs are. Since I am going to be learning these anyway, I will be adding some drawing tutorials as I go threw the steps.... like I already said I wasn't planning on doing.

Link to comment
Share on other sites

This thread is quite old. Please consider starting a new thread rather than reviving this one.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...