Killing Floor 2 - SDK

Killing Floor 2 - SDK

40 คะแนน
The SERIOUS KF2 Mapping Guide
โดย Serious
A short guide about the most important things during your first map creation.
   
รางวัล
ชื่นชอบ
ชื่นชอบแล้ว
เลิกชื่นชอบ
00. Intro
This is a guide about creating Maps for KF2 using the official & public KF2 SDK.
Everything i write here is tested and its working as uploaded map in single- and multiplayer.
It doesn't need to be the official or fastest or best way, but it's working :-)
As you might have noticed english is not my motherlanguage but as i want the guide to be useful global i wrote it in english.

I know i'm pretty late with this guide^^... but i started kf2 mapping also just around 3 years ago (even 2018 was late). But it take a bit of time to know the basics as well as the special and weired stuff kf2 sdk could and will do.
And as we don't get a KF3 in 2022 we might see a few new mapper ;-)

None of my maps became official so far... and i don't think they will be added one day. But after 4000 hours in sdk i think my maps reached a decent quality. If you don't know them here are a few links:
https://steamproxy.com/sharedfiles/filedetails/?id=2265300196
https://steamproxy.com/sharedfiles/filedetails/?id=1893918234
https://steamproxy.com/sharedfiles/filedetails/?id=1769324055
https://steamproxy.com/sharedfiles/filedetails/?id=1996788481

You want to create higher quality maps or port anything... then this guide will be of no/little help to you.
You want to start your first map or want to optimize, fix your first maps or need some infomation about kismet, this guide could be more interesting.

The map i build together with this guide:
https://steamproxy.com/sharedfiles/filedetails/?id=2768051581

You don't need to download other programms than kf2 sdk to build a map for kf2.
Depending on what you want to do you could check programms like:
• Blender or 3dmax (modeling, UV layer) if you want to port a map to kf2
• wwise (Audio) if you want some deep knowledge about UE Audio, e.g. included on a kf2 music map.

As it is always the best to check more sources to get your infos, here are some links you could check
https://wiki.killingfloor2.com/index.php?title=Main_Page
https://wiki.killingfloor2.com/index.php?title=Getting_Started_with_Mapping_(Killing_Floor_2)

Maybe some information about my experience:
I had almost no experience in mapping before starting with kf2 mapping. Maybe 100 hour in Mapping for UT2004,WC3,C&C, but none of them where important. Even the UE sdk from UT2004 is different in very important points to the UE sdk for KF2.
In 95 % of everything i have done or tried i checked the official maps to know what they have done there. 2 % i checked the kf2 wiki linked above, e.g. for the uploading process to include a preview picture. 3% are more or less self invented.

Do you need any experience in modeling or mapping: No!
Do you need experience in coding or Computer Science in general: No!

Depending on how complex (e.g. progression or holdout) your map will be, knowlege like: What's an integer, float or a loop are handy. But even then it's not necessary or i will say a few things about them.

What are the details of this guide:
Well, it's possible to create a map without any guide but there are many things which might be not optimized or even broken. Short: It's very likely your map won't have the quality you want.
During this guide i will show every single step, from the very start to the Workshop upload and final testing.
+ Information about everything i do, and why i do it this way
+ Possible failures and issues which often happen on starter maps and most likely happend to me too years ago
+ Some basic info about almost everything in the sdk and related to mapping (Some info could be also interesting if you want to create a weapon skin or change some sounds, it's the same tool. But it's not the topic of this guide)

The time you need to finish this guide and puplish your first map?
As i wrote before, this is a step by step guide so you need some time to finish it.
If you want to create a high quality map in <10 hours i have bad news. This won't work. I have uploaded a few maps with < 10 hours but these are fun maps only. The idea might be interesting and it could be fun to play but it's not about quality at all.
The most time i used for a map was ~600 hours, i know mappers with more than 1000 hours on a single map.
For my subjective "best" map i needed ~200 hours. With enough experience i would estimate a map at almost official quality or at least good enough to be counted as "good workshop map" would be at least 60 hours.

This should be enough for the start.
I hope i didn't broke your interest in this guide or mapping in general ^^
Let's start and have fun building your own map ;)
01. SDK
1. Install sdk


sdk is just a few MB big. It will work with the same files you already need to run KF2.

2. Start sdk

Like the game, the editor need some minutes to start.

Sidenote: If you start the game directly after closing the editor, the game will start pretty fast ;-)

3. Main & Welcome screen

During the start you might get 2-3 pop ups.
  • The network message " -NoGADWarning", because you'r not connected to the twi network
  • The update message, just click on remind in 1 week
  • The welcome message (i would say you need at least a few hours in sdk before they become interesting)

First things first: The Navigation
Use WASD to move in the sdk.
Use Q or E to go up or down.
Press and hold the right mouse button and move the mouse to change the angle.

Then... the Main screen:


The most important stuff on your main screen is:



Let's start on the upper left.

real-time: This is important feature to simulate dynamic lightning or effects like dust in sdk. Deactive real-time might increase the sdk performance a bit but you won't see things like: "trees or other vegetation moving with wind", particle effects like dust, rain, snow, ....
For now you have none of the things in your map so its ok to deactivate it.

Wireframe / Lit / Unlit are the 3 most important options how you can see your map:
Wireframe: You see only the boundary of your meshes, no textures, no lightning or shadows. This is the option you can use for details or special surfaces like water, web,...
Lit: This is the standard options before you build your map lightning. You see everything how it looks like in complete white light without any shadows. This is your view for the basic layout and the general optics of the map. Except you already know that lightning is one of the mayor things in your map. E.g. because you build a map on mars and you know from the start that everything should look red colored.
Unlit: This will be the standard as soon as you make some progress in your map. Setup your lights and distance fog, Want to check where shadows should be or not. This is also how the map will look like in KF2.

Splattermap:
The splattermapview is important for optimizing the map. The splattermap is how detailed the blood on objects will look like as soon as zeds die close or upon them.
If you don't check this the map will be playable. But it could result in very unrealistic blood splatter as soon as the first zed dies.
To make a 100% optimized splatter map is a bit of work and highly increase the map filesize.
To make a 90% optmized splatter map is work of a few minutes and increase the fileszie by ~1-2%.
Unfortunately is easy to forget, but it is something you should check for a quality map.

Game View
Game View will hide the builder brush and other icons. It's ment to show you how the map will look like ingame.
For the almost 100% game optics you need to activate:
• Game view (G)
• Distance Fog (F)
• Real-Time (Ctrl +R)
• Lit View mode

Camera Movement Speed
In general the standard movement speed for the camera is and should be on lowest level. You can increase it by a left click on this button till its max. With next click it will be min again.
In 90% of your time the lowest value is ok. If you create a big map or holdout or progression maps it's one of the options you have to get fast from one area to the next by increasing the camere speed.

Toggle Brush Polygons
Activate this button. You won't see any different now but its awesome as soon as you start working with volumes. More details later

Build options
You have 5 Build options:
Build Geometry: Do this whenevery you are working with volumes, e.g. blocking volumes and want to check your last 5 minutes of work in the sdk. It should take just a few seconds. On a complex map <1 min.
Build Lightning: This is the build of builds. On a standard map at least 95% of the build time will be used for the lightning. Don't do this now. Don't do it as long as shadows are not important.
Much of the final mapsize is depending on the shadows you have in your map. You don't need this information in your map as long as your are actively working on the basic optics.
Build Path: Do this whenever you add something important for the pathing. Important is: You add something like a weapon or amo pickups, you add a playerstart location, you add a door...
This build should take a few seconds now ( and it's useless now). On a finished map this could take between 0.5-5 minutes.
Build Splattermap: This is necessary everytime you do something related to blood. Not just the splattermap of the objects you set, but also for the blood on them before the match begins. E.g. blood on dead bodies or hans torture victims. It's important only if you work with assets like this in sdk. But it also take just a few seconds so you can do it as often as you want.
Build all: Well... build everything ;-)
Like the lightning build this is something you should do later for the details.

In general i build like this:
Any changes on volumes or terrain and i want to test them in sdk -> build geometry
Any changes on paths and i want to test them in sdk -> build geometry & pathing
Any changes on bloody details -> build splattermap
Finished all visual things -> lightning build
Pre first ingame-test -> build all

viewport
Do you prefer to build in 1 big window or 2x2 windows.
That's obviously depending on your screen size/resolution and what you want to do.
I use the 2x2 viewport for pretty much everything on a 1920x1080 screen

Autosave
It's annoying. YES IT IS^^
But trust me, you want it. Better safe every 10 minutes and you might lose just the work a few minutes when your sdk crashes next time.

Scale Grid
That's your option about scaling
Please note: If you scale 1 2 times for 5 % you don't have 1.1. You have (1+0,5)1.05=1,1,025
It's up to you how you want to scale. I use almost always 2% or 5%.

Rotation Grid
Your option for the rotation grid.
For details i often use no grid at all or 2.81°-5.63°.
For the basics i use often 45° or 90°.

Drag Grid
The most important grid ;-)
This enables and set the grid you can move your assets.
E.g. you want to build a 320x320 wall and copy paste it a few times. Then you set your grid to 320 and your wall will move and snap exactly where you want it.
For the details i often use 2-4, or deactivate it.
For the basics i often use 16-320 depending on asset.

Build Brush
This is your tool to create every sort of volume. You want to block something use the builder brush. You want a special fogvolume for a unique area, use the builder brush. You want to create you ZEDSpawns or any sort of trigger, use the builder brush.
DON'T USE IT FOR GEOMETRY.

Add volume
click here to choose the volume you want.
You don't need them now :-)

csg
This could be used to define semi-complex volumes. E.g. if you want to create a cube with a part missing.
But don't use it now. In my 4500 hours i used it maybe 5-10 times.

Brushes
This is where you set the size of the brush you want to add.
Almost always it will and should be a cube volume. Why?
Performance, usabilty, simple to use. :-)
Right click to open the brush builder window. Here you can set the sizes you want.
E.g. 320x320x2560 as simple blocking cube.
If you need a non-cube volume you should be careful about the values you set. E.g. a sphere with an exptrapolation value of 5 will break pretty much every kf2 map.

Close SDK
If you close the sdk and you see something like this:
!!!!
Alway Press "Don't save" !!!!
!!!!
02. Menus
Now a few words to the main menus you will work with

The content browser


That's the most important one. 95% of the content you will add to your map you take out of this, or copies from official maps.
The main folder you will work with is the "environment folder". This one contains all the assets from official maps you can easily use.
To see all the assets you need to load them first, right click at environment:
→fully load

This could take a few minutes, depending on your hardware.

Other important folders you will need later:
• Audio (for ambientsounds, triggered sounds, seasonal music if you want to create a seasonal map)
• Effects (all three folder might contain the effect you need) ;-)
The actor that contain the effect is called emitter.
You might also want to check later on
• Characters
• ZEDs
• Weapons

In the upper middle of the content browser you see "object type", that's where you choose the kind of object you want to search for.
E.g. do need an ambient sound or a mesh... maybe you find lots of assets without filtering and search for "wood", but just a few if you filter it before.

Actor Classes


This is your menu to add anything related to gamemechanics (e.g. paths, weapon pickups), dynamic/special stuff (e.g. water surfaces), objective related stuff and much more.

Levels


This window is about streaming level. This feature is not available for the public version of the KF2.
Don't try to use different streaming level. As far as i know a few mappers tried it but i don't know a single workshop where it's fully functional.

Scene


You won't need this window often. But it's an awesome menu to debug, and search your map.
E.g. you need to know where static mesh 4204 is (because you get an error to it after a build).
Simple set the filter type to "Static Mesh" and filter text "4204" and you got it :-)

Layers


This is where you can group your assets.
In general you have just one layer "None" in your map. It's not mandatory to create any other layer.
But the bigger and more versatile your map will be the more important layers are.
E.g. a layer about all your objective stuff.
A layer for all your "trees".
You can build as many layers as you want, BUT: Don't build to many, make the groups reasonable.
Is vegetation an important part of you map: Make multiple vegetation layers: Tree, bush, grass, small,....
You have almost no vegetation: Make only one layers vegetation "vegetation" or include all these meshes to the surrounding meshes/layer (e.g. Layer: area1)

I always try to make as many layers as reasonable, but as few as possible. If you need to use the slider for the layers you might lose the overview the layers are made for.

Another important reason for layers are more complex maps like holdout or progression.
Simple set a 01_ for all the assets in your first area.
To build a new Layer you need at least one actor selected in your main window -> Layer-> new...
The same way you can add or remove assets from layers.
03. Basic Level Layout
Let's start with your first map.

Click on File (Upper-Left-Corner)-> new Level -> Blank Map
Safe your map (this is necessary as your sdk won't work stable without working on a saved file).
I name my maps during development always like: KF-Map63-v020.
I recommend to create a new version:
  • at least every day you work on your map
  • before you start instable actions: Combining meshes, adjusting volumes, import/export, ambientsounds or music.
Don't delete old saves as long as you work on the map.
The maps will get bigger and bigger, but you might need backups.
I also recommend a make a backup every day after work to googledrive, dropbox whatever you use to backup :-)
As soon as you upload your map as puplic version free for everyone to play you could delete all the version you don't need anymore.

Now add your first asset to your map:
• Open the content browser
• Open the environment folder
• go to -> Env_Modular_StaticSet_MESH -> single_mesh -> Floor


Drag and drop the first mesh: "single floor" into the main window.
Then right click on the mesh in the main window, go to Properties


→ movement → Location
And set your mesh to x = 0, y = 0, z = 0
That's your Basic mesh. Your map should be always around 0 0 0.
Why?
Because global settings like the sunlight will always point towards 0 0 0. It's looking very weired and could cause unwanted shadows if you start you map at 1000000 0 0.
Additional you shouldn't go outside of the standard grid between -262.000 and 262.000. this could cause weired and difficult to reproduce bugs.
Just start at 0 0 0 ;-)

Now it's time to learn the most important mechanic to create your own high quality map:
Copy paste ;-)

File → open → now go to your kf main folder: Let's open the BlackForest map:
The different files you see here are necessary for different streaming level. An mechanic not available on the public kf2 sdk. The main file is always kf-"MAP".kfm
I recommend to set the official maps folder as shortcut in your kf2 mapping folder. Or favourite the official maps you want to use.

When the map is open move a few meter above the trees.
You should see something like this:
If you see fog press "F" to disable it.
Select the 3 light bulbs and the birdhead.
To select multiple actors press and hold ctrl.
Then look at the sky above you, you should see another birdhead. Select this one too.
The last object to copy is the "skybox". Add the skybox by selecting it with the other 5 actors by clicking somwhere in the sky wherw you don't see anything than the sky.
You should have 6 actors selected. Check this by right click on one of the selected actors. The first line of the pop up window should show "actor properties (6 selected)".
Now copy with ctrl+c.
Go back to your map e.g. with File → recent → "your map name"
Right click on the floor you set before and "paste here".
It might look like this:

Go into your layer window. Select the "skylight" layer and delete it (or remove both skylights out of the layer).
Then go to the "None" layer and select:
• DominantDirectionalLight 0
• ExponentialHeightFog 0
• Skylight0
• Skylight1
• StaticMeshActor 1223
• WindDirectionalSource 0

Create a new Layer "Sky" with these actors.

These are some of the most important actors for your map:

The Dominantdirectionallight is your sunlight.
Open the properties of one actor to check the details. And change them if you want :-)
Cascaded Shadow maps -> whole scene dynamic shadow radius:
Defines the dynamic shadow distance.
• Dynamic shadow looks more natural and don't increase the filesize of your map, but they reduce the client side performance.
Standard values are between 700-1500. Don't use higher values if not absolutely necessary.
During the creation of your map you can set it to high values like 10.000, but don't forget to reduce it before testing if you also want to test the performance^^
• Light Color
You can set the blue, green, red value manually or you can double click on the color bar above and choose in the "select a color" circle window.
Infos about values are shown when you point at them.

Exponential Height Fog controls the fog in your map.
There are other actors and methods to create fog, but this actor is the standard for kf2 maps.
You can check the properties like before. Additional the loaction of the actor itself is important.
The z location of the fog actor is part of the fine tuning for your fog. ;-)

Skylight controls the global light. Better said: How dark or bright your map should be.
It's together with the dominant directional light the 2 most important light actors.
But unlike the dominant directional ight, the sunlight will affect every mesh.
You control how dark the shadow of your sun is.
Why 2 sunlight?
There are 2 different lightning channel, outside and inside.
You can set the channel at pretty much every asset, every light, every mesh,...
Only the lights and the meshes need to be in the same channel.
outside → outside , inside → inside.
Do you need both inside and outside?
No!
The standard is outside volume. If you don't know how your map will look like or you already know it will be mostly outside (e.g. a forest) the outside channel is what you need.
If you actually have important medium sized or larger buildings or underground passages in your open forest map it could be reasonable to add the inside lightning.

A short digression to lightning volumes
So, one of the skylights from Blackforest is the "standard" for all the outside areas in blackforest.
The other "inside" skylight is e.g. for the mill.
To make these channels active you need to add a outside or inside lightning volume.
You have 2 options:
• Build only inside lightning volumes, everything outside of them is automatically processed as outside.
• Build only outside lightning volumes.
For this map we build only 1 big outside volume:
got to your very first floor actor at location 0 0 0
Now go left hand side to brushes -> cube
Set the dimensions to x y and z to 50.000
Now got to "volumes" also left hand side in the main menu and scroll down to the lowest entry "TWOutdoorLightningVolume" and left click.
The red builder brush should be hidden behind the new created kfoutsidelightingvolume.
You will also see the new volume in the "None" layer, feel free to add it to the "Sky" layer you made before.

StaticMeshActor_1223
This is your skybox (from blackforest). It's a standard mesh like a tree, a rock or a chair, it's just very big, without any collision and it's your sky :-)
For the best possible skybox you should change it's location also to 0 0 0

winddirectionalsource
This actor will add wind to the map.
In the properties you have the option for the speed and the strength of the wind.
Standardvalues for both are 0.5-2.
For inside only maps... e.g. a lab, you can delete this actor.

Global Lightning, fog, wind,... your basic visuals for the map are finished ;-)
04. Static Mesh
What is a static mesh?
A static mesh is a very simple object. It a tree, a house, a car, the street, grass, a dish... Every floor, wall and ceiling.
You will build almost everything during the first 75% of your map with these objects.
Important here is that you should use as much as necessary, but as few as possible.
The more details you have the better the optics, but the lower the performance.
For me it's obvious why all the official kf2 maps are narrow:
The smaller/narrow the map, the
• higher the difficulty
• more details are ok to add before the performance will be an issue

Another important thing is: How complex is the mesh you use.
A mesh like a standard wall is very simple and you could use hundreds of them without decreasing the performance. A mesh like a complex tree, e.g. the trees from burningparis shouldn't be used to often. Vegetation in general is a difficult topic as these meshes react on wind and dynamic shadow. That's one of the most important things for client performance.
You see the complexity of a mesh with the numbers below it: tris and verts.
A mesh with 12 tris and 24 verts is simple. You want to use it 100 times in a small area. That's ok.
A mesh with 20000 tris and 34000 verts should be used only if necessary and only in very small numbers. Use it 1000 times in small area and no one even with NASA computer can play your map.

Always check tris and verts if the mesh looks complex and you want to use it multiple times.

For some meshes you see 2 or more LOD


LOD = Level of Detail
This is a technic to decrease the details of a more complex mesh depending on the distance between the mesh and you.
It's reasonable and working, but don't think you can add thousands of a complex mesh just because it has 4 LOD ;-)

Mesh Movement
to move your mesh click at the arrows or press and hold ctrl and a mouse button
(left → y-axis, right → x-axis, both → z-axis).
Press space to switch between move → rotate → scale



red arrow -> x-axis
green arrow -> y-axis
blue arrow -> z-axis



press and hold the green, red or blue bow and rotate your mesh.
Check your rotation grip. I use 45° or 90° for basics like a house.



Scale your mesh. Don't do this for the standard layout, that's something for the details. But when you start scaling basic meshes for a house you need to scale everything inside and connected to. That's a lot of work and could look weired afterwards.


Let's create your 1st building:


The terrain below the house is a simple mesh:


If you want to rebuild the house you might need the terrain before:
check the Christmas Map in Environment or search for "Throneroom_floor" and add the first to your map.
Add the values from location and rotation to your terrain mesh.

You also need to adjust the mesh size:

• Open Properties of your terrain mesh → Display → Draw Scale
• Set it to 10 to increase the size of the mesh x10
If you want to increase only one dimension of a mesh you can use:
Draw Scale 3D:
But be careful with this while working on important actors e.g. floors.
If you scale a mesh e.g. 10 1 1 You will break the splattermap of this mesh. The blood from dead zeds will look horrible on it.

Add the first floor for your house:
Check Blackforest map in environment or search for "mill_floor", add one to your map
Set the location to x=3680, y=8720, z=-80 as first edge.
Copy paste the floor 3 times and set them to:
5920 8720 -80
3680 6480 -80
5920 6480 -80
These will be the edges of your floor.
You can build them anywhere else ofc, but these are the values for my house. So if you want to rebuild it. Use the coordinates from above ;-)
Now fill the 8x8 floor with 60 additional black forest mill floors.
It's faster if you first fill one row and then copy paste it 7 or 8 times. Always check after such an copy if something looks weired when you move the camera to detect if you have multiple meshes on the same spot.
To make the copy paste as easy and fast as possible i recommend to set the grid to 320
(view → drag grid → 320 , or bottom right corner in the main screen).
ctrl + c → ctrl + v as often as necessary ;-)

To increase the optics of your floor
• select a few random floors (maybe 5-20 pieces)
• open properties of them
• go to static Mesh Actor → Static Mesh Component → Static Mesh
Choose the mesh in the content browser directly below your blackforest floor (it's the same floor but broken)
• click on the green "left-arrow" → "use selected object from content browser" to replace the floors.


Your 64 pieces floor is done? Next step are the walls.
I often start with the columns/pillars.


You can use the columns from blackforest too. For these kind of meshes you often find multiple versions of the same mesh: e.g. half, full, long or something like this.
That's awesome to work with, whenever you need different length.
Don't scale the half version to be the full version, scaling shouldn't be your first thought. If you need a long version of pillar don't scale it, build two above each other.


Build the columns where you need them. I build a 4x6 house + 2x6 floor without walls.
I used the same sort of column for the vertical and the horizontal.
Press space to switch from move to rotation mode.

Next item you need are the walls:
You might notice that there are 2 different meshes for the same wall:
• FracturedStaticMesh
• StaticMesh
StaticMesh is the ultimate standard, fractured static meshes are dynamic destructible actors.
For now i recommend to use the standard static mesh variant.
I write a few infos about destrucible actors later in the guide.
Build the walls wherever you need them, you might need 2 or 3 spots for doors ;-)

Floor is done, walls are done? Now it's time for the ceiling/roof:
And again i use Black Forest meshes here.
Go to the blackforest environment and search for "roof"


As the roof is a pretty complex mesh you won't find as many basic and modular meshs as you find with floors or walls. So use the mesh which is best fitting for your needs and scale it as long as necessary.
My main roof is located at: x=5120, y=6640, z=598
Draw Scale 3d: x=1.85, y=1.5, z=0.75
Where do i get these values?
Trial and error. Adjust it till it look realistic :-)
The other two ceiling i used are:


It's the same mesh, but rotated, scaled and moved.

Floor, walls, roof. Is the house finished?
Maybe a few details. That's where use things like railings, storages and everything else you can imagine as decoration.


The edges of the railing are the pillars i used for the walls in the house. They are scaled to:
0.25 0.25 0.55

The decoration in the house could be anything. I often use Storages and container as deco.


Now decorate your first house ;-)
05. Textures / Materials
You might want to change the texture of a mesh.
So here a few infos about textures and materials.

Textures are part of materials.
You can't drag and drop a texture to a mesh. You drag a material to mesh.

Texture:
Is a simple TGA image with different resolution.

Material:
Is a texture combined with all the details you need e.g.:
reflection
movement (e.g. watersurface)
specular
emissive (e.g. for glowing materials)

In 99% you don't work with textures. You can't set them on most assets and
DON'T change any official asset under any cirumstance!!!!!!!!!!!!!!!!
The only work with textures you might have is:
• add new textures
• adjust officical textures but safe them as new one.

In 99% you will work with "Material Instant Constant" MIC.
The next picture shows how you get the material used for a mesh.


If you want to change it you can drag and drop the material from the content browser to the mesh.
But for meshes with 2 or more different materials you will overwrite all availabe materials with it.
If you want to replace just one you open the mesh properties:
Static Mesh Actor → Static Mesh Component → Rendering → Materials


If you want to get the material back to default right click at the material index → Reset to default

I don't want a stone floor as ceiling material so i will reset it to default :-)

Next we will change a official MIC and save it as new one.



The original brighter version of the bamboo doesn't really fit into the map. It's to bright.
So we use this MIC but change it's brightness:
First create a NEW asset.



Double click at the MIC of the material.

Next i copy paste all the values from the official bamboo MIC to the new MIC.
Start with the parent material, it defines all the possible variables for a MIC.
Then change paramters like brightness, emissive, and the color X, Y, Z to lower values:



You need to add this MIC to a mesh to save it. Otherwise it will be deleted when you close the sdk.


06. Modular Static Set
The basic meshes you use for map geometry (floor, wall and ceiling) are often from the modular static set.
Not just mappers use these meshes, official maps are made of these meshes in almost every edge.
Exceptions to this are only complex geometry maps like Airship, or natural maps like black forest.
The reason is simple:
These meshes are
• easy to use
• optimized
• modular
• numerous
• the resolution of many MICS work perfectly with them

There is almost no geometry you can't build with them, except terrain.
Additional you often don't need to scale or rotate them, there might be already the size and direction you want available. Stairs, ramps, edges, railing, all the standards are available.


What you need to know:
• Most of the MICS you drag to them will only cover one side, the other side will be invisible. The collision is for both sides.
• A Drag grid of 80-320 is awesome to work with these meshes.
• use rotation grid of 45°-90°

If you rotate a simple wall by 90° you might notice a small gap between the walls



To fill the gap you have 2 options:
• Use a pillar, i often use the pillar from bioticslab and reduce it's 3d scale in x and y to 0.25
• Bevel meshes, these fill the gap in one or more directions.



As the modular floors share the same MICs, it's very easy to select all meshes with one of these MICs and replace it with the MIC you want from the content browser.
Right click at one of the meshes → select → select all with matching material



Now fill the base with storages, container, drums, barrel, generator.
Whatever you want to place there ;-)

How it could look ~2 hours later:



Another example how a map could look like with the modular statics only, and finished:

07. Lightning
The lightning is probably the most important impact on atmosphere and performance.
A single pointlight with horrible settings could break the performance of your map.

But first we make a "reason" to add a light.
Let's create/copy a campfire & rock circle.
The pillar in the middle of the fire is just to build a center point.
Set one rock at the position you want.
Select the rock and the pillar and copy both, then rotate around the pillar and you have a perfect circle of rocks ;-)

For the fire you could search for "log" or copy paste the fire from an official map, .e.g nightmare first area.
If you copy the fire from an official map i recommend to copy the fire effect and the pointlight too.
For the coal i used the body_bags from evacuation point with a gore material.


You have 4 different lights you will use in 99%:
• dominantdirectionallight -> the actual sunlight, already added to the map
• sunlight -> global indirect lightning, already added to the map
• pointlight -> the standard light e.g. for a campfire
• spotlight -> the standard directional light e.g. for a flashlight

Important variables:
• Radius: As small as possible and reasonable
• Brightness: As bright as possible and reasonable
• Color
• Cast shadows: Negate all shadows from pointlights
• Cast whole scene dynamic shadows: e.g. dynamic shadows from trees moving with the wind.
use at Spotlights only
• Cast per Object Dynamic Shadow: Dynamic Player and ZED shadows
use at Spotlights only
• Disable Specular: for indirect lightning

2 special values:
• The Lower Brightness from skylights:
This is how dark e.g. ceilings will appear
• Light shafts from dominantdirectionallights:
Adjust your sunlightshafts, bloom scale.

An important point you should never forget while working with lights is the performace.
A few guidlines:
• Build as few lights as possible
• The game hates half shadows or areas affected by multiple pointlight
• The radius as small as possible
• The brightness as high as possible
• negate shadows where not necessary
• dynamic shadows from spotlights only

Light Animation

You might want to add a bit dynamic to your light.
E.g. the light for your fire should flicker.

Go to properties of the light → light animation and set the light to values shown below:


The max brightness overwrite the brightness of the standard light config.
To see the flickering of the light you need to set the window you work in to real-time:
E.g. with ctrl + r. Or with this symbol:


Advanced lightning

There are 2 advanced lightning actor:
Movable and toggable lights.
Movable lights are used e.g. for a moving car with working frontlights.
Toggable lights are used for objectives, progression or holdout mechanics where you want to toggle a light on/off depending on time or event that happend before.
Further details later in the guide ;-)

Lense Flare

While no light these actors can be used together with lights to create the the lense flare effect:
I recommend to copy your first e.g. from catacombs.

08. Volumes
Ahh the volumes.
Probably the most important topic where you see the difference between:
• someone who just want to build map because its funny.
With the right idea and team it could be still a funny map, but not at official quality level ;-)
• somone who want to create a high quality map with smooth gameplay and so on.

Tbh it's not the funniest part of map creation to optimize the volumes for best possible gameplay experience. But it's necessary ;-)

Here a list about all the volumes available:


The important ones:
  • BlockingVolume
  • KFPawnBlockingVolume
  • KFPhysicsVolume
  • KFReverbVolume
  • KFSpawnVolume
  • PostProcessVolume
  • PrecomputedVisibiltyVolume
  • TriggerVolume
  • TWIndoorLightningVolume
  • TWOutdoorLightningVolume

BlockingVolumes
Use these volumes to create the collision setup of your map.
Most of the meshes have their collision but that's just the quick and dirty solution for a proper collision setup. Almost every wall, rock, meshgroup need a proper Blocking Volume around them.
Without this player could get stuck, fall out of the map, use buggy "the ZEDs don't reach me" spots and so much more unwanted stuff.

KFPawnBlockingVolume
Same as the blocking volumes but used for player only or ZED only block. Player blocks is what you need most times as you need to block the ZEDspawns from players.

KFPhysicsVolume
Used for all sorts of physics: e.g. damage trough fire, force trough wind,...

KFReverbVolume
Used for ambientsounds and general soundlayout... e.g. echo from shots
Only use:
• SmallRoom
• MediumRoom
• LargeRoom
• City
• Mountain
• Forest

KFSpawnVolume
Used to spawn ZEDs.
Don't try to trick much with them, most configuration options are hard coded.
Your important options are:
• enable or disable them (necessary for holdout/progression maps)
• set the "out of sight" flag
• Largest Squad Type

PostProcessVolume
Use for all kinds of effects you want to use inside the volume. E.g. local fog, desaturation → Make the game black white inside ;-) , change the DOF and many other things.

PrecomputedVisibiltyVolume
Used too increase the perfomance.
The impact is depending on the map, e.g. for holdout maps with seperated areas it's not bad.
For standard survival maps the impact is pretty low.
Additional it could cause weired visibilty bugs with dynamic or destructible walls.
In general it could be an option to increase performance. But a badly optimized map won't be fun using this.
If you use them, make them as small as possible. Otherwise you map need many hours 10+ to build.

TriggerVolume
My favourite Volume ;-)
Used to trigger anything. Trigger events, trigger spawns, whatever should happen you will use 50% trigger volumes to activate them.

TWIndoorLightningVolume
TWOutdoorLightningVolume
Used to define the lightning channel you want assets inside the volume to be processed as.
• If you don't know what to use: Use one very big outdoor lightning volume
• Only use one type of these volumes, never indoor and outdoor lightning volumes in the same map
• If you need both inside and outside channel only build inside lightning volumes, everything else is processed as outside.

As example i will add a blocking volume to the house

Let's go inside the house.


Do you want player to reach the upper level or roof e.g. with boomstickjump?
I hope not ;-)
It's your job to block it.
You have always 2 options to add a blocking volume:
create a cube builder brush fit the meshes you want to block and create it as blocking volume.
OR
the way i do it most times:


Select a few of the items you want to block.
Best choices are the ones that should build the edge of your blocking volume.
Then right click on one of them → create blocking volume → bounding box
You get a builder brush and a blockvolume around your selected meshes


IMPORTANT: All your selected meshes change their collision type: I recommend to press ctrl-z for "undo one step": you blocking volume will be still there, but selected are the meshes you made it from.
Then open properties → Collision
Reset the collision type to default ("block all")


The created cube blocking volume is just semi perfect, it's ok but it could be better.
Let's make it better:
Open geometry mode
If the volume is not red market when selected you can activate this by "toggle brush polygons"
The red square symbol a bit left of the build options.




The geometry mode/tool is super awesome.
When geometry mode is active simply click at one surface of your blocking volume, then hold ctrl and
left mouse button → y-axis
right mouse button → x-axis
right and left mouse button → z-axis
Or click on the blue arrow if you want to adjust the z-axis


Most of the blocking volumes you create should reach above every mesh a player could jump.
Under no circumstance a player should be able to get above one blocking volume. Not with a boomstick jump, not with a rocket jump supported by kevin or a strong punch from king fp.

Now block the rest of your building till all your ceiling/roofs are blocked.


This is something that could happen to you as well. You block an pretty large area under the roof, it could block a jumping player and that would be weired as the player don't see anything here blocking his movement.
Let's optimize it:
in gemoetry mode select the volume and select the two lower left points


Now move these 2 points a bit in z direction



That's a fast and smooth way to optimze volumes.

The view mode you need for the best possible collision setup is the rigid body mode:
Click on the arrow left upper corner of your main window -> show -> collision modes -> rigid body



It's looking horrible, but it's awesome to check your collision setup and see possible stuckpoints for player and ZED.
IMPORTANT: Whenever you work on volumes you should build geometry afterwards. Otherwise your changes are not processed.
When finished with collision mode change back to normal view
main window menu → show → collision modes → normal

Let's block the fireplace:


A cube won't be the best block for a symetric 8-edge fireplace.
Build a cube as blocking volumes from the logs. Increase the z-axis of the volume.
Go to TOP view.
next to view modes you see a "p" for perspective, click on it to change the view to top.

Select one surface of the volume in geometry mode → geometry tools → split
Thats how i adjust pretty much every complex blocking volume to fit the mesh it shold block
Make as many splits as necessary and move the edges where you want them.
2 important nodes:
• Use TOP VIEW for this, you will always activate all nodes with the same x and y axis this way.
• New split lines should never cross other split lines!

09. Navigation Points & Pathing
The pathing is, like the volumes, not the most fun step in map creation.
But its one of the most important points for a fluid gameplay and correct difficulty setup.

ZEDs won't search for you as long as they don't see you.
Without pathing they would stand still at their Spawn till you get close to them.
Not exactly how it should be.
You need to make a path from ZEDspawns to the area player are able to go.

The second point you need a path for is the trader arrow.
It' no magic the trader arrow exist, it follows the shortest path from you to the trader following the paths you set in your map. Without a path no trader arrows ;)

A few important nodes about paths:
• The general layout of your map should be finished. Otherwise you have to repeat the creation of the paths everytime you add or delete important meshes/blocks.
• Always use the KFPathNodes, not the standard UE PathNodes

I further recommend to seperate your paths nodes in 2 layer:
• standard path nodes players and zeds are able to reach
• zeds only path nodes only zeds can reach
The zeds only path nodes don't need the trader arrow, you can disable it, that's why 2 layer of paths nodes makes a fast optimizing possible.

The distance between two nodes should be around 320-640. Except for small narrow passages where you need to lead the ZEDs more precisely.

Let's assume the map is finished in terms of meshes and blocking volumes
→ now we build the pathing for the house we made:


Copy one of your floors → right click on the copy → replace with → add kfpathnode



Then select the path node move it a bit up then press "end" on your keyboard.
That's how you set an asset down till it reachs a mesh with collision below it.
A super easy and fast way to get a path at the exact location in z-axis.



To enable snap for your path nodes (or any other assets) got to the node properties → advanced → Ed should snap
For the standard layout of your paths it's the best to enable grid snap.
Only for the details disable the snap or reduce the grid to 2-4.

Before your start pathing you should add the first KFPathNode to a new layer:
E.g. Paths_Std


Now use this node and copy it again and again for your basic path layout.

I use 2 nodes in the first floor of the house for the ZEDs only.
I want to build a ZEDspawn there afterwards.
Create a new layer for ZEDonly Paths



There won't be an automatic path between these nodes and the standard ones on the basic floor.
We need to "force" this paths.
To force a path between 2 nodes.
→ first click on the node you want the path to start
→ second select the node you want the path to end
→ right click one selected node
→ path options
→ force path between.....



That's something you need to do often, e.g. between different levels like the path between a roof ZEDspawn and the street below.

NOTE:
Just because you force the path between 2 nodes you don't subscribe the path between the second and the first node if it's created automatically.
You need to subscribe it like you force the other way if you want to prevent it.

After the path building you should see the paths between the nodes you made.
The color of the paths shows how accessible this path is
White, pink → Large enough for every ZED.
green → Medium ZEDs or smaller
blue → Small ZEDs only
You should always try to make as much white/pink paths as possible

A very easy way to set your paths is like this.
Go to Top View and set the mode to rigid body.
It might look like this:



Then add one KFPathnode somwhere, and lift it up a bit up in z direction. It should be above every player accesible terrain, but below every blockvolume tops, like this:



Add the KFPathNode to the Path_Std Layer and build the paths you want inside the player area.
Copy and paste pathnode over the complete map. You can also set a grid to the Pathnodes by
properties → Advanced → Ed Should Snap
After a few minutes it could look like this:



The select one path → select → Select All KFPathNode Actors
This could take a few seconds depending on amount of path nodes.
Then press "end", this will take a few seconds more.
The paths will be auto set to the floor directly below it.

When you see a path like this:



You should proscribe the paths. Select both path nodes of the broken path → Paths Options → Proscribe paths.
Broken paths are often spots where ZEDs will loop jumping.

Additional actors important for the pathing are:
• KFPlayerStart
→ The StartActor you should use as playerspawn
• KFPickupFactory
→ Weapon and Amo Pickups, use Item_default weapon pickups. You can also define here which weapons are possible
• KFTrigger_Chokepoint
→ Reduce collision so ZEDs won't get stuck on narrow ways like doors.





KFCostumizationPoint
As you might noticed you always join an official map outsight of the playable area where you can customize your char and set weapon skins.
The actors you need are KFCustomizationPoint.
Without these actors the player will join at the KFPlayerStart Actors.
That's working, but it's bad practice.
→ The player will block ZEDs during their customization
→ You can set a good looking start point not accessible for players otherwise.



The players have collision during their join. You need the actors outside of blocking volumes and above mesh or blocking volume so they stand on something. Otherwise the player will fall down but the camera won't move → No one would see his characters during costumization ;-)
10. Dynamic Actors
Dynamic actors could be split into 3 different types:
• Actors you can interact with
• Moving actors
• Dynamic StaticMesh

Actors you can interact with includes e.g. doors.
Moving actors can be pretty much every static mesh. A moving car, an evelator.
Or if you want a rocketeer lifting tree, why not^^

Let's start with a door.
A door is a bit work to add manually, i recommend to copy paste it from official map and adjust to your needs.
Back to black forest:
You need to copy all 3 actors related to a door, like shown in the next picture:

• KFDoorTrigger
• KFDoorMarker
• KFDoorActor
Always copy paste the 3 items together.
They are linked to each other, these links break when you just copy them one by one.

Back to your map you can paste it anywhere in the house,
Unfortunatelly there is no location info part of the KFDoorActor.
So you need to set it manually to the door surrounding of your choice.
Always use all 3 Door actors together otherwise you can break the mechanic and need to fix it afterwards.
If you check the door actor you can adjust multiple settings.
E.g. door material wood or metal, max health of the door,
Mesh Attachment for your left and right door. In this case one of these entries will be empty as we copied just one door.
There are a lot of options and they need to adjusted very acurately, that's why i recommend to copy paste it from official map.
Additional not all options are free to adjust, so it's not like you have much freedom during the manual creation of a door actor.

As example for a moving actor i use an official map: yes... it's Black Forest again ;-)
Why always black forest?
Because the map for the guide is an open natural map, the closest official map is black forest.
That's always something you should think about. Is there any official map which is at least a bit like the map i create?

Back to the moving actor in Black Forest:
Go to the mill wheel and open the properties
→ Movement → Physics → Rotating
→ Movement → Rotation Rate → -45°



Moving actrors are called: Interpolation Actors
You can convert every single static mesh to an mover ("interpolation actor")
You can also convert every mover ("interplation actor") back to a static mesh.



The physcis from the wheel is rotation.
It' doesnt need any manual trigger to start. It will auto start when the match starts.
• PHYS_Rotating is what you need for these kind of mover:
e.g. the wheel from black forest, a church clock, the wheels & screws in infernal realm
• PHYS_Interpolating is the standard for all trigered mover:
E.g. if you want a car that's driving once between 2 points the car will be an mover in phys_interpolating. It will start as soon as the trigger will start the "startcar" event.
More to this later in the guide ;-)

Another dynamic actor are standard StaticMeshes(SM) that move e.g. when shot or touched.
E.g. the chairs and tables in BurningParis cafe.



• You can set dynamic meshes to be not dynamic, if you don't want them to move directly in your map.
→ "Never become Dynamic"

• You can check if a mesh is dynamic in the mesh properties in the content browser.
→ "Can become Dynamic"
DO NOT CHANGE THIS. NEVER CHANGE OFFICIAL ASSETS.
11. Destructible Actors
Destructible Actors are... who would expect this... destructible ;)
the creation of a new destrutible actor is depending on the complexity of the object pretty much work.
But before you create your own you should know how to use them.

I would say there are 3 different kind of destructible actors:
• FracturedStaticMesh
You might know the walls from the mill in BlackForest. They don't break completely just because you shoot them once, you can break them partially.
NOTE: The collision won't change just because you destroy the actor

• FracturedMeshGlass
Can be used like FracturedStaticMesh, but the collision will also break when the actor break

• DestructibleActor
I recommend to copy paste them as often as possible from official maps, and only if you need a special one to create it yourself. Use official destructible actor as example then. It's not exactly difficult, but the fine tuning need time.

Let's add a few fractured mesh glass actors to the map:
Back to the house.
Select one of your walls → right click → select → select matching static meshes (this class)
to select all of these meshes.



Additional select the used mesh in the content browser:
Select one of the walls → right click → find in content browser
Lastly you go to the actor classes window and search for glass.
Then you should see fracturedmeshglass. click on it.
Back in the main window:



to replace all your selected walls with an fractured mesh glass

Once replaced the mesh vanished.
It's a different asset now, unfortunately you have to add the mesh as static mesh component again.



Open properties of the fracturedmeshglass
→ Fractured Static Mesh Actor
→ Fractured Static Mesh Component
→ Static Mesh Component
→ Static Mesh .... use the fractured static mesh from the content browser as static mesh

When the static mesh is set the last thing to adjust is the collision.
It's a fully destructible actor and you want ZEDs to interact with it.
So it's necessary to disalbe path collision with this mesh.
→ open properties of the fracturedmeshglass
→ collision
→ disable Path Colliding


Let's add a destructible actor
First use one of the walls we made before.
→ copy it
→ replace the copy with the fitting brace static mesh



→ Safe the map
→ open the official blackforest map
→ Go to the mill and search for the brace you want to add.
You can also search for it in the scene window.



→ Copy it
→ Go back to your map
→ Click somewhere on your house floor and "paste here"
→ Now change the location and rotation of the copied destructible actor to the static mesh you created before.
→ You will have these 2 actors at the same spot afterwards
→ Click on it, if you have the static mesh actor selected, delete it.
If the destr. actor is selected move it a bit in z direction to unhide the static mesh → delete it and set the destr. actor back to where it should be
Now you can copy and paste this destr. actor as often as necesary.

The amount of destructible actors in official maps is very limited.
So you can check the scene window in official maps, filter for destructible actors and check what you can copy, it should take just a few minutes ;-)

If you want to adjust a destrutible e.g. change it's material you need to check both the base Mesh and also the temporary meshes that will be creating on destruction.

You need to create one on your own?
Add a empty destr. actor from the Actor Classes Window. Set the mesh you want standard mesh as Static Mesh Component.
Copy one destr. Actor from official maps and use the Properties
→ KFDestructible Actor
→ Sub Objects
as example.
12. Particle Effects
Particle effects could be seperated into two groups.
Triggered and auto-start.
Something like wind, dust, fire will be auto started.
Explosions shouldn't auto trigger.
The actor you use to add particle effects to your map are called emitter.
emitter can contain mutliple particle effects.
You find particle effects in the content browser by filtering for "particle systems"
Unlike static meshes you might find them in 4 different folders:
• Effects
• EffectsThree
• Effects_AMG
• Environment

If you search for an wind particle system i recommend to select all 4 folders and then search for "wind", and filter for particle systems.



The preview picture of a particle system is often not enough to check. Better drag and drop it to your map, activate real-time and decide then if it's what you are looking for.
Let's add a few dust emitter to the map:



The emitter are easy to add, increase the visuals of your map with pretty low work and are easy to adjust (e.g. you can make them bigger the same way you increase the size of meshes).
But don't exaggerate using them. If you use too many in short distances you will drastically reduce the performance.

When you add an emitter to your map and open its properties your options are limited.
The 2 important variables are:
• template
here you can replace the emitter
That's one way to replace multpile, even different emitter at once. Select all emitter you want to change and then replace the template with the emitter from the content browser.
• Auto Active
The default option is yes. The emitter will start as soon as the map starts. For a looping emitter that's exactly what you want.
For an triggered emitter, e.g. an explosion you need to deactivate this.



You want to change the emitter e.g. with a different color ?
Well that's unfortunately not possible. NEVER CHANGE THE OFFICIAL ASSETS.
You will break your game files and you can't play even in singleplayer.
What's possible if you need e.g. different color for a particle is:
Copy the emitter and safe it as new one.

Let's try this:
Go to the content browser and click on NEW (bottom left)



• Package: Search for your map name
• Grouping: you can check existing groups at the binoculars symbol right hand side. Always try to reasoanble name your groups, e.g. emitter, MIC,...
• Name: use unique names so you know your emitters later on
• Factory: What asset do you want to create? → here it's an particlesystem
• ok
Your basic emitter will be created.
You can close the opend window of your emitter for now.
First you should add it to the map. Unfortunately you can't drag and drop it from the content browser as you can with official assets.
Right click somewhere at your terrain → emitter: "your emitter name"



Now we copy the official emitter to the new one:

1. Open the particlesystem you want to copy and adjust, double click on it in the content browser to open:
UnrealCascade, the tool to modify emitter.
Here you can see all the particle systems.



2. Open your new emitter in unreal cascade.
Right click at the emitter in your map → "find in content browser"
It's important that the emitter you want to copy is the first you opend, and the new emitter the second.

3. Right click at one of the particle emitter → emitter → Export all emitters
This will copy all active emitter, in this case the first and the third particle emitter to your new one.



4. Close the official emitter cascade window and delete the "test" particle system auto generated in your new emitter


The emitter is now copied and you can work with it without breaking your kf2 gamefiles ;-)

5. There are lot of options to adjust emitters in unrealcascade. If you want to create a new high quality emitter it will take many hours.
I don't think this is what you want to do. Now we change something easy, e.g. the color of the dust:
select "color over time".



6. Let's change the color of the dust from grey to toxic green.
The color changes over the time, it's dust, it's dynamic. Thats why you find multiple color values during the lifetime curve of your dust particle:



X = RED
Y = GREEN
Z = BLUE
We start at y = 0
we rise to y = 1 (you can go above 1 if you want a brighter green)
we end with y = 0
X and Z will always stay at 0 as we want a green dust only.
You can also use red only... then go to green only and end with blue (if you want a cyber rave dust)^^

That's it. I think it's clear why a high quality new emitter could take some time to create. It's not just the color you need to set, you need the size, the movement vectors, the timing, the particle mesh itself, and much more.
You can create awesome things with this, esp. things 100 % unique to your kf2 map. But that's up to you ;-)

One important last point:
Everything you create as new assets need to be somewhere in the map.
Even if its just a new color for an emitter or the preview picture or some test texture you tried, you need to add it somewhere in the map. Otherwise it won't be saved and you will lose it when you close the Editor.
13. Sounds
Let's add a few sounds to the map.
A map without any ambientsound will always feel a bit empty.

You will find all the sounds in your content browser:
Audio folder, filter for "AKEvent"

• Ambient
All the ambient sounds you might want to add, e.g. waterflow, fire, rain, random metalcreaks.
If you see an LP as part of the name you know the sound is looping.
That's something you will use for the general ambience
• Music
That's nothing you will use as "sound", music has its own handler in the world settings discussed later
• SFX
For all sort of triggered sounds, e.g. shooting sounds, reloading, explosions,...
• Voice
The voices from playercharacters and traders
Can be also used as triggered sound

You can drag and drop the ak ambient sounds to your map like you can with static meshes
But first a few notes:
• I highly recommend to use ambient sounds only from one official map...
think about your map which official map could use the same sort of ambient sounds you need.
E.g. natural things, like fire, water, wind,.... technical stuff like fans, generators.
I often use BlackForest, BioticsLab, BurningParis, Catacombs, Manor, Outpost or Nightmare
• Right click at the AKEvent in the content browser and play/stop so you know if its loud enough for your scene.
• Before you add an AKEvent you might want to know the radius you will hear the ambient sound.
E.g. is it a large or a small fire, a small water leak or a waterfall.

First i started with the sounds from burningparis, later i changed it to nightmare.
Start with our house

The important info for you:
• The max audible distance: 0 = you hear it everywhere in the map. Usefull for standard sounds like wind in an open map. Don't use ambients sounds you here everywhere multiple times in your map.
Values >0 show the unreal units you can hear the sound if everything is quiet.
DO NOT CHANGE THESE VALUES, they are official assets as well and you could break your game everytime you change an official asset.
• The Duration: 0 for endless looping, everything else for the seconds it will play once after activation

Another ambientsound we can add is the AkEvent for our fireplace circle.

There are 3 other actors interesting for ambientsounds
• the sfx volume, as far as i know it's used only in blackforest and descent and there are just a few of them. This volume will repeat 1 or multiple sounds in a set interval as long as you are inside the volume.
• The KFReverbVolume, that's important for 2 things:
→ The sound processing of shots, steps and stuff like this and their echo
→ Can be used to define volumes ambientsounds are active in.
→ The priority is important when 2 or more volumes overlap. E.g. a default big "mountains" KFReverb volume with priority 0, and smaller KFReverb volumes with other setting and priority 1+.
That's used on multiple official maps. e.g. Burning paris.
Important infos you need to check are State group name and state name of the kfreverbvolume.
You need to copy them from official maps otherwise it won't work.
• You can start sounds manually from kismet (discussed later in the guide)
E.g. usefull when an explosion results in some fires and you don't want to hear them before ;-)

IMPORTANT NOTE:
Unlike pretty much everything else in your map the sounds are processed client-side.
You need to load them client side and every trigger related to them need to be client side.
Even the standard ambientsounds need to be triggered client side.
That's where you might open "Kismet" the first time


↓ The Kismet Window will open

↓ Right click anyhwere to open the "New" Menu




click at the output of level loaded : Loaded and visible, hold the mouse button and connect it to the load input of AkLoadBank. Then connect the AkLoadBank with the AkStartAmbientsound like it's shown in the picture below



↓ click at the level loaded Event and activate the "Client side only" option



Check the Ambientsound folder you get your ambientsounds from (negate the AKEvent filter),
what we need now is the AkBank.
Load this bankfile into the AKLoadBank in kismet.

Now the Ambientsounds from this bank should work in single and multiplayer.

-EDIT-
After many hours more on the map i decided another bank would be better for the map.
I changed the bank to nightmare and used only ambient sounds from this pack.
Fire, Water, Debris, Wood, Metal, Generators,... all looping. Nighmare is an awesome pack you can use for many maps.
14. Decals
Decals are overlays above one or more meshes.
In KF2 they are almost always used to create the blood splatter around dead bodies or to add some dirt to a floor.
I used it in my payday2 KF2 Map to add snow above street.

It's KF2 → We will add a bit gore to our map :-)
I searched for gore, corpse and tentacle in the environment folder and build a small area with multiple meshes from these searches:



I would say it's ok as it is now.
Nothing special but also not bad.
Now add a few blood decals.
• First go to the content browser filter for material, not for material instant constant like the materials you need for meshes.
• Search in the MaterialLib Folder for blood and select it



• select the FX_CH_BloodSplatter_DM
• change to actor classes window and search there for "decal"



• Drag and Drop the DecalActor into the map
Now you can move and rotate it.
You can also set the width, height of the decal:



You can filter which mesh should be affected and which not
Let's filter out the nightmare grass:



I often create a small temporary layer for these kind of things.
Select the meshes i want to be ingored → create layer 0
Add these meshes to the ingore of the decal actor manually and delete the layer afterwards.
That's very usefull when you have something like a water actor you don't want to be affected by an decal.

Decals are an easy way to increase the visual quality of your map.
Unfortunately you can't use every material as decal.
You can check the material you want to use by:
→ double click the material in the content browser
→ search for decal in the properties of the material



If you find the mutually exclusive usage "used with decals" active, you can use it. Don't use other materials as decal, don't use decal-materials on something else.

If you need an unique decal material i recommend to copy one of the officials and adjust it to your needs. Like we made it for the green dust in the last chapter.
15. Water & Other Special Surfaces
Some materials and actors are, let's say, special to use.
E.g. a watersurface you can't select by pressing on it like you can with all the other meshes.
Even worse are spiderwebs.

• Spiderwebs


Drag and drop them like you know it.
You can move, rotate and scale it like every other mesh.
But once you deselect it you won't be able to touch it again.
Two Things you can do :
1. You can add these kind of meshes to a special layer for special MICs
2. You can activate "allow translucent selection"


• Watersurface

One of the visually most important things, water ;-)

You can use a standard static mesh as water surface,
but you can't set the collision to what you would expect from water.
You can set it to block weapons, no collision or block all.
What you want for water is don't block anything, but show some effect when someone shoot in it
You can't get this with standard static meshes.

What you need is the KFWaterMesh

Drag and drop it to your map.
What you get is an empty actor. No mesh, no material.

Now we have to add the mesh and the MIC

I use often a modular static mesh for water and i search for "water" and filter for MICs in the complete environment folder.

Add a few rocks, a few vines and a waterfall emitter
block this lake with an pawnblocking volume
Easy made and good looking ZED spawn area ;-)

• Waterlight

The Waterreflection effect is a light actor. We use the one from BioticsLab





• Blackness

Another very important and special texture is "Blackness"
It's often used in both official and workshop map to hide ZEDspawns behind it when there is not enough space to make a prober ZEDspawn room.



I always create a special layer for Blackness as all of these meshes need:
• no collision
• no shadow
Most times a simple modular static set is what you need as mesh for the blackness MIC, e.g. the 2x2 wall.

• Rain

We won't use rain in this map so here just a few basic infos.
The standard rain is a static mesh from manor. I highly recommend to make a special layer for the rain. If you want rainsplash at the floor you need an emitter and you need to set the rain and splashs manually.
Another rain could be taken from shopping spree or airship (emitter). Don't abuse these actors, they will decrease the performance.
The Bloodrain from Monsterball is something special:
There is a volume called KFBloodRainVolume you can use.
But the Volume don't spawn the rain itself, the rain is still an emitter (incl. the splash). The volume will create the splattermap, what's awesome ;-)
I recommend to copy one BloodRainVolume from Monsterball if you want to use it. Also copy the kismet setup for this volume. It's one of these rare nodes you have to activate clientside.
16. Splattermap
The splatter map is the blood resolution the players will see above your meshes.
a large resolution will result in almost no blood above your floor.
That would be weired for KF2
a small resolution will result in a large and unnatural looking blob under every single trash ZED the player will kill.
That would be also weired.

Before you start optimizing your splattermap you need to build it once.



Next you need to change the view to splattermap view



The textures you see here show you how the resolution of the splattermap will look like.
A resolution of 2 could be good for a standard 320x320 floor.
A resolution of 2 will be horrible for the terrain mesh added as one of the first meshes and then increased the size by 10.



How do you know which resolution is the best.
Test it ;-)
Let's start an in editor "play" test.
Right click somwhere at the floor → play from here (lowest line)
open the console in the editor preview e.g. with F3 (or "Ö" at WERTZ keyboard layout)
use the following commands:
enablecheats
spawnzedaigroup clot 5 5

→ Fight against the 25 clots with your shovel and look at the bloodsplatter they will do ;-)
There are also other options e.g. a blood pistol you can get by other commands, please check the kf2 wiki for further info. I prefer testing with actual kf2 gameplay.



I think it's obvious that the blood resolution for the terrain is not large enough :D
Every time you change the splattermap of one or more meshes you need to rebuild the splattermap.



After a few tries i found a good resolution for the terrain of 372.
If you want to set the resolution manually you need to activate the "override Spatter Map Res".
Always use "coding" values for this ;-)
multiples of 2 ....e.g. 2, 4, 8, 16, 32 , 48, 64, 128, 192, ... and so on.
A large resolution will also increas the filesize of the map. But well, that's often a tradeoff, better visuals or smaller map size.
As you just have one terrain mesh i would say the 1mb larger map size is ok for an important visual improvment.

If you never adjust any scale of any mesh the automatic generated splattermap will be good enough for almost all meshes.
When you work often with large scales it could make your life much easier if you set e.g. for very big rocks you sized x20 a layer "rocks_20", and a layer for rocks you sized x10 "rocks_10" and so on.
17. Skeletal Mesh
A skeletal mesh is like a non-static StaticMesh.
The one skeletal mesh every kf2 player will know is the Trader pot.
Skeletal Meshes often have a predefined movement you can add.
Other skeletal meshes can be dynamics lanterns, the playercharacters, the ZEDs and the weapons.
As you might imagine these assets are pretty complex compared to simple static meshes.
That's why you shold use them only if necessary.

It's time to add the KF2 Traderpot to the map.
How?
We copy it from an official map ;-)
This time i copy it from nuked.



When you copy the trader you should copy:
• The Traderpot Skeletal mesh
• The pointlights around it
• The KFTraderTrigger

The physical asset and the anim set are both defined per default for the trader pot.



For other skeletal meshes you have to set them manually.

Let's add another skeletal mesh to the map... a ZED.
What's the best and fast way to do this... exactly... copy it from official map ;-)
This time we copy a ZED from containment station.



copy it to the gore area with the decals.



What you need for the skeletal mesh to do the animation:
• The skeletal mesh
• The Anim Set
• The Physical Asset
• The Name of the Sequence you want the ZED to repeat



There are a lot of things you have to check for skeletal meshes:
Is the anim squence correct, if its playing and looping and so on...
That's why i recommend to copy always one from official maps and then adjust it to your needs.
Now we change the animation the clot will do:



We are lucky, the animation "feed" is part of the anim_set already used.
Otherwise we had to change the anim_set AND the name of the sequence.
Change the name of the sequence to "Cell_Alpha_Feed".
There is no limit what you can do here.
You want a clot with the animation from a fleshpound, sure why not ;-)
You want a bloat with the animation of a gun... well, that could be weired... but why not :D
If you want it to look "realistic" you should try to use anmiation from assets with a equal size... e.g. cyst or clot animation for an clot, also player anmiation could work.

18. KAsset
KAssets are super awesome dynamic actors... e.g. hanging lanterns with light that swing when you shoot them.
I don't know a single workshop map with KAssets i won't consider at least medium quality ;-)

Let's open the official TheDescent map and copy one of the assets from there:



IMPORTANT: Copy both, the lantern and the light. They are connected and you lose this link if you copy just one of them.

Paste it into your map close to the house.
Use the location of an column and copy these values to the kasset and the point light.
Then you can fine adjust the lamp and the light pretty easy to the column.



If you don't know why KAssets are so awesome... save your map and start another editor "play from here" test.
shoot the light with your pistol. Now you know it ;-)



Everytime you copy the asset you need to copy the light too.
The link between them will be copied.
The link is part of the spotlightmovable:
Check the properties of the light → attachment →
Base: The Asset you want the light attached to
Base Bone Name: Because your asset have more than just one Bone. E.g. the lantern itself but also the static support.

When you copy the asset from an official map the bone will be already part of the copy.
If you want to know which bone you need you have to check the skeletal mesh which is the base of the kAsset.



To get this kind of dynamic you need bones. Bones are more or less "static mesh parts" of skeletal meshes.



Here you can check which bones are available and which one you have to attach your light to.
The skeletal mesh provide the mesh your KAsset work with.



The physics Asset provide the physic your KAsset work with.


There are only 63 skeletal meshes in the environment folder and 37 physcial assets, your options are limited. Without creating a new one. That's defintly nothing i would recommend to do without additional software or for your first map ;-)
19. Vegetation
For me the vegetation of a map is always something special.
Sure most of the things you need are simple static meshes, but there are still some things you can do very wrong.
And things you can do very fast and easy.
That's why i decided to make a special chapter about vegetation.

There are 4 different actors you can use for your vegetation:

• static meshes
-> Use this for trees, bushes, vines, grass

• InteractiveFoliageActor
There are 2 defined interactive foliage actors for you to use. Both in BioticsLab:



Interactive because they move when you walk trough them.

• InstancedFoliageActor
→ The easy and fast way to produce foliage for your open map.
But there are important limitations before you should use them.



Use only the following meshes as part of the instancedfoliage actor.



Most other meshes will lose their MIC during the build process.

Why do some meshes lose their material during build:



All MICs have a base material, something they get their majority of properties from.
The base material from vegetation has the "used with instanced meshes" active.
The base material from grass has this bit deactive.
Don't activate this bit manually. Never change anything on official assets!

Unfortunately this is just the reason we can't use every mesh as instancedfoliage.
To add a basematerial optimized for wind and worldsettings and everything else is beyond this guide.

Some info to the foliage mode:
Align to normal will align the plant to the floor below it. I always negate this, it's looking more realistic to me when plants grow in z direction only ;-)
Additional you might want to change the Instance per cluster
IMPORTANT:
You need to negate "precomputed shadows" from these meshes!!! Otherwise the editor will crash during lightning build. Dynamic shadows are up to you, are they necessary?



As last setting you need to set the instances per cluster, the brush size and the brush density.
Instances per cluster <= 100.
I recommend brushsizes between 256-1024 depending on your terrain.
Brush density should be around 0.01-0.05.

If you want to delete some of your meshes you can use the "Lasso select" to select some meshes and press "delete".



One issue you might experience is: You will not just build the plants up on the terrain mesh, you will also set it at every other mesh with collision.
So be precise while working with this tool ;-)
This problem could be fixed if we had used a actual terrain actor and not just a simple static mesh as terrain. Then we could filter the foliage mode painter for "terrain".

• Destructible Actors
→ If you don't want to create your own, there is just one destr. tree in black forest

A special not about Pine Trees
With all the trees from black forest you might want to add pine trees to.
Then you need the ones from outpost.
The issue here:
The collision,
All parts of this tree share the same collision. The nails and the trunk will block your weapons or nothing will be blocked at all. Whatever collision you choose the trunk will never collide with ZEDs or players.
So let's rebuild the collision of the trunk, and set the needles to no collision.














A cylinder blocking volume would be possible, but it's often better to use static meshes before using volumes.
I use a pole from Elysium, because it's the pole with lowest complexity but with collision



Now we should:
• Hide it ingame
• Negate all shadows from it
• Adjust size, height, location
• Adjust phys material




Test it in editor.
When everything is like it should be you can copy both the tree and the pole where you want.
Don't forget to rotate and resize the tree when you copy, so not all of them look the same :)
You can also group this meshes:



You can ungroup all of them as soon as you are finished with them.
When you group mutliple actors you might experience a lag when selectim them, that's normal.
Just use them to copy multiple actors and ungroup them later ;-)

An important last step during your vegetation is the collision setup.
Do you want your grass block an rpg? I hope not ;-)
Then it's time to select all your grass, and other small vegetation meshes like bushes
Properties → collision → no collision.
Trees on the other side should be with collision except pine trees and probably a few trees you used only to hide ZEDspawns.
20. Performance & Optimizing
One of the final steps for your maps.
And something you have to think about all the time during creation.
Performance
There is a server side performance, and a client side performance.
Server: ZEDs search for a path, collision equations, kismet sequences,...
Client: Visuals like dynamic shadow, effects,...

How do you know the performance of your map?
The best singleplayer test you can do is:
Test your map in kf2 directly. Play an official map and make a benchmark of your fps.
Play your map and make a benchmark.
Other tests you can do are faster ;-)
E.g. the collision test
Start the map in editor and enter these commands
stat collision
enablecheats
spawnzedaigroup clot 10 10



If you cross 2000 your map won't work on MMO servers with 32+ players and more than 32 ZEDs.
If you cross 15000 you might notice lags with 6 players and standard 32 max zeds.

General information about performance:
• 1. Lights
→ lower the radius
→ increase the brightness
→ disable dynamic shadows

• 2. Pointlights
→ NO DYNAMIC SHADOWS !!!

• 3. wind-affected Actors
→ vegetation like grass, trees and other plants
→ The trees from black forest are much better for your performance as the trees from burning paris

• 4. large or complex meshes
→ Try to use simple meshes whenver possible, also try to make the surrounding and sky as simple as possible

• 5. Don't make your map to open
→ Low performance
→ No Spawnarea for the ZEDs close to the player → low difficulty

• 6. Draw Distance
The draw distance defines the unreal units between you and the mesh/emitter/light/... before it will vanish. It won't fade out it will just disappear.

That's why this shouldn't happen to often visible for players. E.g. a large rock shouldn't have a draw distance of <8000
On the other side a small paper debris don't need >2000.
If you copy paste stuff from official maps the draw distance will be copied to and you can use this as examples. But it's also obvious that these values often need to be adjusted and optimized manually.

• 7. Cull Distance
That's a more or less the same as the draw distance. you see this e.g. at emitters.
When you change the draw distance of an emitter to 10k but the propertie value for culling is at Max=2000, the 10k won't be used. The max distance will be still 2000.
If you want to chane the culldistance for an emitter you need to copy it as new emitter and change only the cull values.

Another cull option is the CullDistanceVolume
It's never used at official maps but you might see it from time to time at other workshop maps.
It's used to simplify the draw distance process:



How it's working:
Size of mesh < Value e.g. 800
Will be hidden > Value e.g. 8000
The larger the mesh the larger the distance you should see it.

• 8. Fog Density
You can use the fog density to hide meshes faster or later. You don't need to draw anything you can't see.

• 9. Mesh Combining
That's an important feature to improve the server side performance.
For every moving pawn the game need to calculate collisions. So you want your floor collision as simple as possible.
One way: You use only large and very simple floors. Like we made with our terrain actor, it's just one very big and simple actor, you can't optimize this one actor.
But what about this spot:



There are still simple floor without any overlapping meshes, but as one mesh with just one collision it would be even better.
Additional you can optimize the splattermap with combined meshes.

IMPORTANT NOTE:
The Mesh combining is not stable. The longer the sdk is open the more likely it is it will crash during this.
→ SAVE your map before you try to combine something!

Select all meshes you want to combine → Right click → combine static mesh → set in your map/group and name → combine convex collisions "yes" → Replace Actors in Scene "yes".
After the combining you need to optimize it:

1. Set the collision of the new mesh:
Build a blocking volume around it, maybe you need a temporary mesh below the floor if it's just a 2D floor so you get a 3D Blocking Volume. BLevel Modular Static Set are 3D, but i recommend to use additional meshes, e.g. pillars to set the blockvolume



Adjust it to your geometry as best as possible. Use the geometry tool for this.
Then press ctrl + p.
The builder brush will use the shape of the current selected volume.
Right click at the new Mesh → Set Collision from Builder Brush.
Collion is set.

2. Add UV Layer:
Double click at your mesh in the content browser.
→ Generate unique UVs
UV Layer 0 → Material (should be ok)
UV Layer 1 → Lightmap (need to be set)
UV Layer 2 → Splattermap (need to be set)



→ Create a new Planar UVs



You can use the same setting for UV Layer 1 and 2

Now your new mesh is optimized ;-)

IMPORTANT NOTE:
• Don't abuse this feature. Combine only meshes where it's reasonable or maybe even necessary.
If you start combining everything, your collision setup will be difficult work, your map size will be extreme.
• Combine important floors, combine important walls. That's it.
• only combine Planar floors for collision. If we would combine the area inclusive the stairs the setup would be much more difficult and i won't work or look noticable better.
• If you want to combine complex 3D meshes always negate the collision of this new mesh. I recommend to do this only if you use this new mesh very often. Otherwise i recommend to group the meshes.
• You can't combine meshes with more than 65k verts.
21. ZED Spawns
The setup of the ZEDSpawns define the difficulty of your map.
The reason most k2 maps are narrow and small:
→ There is always a KFSpawnVolume nearby
Whatever map you build there should be always a KFSpawnVolume close the player, whereever they are.

I often copy my first KFSpawnVolume from an official map, scroll trough a few of them and choose one to copy which is as small as possible but enough space for 4-6 spawn cylinder.

The properties of a KFSpawnVolume:



Most Important are:
• Largest Squad Type (always go as big as reasonable). No Fleshpound (large) at a crawler Spawn, but as many Boss Spawns as possible
• Out of Sight (active means, the volume is set as Always out of sight of players)

IMPORTANT NOTE:
Don't rotate ZEDSpawnVolumes except in 90, 180 and 270°.

I would say there 3 important types of Spawns:

1. The Outside Spawns
→ These spawns are outside the playeraccessible area. The Volumes shouldn't be visible for the player and most of them should be able to spawn every kind of ZED.



You should make a Layer of KFSpawnVolumes outside only.



The "Out Of Sight" bit should be active only if its actually impossible for players to see this volume.
But you should activate it for these hidden Volumes. Don't trust the game to know which player can see something or not ;-)
E.g. a player can't see trough muddy water, but they you can still sight block the spawnvolume inside the water.
The outside volumes should be all around the map to ensure there is always multiple available spawns, even with more than 6 players.



2. The Inside Spawns
→ unlike outside spawns you should deactivate "out of sight" for these KFSpawnVolumes.
They are necessary to further improve the amount of ZEDspaws, they are in playeraccessible areas and no player should ever see a single ZED spawning out of thin air.
It's always the best for difficulty if you choose spots close to wall edges, stairs, ... areas where it's likely that a volume is just in line of sight when the player is actually moving to this direction.

Note:
As you might know some ZEDs are able to teleport when you are far away. Some player don't like this mechanic.
Without Inside Spawnvolumes no ZED will ever teleport close to you.
But without them it's very likely your map will be to easy and boring.

2. KFSpawner
You need Kismet for this type of ZEDSpawn. If you don't know Kismet you should skip this actor for now and go to the next chapter "Kismet".
KFSpawner are the actor TWI use for small ZED crawling out of a vent and stuff like this.
As usual i recommend to copy the first of these actors from an official map ;-)
There are always at least 2 actors your need to this kind of Spawner:
• The KFSpawner
→ The place where you want the ZED to crawl out of something.
• TriggerVolume
→ Used to activate (and deactivate) the KFSpawner



Important properties of the KFSpawner:
Everything ;-)
Yep, you should check every single line.
Note:
• You can set "Largest Squad Type" to Boss but no boss will crawl out of a vent^^
use small or cralwer ;-)
• You should set the TriggerVolume in Kismet to Max Trigger count = 0, and the delay to 10 or 15.

One last important thing to know about KFSpawner are Parents and Childs
That's a feature to group mulitple KFSpawner.
• Most of the properties of the Childs will be auto-copied to the Parent.
• The Childs will be triggered when the Parent is triggered.
• The Parent need to know it's Childs. The Childs need to know they are Childs.
• Only the Parent need to be triggered in Kismet.



KFSpawner make the ZEDSpawning a bit more dynamic and could also help to increase the difficulty of open=easy spots.
22. Kismet
Now to my favourite KF2-SDK tool.
Kismet is the visual scripting system from UE3.
You need it for:
• Animations... e.g. sunset or sunrise
• Objective, Progression and Holdout mechanics
• any kind of events like the vulcano from ZEDlanding
• KFSpawner (e.g. small ZEDs crawling out of a manhole)
• AmbientSounds
• CutScenes
• Traps
• Text Messages
• Camera Shakes
• ...

Open kismet:



Right click anywhere:



Actions are Events you want to trigger in kismet. E.g. you want to activate a trap.
Matinee is like a movie editing tool to create simple animations.
Conditions are necessary for flow control. E.g. start a timer and set the conditions as soon as a defined number is set.
Variable is a storage for a value. You need them if you want to to use a value from/for different actions and events. E.g. increase a number always by one if you activate a button/trigger.
Event are the trigger you can use to start something. Nothing in kismet will happen if you don't connect it to a event.

How a simple sequence could look like:
• A Player enter a volume (trigger volume) → EVENT
• A Condition checks a variable (e.g. the volume was enterd the 3rd time) → Condition & Variable
• An Action will trigger (e.g. every player outside of the volume will be teleported inside) → Action
• A Matinee is triggered and open a door not accessible otherwise → Matinee

Always try to make the visual sript clean and structured.
Sure it's not mandatory, but it's much easier and more fun to work with.

Let's start with creating a comment box for our ambientsounds sequence.
Hold ctrl + alt + left mouse button to select all related nodes.



Right click anywhere and add a "New comment".



name it like: Ambientsounds
Even if you scroll out you can still read the commentbox. The more nodes you have the more you will like this function ;-)



Mover / InterpolationActor
1. We will add the sunset from BlackForest
2. We create a dartboard game
3. Now we will add a few mover and a simple up/down animation

1. First open the BlackForest map and right click at the dominantdirectionallight



→ Find dominantdirectionallight in kimset
You will open kismet where the actor is used.
If the actor is multiple used in kismet you get a list of used nodes and have to choose which one you want.
Copy everything related to the light and paste it into your maps kismet.





As you can see, not all the objectes related to the matinee are defined.
Whenever you copy something from another map you have to check the objects related to them.
E.g. dynamicdirectionallight_0 is only the correct one because we copied it from the same map.
If it would be called ..._1 the link would be broken. Even worse would it be if the light would be copied from another map but with the same name.
→ Take care while copy pasting in kismet ;-)
You can delete the broken nodes. The matinee is still working.
If you changed anything on the light or fog (like i did) we need to adjust the matinee. More to this in the next chapter "Matinee".
The sunset is defined in the Matinee.

2. For the dartboard game i build a small shed with 3 dart boards on trunks. The boards are mover.
→ everytime someone shoot one of the 3 boards a counter should increase by 1.
This counter will be visible at the boards.





• Use the "Damage Taken" Event from these mover
• Every shot should count → 1 damage treshold
• No Max Trigger count → 0 (endless)
• New Action → Misc → Draw Text


• You need a font selected in the content browser



• activate "Display on Object"
• create 3 integer variables and name them board1, 2 and 3



• Add a object of the boards



• New Action → Math → Add Int
• New Action → Misc → Convert to String
And connect them like this:



Now connect the other 2 dart boards the same way (like it's shown in the second next picture).

Test it in your editor.
It should look like this:



Only one thing missing.
The numbers won't vanish now. We could set the display time second to a number larger than 0, but i will add a timer of 5 seconds after the last shot, that will hide the numbers.



3. For the 3rd example we need the matinee so i will start the matinee chapter with it ;-)
23. Matinee
Let's start Matinee where the Kismet chapter end.

The idea is:
• I want to build an elevator not accesible for the players. On this elevator multiple groups of meshes could drive up and down. It's always only one group visible.
This visible one will stay active for a random time then drive down → short delay → another group will drive up.



• I build a few groups i want to use for this. All of these meshes are mover/interpolation actor
I recommend to group them, or create a temporary layer for each group.

We need a matinee to create the animation (up and down movement of the elevator).
We will use a small trick for this. We won't move all the meshes manually, we will only move the elevator. Every other mover will be attached to the the elevator.



In my map the elevator has the name InterpActor_6
Select all groups and write this name to the Attachment → Base



Hard attach whenever you want to move the attached mover, move the base mover in multiple directions, or use a rotated mesh or movement. we don't need the hard attach for this example.

Open Kismet and add a "New Matinee"



Double click at the Matinee Actor



Right lick at the left area "add New empty Group"



Name e.g. mover



The selected actor will be auto connected as object to the matinee. You can also add the object afterwards.
Right click at your new group and "add New Movement Track"

[/previewicon
The autobuild timeline of 5 seconds always have an autostart point. That's the position the mesh currently is (the location of the mesh at the time you build this point).
Next you need another point... the end point of the movement.
→ Go to the 5 seconds end and add a key point like shown in the next picture



The new key is the active key.
Always check which key is active before you move something in the map !!!



I want the mesh do move 640 unreal units down. That should be enough to hide all attached meshes.



You can test the matinee directly in the matinee window.
Press space to start the animation and press again to stop it.
Awesome is the attached actors are also shown in the preview of the matinee.



In general the matinee is made to create movements.
You can add as many keys as you want.
Additional you can also add emitter and soundeffects during the animation.
I recommend to stay at the 5 seconds standard time as often as possible.
Set the length of the animation by the play rate:



The play rate is a multiplier.
Higher playrate values increase the movement speed.
E.g. a 5 second matinee will take just 1 second if you play it with a playrate of 5.
You can configure additional options like looping, rewind on replay or force start position
These options are often usefull for player triggered matinees that could be retriggered during the animation.

Now we need the setup of the mesh groups.
Select one group and
→ New Action → Toggle → Toggle hidden
→ New Action → Actor → Change Collision
The idea is: Hide the mesh as soon as the elevator is down. Unhide always only one group when the elevator move upwards.
Additional we will set the collision to "Block All" when the mesh is vissible, and "No Collision" when the mesh is hidden.
→ Right click at the Target of the toggle hidden or the change collision and add all the selected meshes as object.
→ Click at the Target connector and copy connections to the other node.



Now the same for the other groups.
→ New Action → Switch → Random
→ New Action → Misc → Gate
Use the random switch to randomly select one group that will be unhidden
use the gate for better visual scripting



We will set the Random switch to disable a link once triggered to prevent that the same group could be active twice after each other, at least as long as the random switch is not reseting.
To prevent it even with the reset we would need a storage variable, what's triggered last.
Then check what's triggerd now, if it's the same we need to retrigger. But i would say that's much work for some random visual only example mechanic ;-)

As we want the whole process looping we need to add the loop.
You could simply connect the last output with the first input of the sequence to do this. And often enough i would do exactly this^^
But this time we will do it correctly ;-)
We use "Remote Events". A kismet only event can be used to organize and synchronize.
→ New Action → Event → Activate Remote Event
→ New Event → Remote Event
both nodes need the same "Event Name"
Open the properties and name it equally. E.g. ElevatorUp

At the end it could look like this:
The Sequence:



The Groups:



The final step in the matinee will be the addition of a sound:
Open the content browser and search for a fitting AkEvent you want to add:
I use: AkEvent'WW_UI_Menu.Dosh_Vault.Play_Dosh_Vault_Open_2'
Test it. It seems working right?
But then go far away from your mover... you still hear it.
Always check the audible Distance before using a sound ;-)
What you can use for the elevator is e.g.:
AkEvent'WW_ENV_Destruction.ENV_Door_Sliding_Open'

I often use AkEvent from the SFX folder e.g. from weapons, as these folder are always loaded in the game. So you don't need to load the bank for them to work.

Next open the Matinee → Add a new empty group → name it Sound
→ Add new AkEvent → Toggle it with a key at the start of the timeline like this



Now the sound will trigger everytime the Animation starts. But what's with the reverse direction.
Close the Matinee window, don't hide it, close it ;-)
Always close Matinee when you don't actively work in it!!!
Go to the properties of the Elevator
→ Interp Actor → Close Sound: Use the the same AkEvent



We can also use the → Open Sound option from this config to do what we have done in the Matinee.

So why is it possible in the Matinee too, when it's easier in the Mover properties?
→ maybe you want to start the Sound not at the start but with a delay
→ maybe you want to play multiple/different sounds during one animation
24. Objectives
Objectives are always matter of opinion.
Do you like them?
Do you like them mandatory?
Do you like them in objective mode only?
Which objectives do you like?

If you don't want to use any objectives in your map you can skip this chapter.
You need to know the layout to decide if your objectives should be random or preset. You can't use both in the same map.
Afterwards you should decide if you want them mandatory or not.

• Survival Map: No objectives, random objectives, preset objectives
• Progression Map: No objectives, preset objectives
• Holdout Map: No objectives

Before you think about adding objectives your map should be more or less finished. At least the geometry shouldn't change much more.
As example we add 3 objectives to the map. I want the map to be progression in 7 waves. And standard survival in 4 and 10 waves.
→ Preset Objectives for 7 waves

Possible Objectives:



Available for preset: HoldZone, ExterminateWave (objective mode only)
Available for random: DoshHold
Available for both: ActivateTrigger, CollectActors, EscortPawns, RepairActors

The general idea:
I added a few wood fences to block certain areas of the map. After a defined wave e.g. wave 3 of 7 the first part of fences will vanish..., after wave 5 the rest of the fences will be gone.


To make this "vanish of the barrier" not just a weired invisible event we add an objective that need to be done → mandatory. this objective will trigger (at least the players will think it's like this) the vanish/destruction of the fence.

First objective we add is the
CollectActorObjective:
I highly recommend to NOT do this manually. Open the SteamFortress map and copy every actor related to this objective to your map:
Start your search for all necessary Objects either in the Layers and/or in Kismet.



Use the OBJ_Transport_Gears Layer and add all the necessary actors to this layer.
You can change whatever you want in official maps, you just can't save/overwrite them ;-)

If found 40 actors (46 with lights and emitter) related to the collect gear objective to copy to our map.



In case you cut the meshes from the map you will get a message like this:



continue here.
First we need to copy the meshes, second step is to copy the kismet.
These are the parts of the SteamFortress Kismet we need:



Copy/Cut and paste them to our maps Kismet.
After the copy we need to check the kismet in our map.
Multiple events will be broken, additional we copied things we don't need.
In this case the audio events.
After first cleanup the Kismet could look like this



The final version is:

Every delivered gear will hide one objective colored gear at the objectivevolum and unhide one standard textured gear. As i use 2 different objectivevolumes with the same collect actor it need to unhide and hide always 2 different actor.
The right half is the initial setup. E.g. turn off the lights at map star

I placed all the actors to the storage area with the elevator.



6 Gears incl. lights and trigger + 6 interpolation gear actors + 2 KFMapObjective_CollectActors
The last ones are the volumes you need to deliver the gear.
Majority of configs you need for this objective are part of these volumes.



We will change the Num Required for both volumes:to
3
3
4
4
5
6
This will specify the num required for the playercount.
The collectible Info are the collectibles you need. We want all 6.
I don't want the SteamFortress trader comments about the objective, so i default them.



Next thread in the volume properties is the KFMap Objective Volume Base.
There we will also just negate the sounds.



this objective is now to 95% set.
All we need now to finish it is to acutally activate it ingame.
We need to set if this objective should be triggered random or fxed.
That's part of the "World Settings" chapter.

ActivateTriggerObjective:
Again we will copy the basics from SteamFortress.
Again we will copy first the actors, also include the spline loft actor (that define the objective area you know from the game). Select them manually and add them to the temporary ActivateTrigger Layer.
Second we will copy the kismet.



We need the vary basic of this:





I will replace the button, the lights and so on with a simple axe that break trough the fence in multiple hits.
Every time the trigger will be activated the axe will move.



The activationTrigger volume is like every other volume invisble to players.
To see the active objective area during the game we need something visible that will trigger when the volume is active.
The standard for this are SplineLoftActor:



They need to be linked as "zone boundary splines" to the objective volume



You can change the objective volume as you can wit every other volume.
One important difference is only: the snap point of the volume should be part of the player accessible area. The "trader" arrow to the volume will lead to this point. If this point is inside a rock or something like this there won't be a arrow to this objective.
the spline loft actors can be used like paths. But there won't be an auto path between them, you need to set them manually.
The amount of SplinesLoftActors was to high so i deleted a few of them.
But now the line is broken. We need to connect it like this



After the deletion you should also check the objectivevolume and delete all missing spline boundarie entries.

HoldZone:
We will also copy this one from SteamFrotress. It's the least complex objective, but it's still easier to copy and adjust it.



The volume is pretty horrible to adjust, so i will create a new one in our map and copy only the values to it.



The snap point of this volume would be inside a blocking volume → no arrow to this objective
Easy to fix → Use the geometry mode, move all the edges at once e.g. 960 in one direction.
Outside of geometry mode you just have to go these 960 back. The snap point is not longer blocked.


3 Objectives should be enough for this map.
The 3 objectives are available now.
The last step is to set it at an defined wave (not random). This is part of the second next chapter (world settings).

You want to add the standard random objectives?
The Volume is called KFMapObjective_DoshHold, the setup is pretty much the same as with the HoldZone.
25. Progression / Holdout
The general idea:
Last chapter i set a few wood fences to block certain areas of the map. After a defined wave e.g. wave 3 of 7 the first part of fences will vanish..., after wave 5 the rest of the fences will be gone.



IMPORTANT:
Everytime the active Areas changes you need to
• teleport all players outside to the active area e.g. at wavestart
• set the ZEDSpawns manually
• set the available trader
• set weapon and amo pickups

For the progression setup i cut the map into 5 pieces.
But unlike official progression maps i won't block already open areas when a new one will open.
Only exception is the Boss area. At bosswave every player who didn't enter the area before will be teleported to this area.
Area 1:

Area 2:

Area 3:

Area 4:

Area 5:


The first step in kismet is the progression setup.
We need to define which area should open at which wave and when this is happening, at trader- start or wave start. The easy way to do this is by defining remote events. Always name remoteevents like the thing you want to trigger with them:



For this map i will will define the objectives only for survival 7 waves.
Weekly, endless and survival short and long will be without objectives.
Objective mode won't be part of this map.
Why objectives in survival mode but not in objective mode?
Well, you need servers to host your map. I don't know an single server with workshop objective maps. So if you want people to play your "objective map", you need to host it on your own, or you need to set it as survival map.

A few details to the progression setup:
The level loaded need to be the KF → Level loaded node
The On Trader Openend Event sequence is the basic for progression or holdout. You need the triggerevent "Trader start" or "Wave End" to start these kind of setup.
The switch only trigger the link with the number of the wave.

The standard for switches is that you trigger them multiple times and want all possible outs.
That's not the case for us here. We want only the wave index as switch index.

Area 1 Setup:
Idea: There is a burning plane that damaged a oilpipe and it's blocking the way to the next area.
At first trader the plane will explode → will vanish and lose collision → open area 2.



the scene:



Without the objectives all the blocks should be hidden and without collision from the beginning.

IMPORTANT:
I use a static mesh, or better said an interpActor to block the way as these actors are more dynamic as blockingvolumes. When you need to block a way just temporary i recommend to block it with a interpActor. Blockingvolumes and also dyn. BlockingVolumes are kinda buggy in multiplayer when you change their collision to "no collision" during the match.

Area 2-5 Setup:



We just lower a group of these wood fences when the next area will be available.



These wood fences are set to don't block pathes. The areas behind them are not activated, there won't be any ZED or player behind.
For the movement you can use all mover from one group as the object of the matinee, i just used one mover as the matinee object, and attached all other mover of the group to this "primary" mover (hard attached because they are rotated).

For the teleporter we use the Action → Pawn → Move Pawns Not in Volume
As pawn add the variable player, it will be all players without further specification.
The volume should be a trigger volume you have to build around the boss area.



This blocking volume might be necessary to block ZEDs walking into a future area. As i use 1 ZEDSpawnvolume for 2 areas.



IMPORTANT NOTE for teleporter:
Always check the "overlap" flag. If this is enabled only one player will be teleported at the event. Your options:
• Add multiple teleport end actors (recommended if you want your map to follow official standards)
• disable the overlapp check (recommended if you want your map compatible with max player mutator)

The areas are set now. Also the teleporter to the boss area is set.
Next to set are KFSpawnVolumes, PlayerStart, the Trader and the weapon and amo pickups.



Always when the area changes i want the trader to be fixed. If there is no new area the trader should be random from the activated areas.

Next the KFSpawnVolumes:
Best select them manually, this way you can use one volume for different areas if the map is like this one.
For holdout maps it's very easy as the areas are not connected.
Just ctrl+alt over a complete area, make a layer of this area, and select the spawnvolumes out of this area.
For the Kismet-Setup i recommend using the toggel EX node to toggle the spawns.
• Toggle EX will exlusive activate just the Spawns part of the Node.
• Don't use 2 or more Toggle EX nodes with the same in. Only one of these will be active.
• Don't use the off from the Toggle EX. When you toggle something exclusive off, you toggle every other actor of this kind on.
• Only toggle EX the KFSpawnVolumes you want active.



The Playerspawns:



In this map i think it's good when the player spawn close to the active trader. There is no teleport so he/she can still retrieve lost weapons.

Last but not least, the pickups:



The setup for the pickups need to work for both the standard waves and every already opened area and the objective waves.

Checklist:
• Area
• KFSpawnVolume
• Teleporter
• Trader
• Playerstarts
• Pickups
26. World Properties
Open the World Properties at View → World Properties



World Info → click at the blue arrow right hand side to create a new object.





• Music
Here you can change the music for your map:
The default is for non-seasonal maps.



The Archetype contains the track information incl start and stop event.
For seasonal music you can use the tracks from:
AkEvent'WW_Music_Fall_2018'
AkEvent'WW_Music_Krampus_2017'
AkEvent'WW_Music_SS_2017'

Additional info:
• Level Shadow Depth Bias define the dynamic shadow. Increase to improve performance, but check you standard walls afterwards, it's possible their shadow start to late from bottom to top.
• Wave Spawn Period: Spawn multipler, the lower the faster the ZEDs will spawn.
The map is pretty open so i want them spawn faster as usual.
• Trader Voice Group Class Path: Choose your Tradervoice, i prefer hans ;-)
Your Options are:
KFGameContent.KFTraderVoiceGroup_Default
KFGameContent.KFTraderVoiceGroup_Hans
KFGameContent.KFTraderVoiceGroup_Patriarch
KFGameContent.KFTraderVoiceGroup_Lockheart
KFGameContent.KFTraderVoiceGroup_Santa
• ZED Seasonal Theme ID
→ If you don't like seasonal ZEDs on your map use SEI_Spring ;-)

• Collectibles
Do you want to add collectibles?
You need to set here how many the player need to find to collect "all".
In official maps you often have to find 10 of ~25.
I will use the head collectible from e.g. AshwoodAsylum.
I recommend to copy paste one collectible form an official map and then use and copy it.
Important: Check if Self Destruct is activate



If you used the culldistancevolume you should also proscribe the culling of the Collectibles.



Otherwise it might be hard to see it as player.

Now it's time to use the Objectives:



We only want the Objectives at the medium long survival game.
→ Objectives only at Medium
We want objectives at 3, 5 and 7 wave.
Objectives don't work at 1 or Boss wave in survival mode.
The Index [0] is for Wave 1
The Index [6] is for Wave 7
The Index [7] for Boss Wave

As possible objective use the main objective actor from the layer you used.
If you write 2 or more objectives in one wave, only one will be choosen randomly.
Use Endless Spawning:
→ As long as the objective is not finished the ZEDs will spawn endless
→ The amount of ZEDs from the start value... e.g 400 will still decrease for every killed ZED.
But it will stop at a certain value e.g. 100 you have to kill no matter how many ZEDs you already killed during the endless spawn.
This mechanic could lead to a few weired bugs when you use spawn replacements.
The spawn replacements only work for the intitial 400 ZEDs. And this could change every single update of KF2^^
Use spawn replacements and endless spawning together only if there is no other way.

• Zone Info
Activate the "Soft Kill Z"
Set the "Kill Z" value to something a bit below your map like it's shown in the next pic:
Every pawn, ZED and Player will die when they get below this z value.
That's important to kill pawns when they fall, for whatever reason, trough the map. Without kill z they would fall endless.
To check the Kill line you can change a window to side or front view and scroll out till you see a thick red line. This line should be below every possible spot a player should be able to reach without bug.

• Game Type
Tbh i'm not sure this is necessary.
I started it once, and it's working so i do it for every map.
Set it like in the picture below, just to be on the safe side.



• Precomputed Visibility
The last setting in the world properties you might have to think about.
This is a optimizing step, but from my experience the impact is pretty low on non-Holdout maps.
But the build time will be extreme long.
If you want to try it you need to make Precomputedvisibilty volumes all over your map. But don't make them big, make them as small as possible but they should stil cover most of the map at player view height.
With lot's of destructible actors like we have at hour house i highly recommend to NOT use precomputed visibilty.
Precomputed you can't see inside the house, but when the walls got destroyed you can. Pawns might be invisible inside the House while outside.
27. Import / Export / Preview
My expericne with importing/exporting stuff is limited so i will just write a few basic things about these topics:
Additional you need other software to actually work with exported kf2 assets or to import your own meshes. This guide is about KF2 SDK only. For guides about blender, 3ds max or similar product i recommend google/youtube/official tutorials ;-)

Import
The important step here is to know, which files KF2 can handle.
What do you want to import:
• Mesh: Could be in fbx format
• Music: in WAV
• Texture: TGA
• MIC: You can choose to auto-create the MIC when you import a Texture
For futher information you might need to check UE wiki, or other sources. I don't port maps ;-)

Export

• export a mesh e.g. by right click at the mesh in your map → export → as fbx
• export one or multiple meshes by right click at the content browser subdirectory
→ bulk export
Do you want to export to a single file?
→ No
This way you get e.g. .obj files from every single mesh or whatever actor you filtered before in the content browser.



You want to add sound or music.
Drag and drop your .wav into the content browser.



You can preconfigure a few things...e.g. do you want the sound looping?
Set "Auto Create Cue" to true.
Then press OK.

Right click at the SoundNodeWave and "edit using Sound Previewer"
Wait till it's converting all quality options.



In the properties you can change the quality you want.
The lower the quality the smaller the size of map.
But you won't see it in your save.
You see this compression only at the very last step before you uploadthe map: "The Brewing".
I recommend values between 40-50 for not important sounds and 70+ for important sounds.

Next check the auto-build sound cue
Here you can adjust futher options. E.g. set the Sound Class.
Don't set it to master if it's not important for the map.
If you want to replace the original music you can set the Class to "Music" and delete the official Soundtrack from the WorldProperties.
Then you have to activate the Track/s in Kismet:



Next we will import a texture (preview picture).
Paint is enough for you to do this. But GIMP, Paint.Net or Photoshop are also options ;-)
Let's do it with paint.
• First make a screenshot of your picture with "print"
• Open paint and ctrl + v
• Adjust the picture til you see only the part of the map you want to show
• Save the Map
• Create a preview picture 2:1 and 1:1
• Use e.g. this website to convert the 2:1 image to TGA (e.g. 512x256)
https://image.online-convert.com/convert-to-tga
• Drag and drop the converted TGA file to the content browser
• Add it to your map



I always use a name like this for the previewpicture, and i also set the picture in it's own group.
That's important to know as these are details you need to know to add the previewpicture during the build later on.
• Open the properties of the Texture2D and
→ untick the SRGB
→ Set LODGroup to UI



• Now create a mesh e.g. a modular wall below your map, somewhere were no player can see it. And use the auto created material as material for this mesh.
You need this mesh. Without it the texture and material won't be saved.
→ Save your map
The preview picture should be visible on the mesh now



• Now create a new file in your Windows explorer and name it:
KFWorkshopMapSummary.ini
• Open it with notepad++ or any other editor


[KF-TheGuide KFMapSummary]
MapName=KF-TheGuide
MapAssociation=0
ScreenshotPathName=KF-TheGuide.Preview.UI_MapPreview_TheGuide
bPlayableInSurvival=True
bPlayableInWeekly=True
bPlayableInVsSurvival=True
bPlayableInEndless=True
bPlayableInObjective=False


The screenshot pathname is the Texture2D,that's why it's important if you group it and what's the name of this gorup. The Material is just necessary to safe the Texture2D.
The setting below the screenshot define at which mode your map is available.
For us it should be True everywhere except Objective mode.

• Safe the File, we need it later during the upload.

28. Build
A few words about builds:

• Build Geometry
Use this as often as necessary. E.g. before you build the paths. It shouldn't take long. If it does you might need to check the scene window if you build complex brushes and delete them.

• Build Lightning
Here you can set a few configs for the lightnig build. I recommend to use the standard values and production quality. It take a few minutes longer as with low quality, but you want to know how big you map will be.
I don't use the lightning build in general, i always build everything if i want the lightning build as the others take much less time.

• Build Paths
Use this if you want to check the paths after a change or if you want to test your map. You need to build the paths before a editor gameplay test. Depending on map/path complexity and your hardware this could take up to 30-60 seconds.

• Build Splattermap
This is necessary to update the splattermap view after you made any change at this topic. It should take just a few seconds.

• Build All
I use always this if i want to build lightning. The map is almost finished now (except testing and optimizing). So far i never build the lightning. That should be one of your last actions as the filesize will drastically increase (if you use static shadows).


• Build Errors/Warning
During every build you get a few errors like this:



These are all issues you can ignore. They are not important or will be fixed with the next build.
But there also also many important errors you might need to check.
E.g. 2 or more meshes at the same place.
PathNode issues.
Forgot to set the Kill Z Line.
And much more.
Read all of them, then decide if it's an error or not.
Another standard error you might geht during lightning build is:



Fix it by negate the procomputed shadow from these actors.
SplineLoftActors have no shadow option → Disable "accept lights"

A few hints about the lightning build
The lightning build will take up to 95% of the complete build time, depending on map (lightning/shadow) and your hardware even more than one hour.
If you use precomputedvisibilty with correctly build volumes it might need 2-6 hours.
If you just use one big precomputing visibilty it could take up to 20 and more hours.

The lightning build need all your hardware recources. The more you do during the build the longer it will take and it could even crash.
If your sdk crash even when you don't do anything else and closed every other window you might need to increase your pagefile size.
https://www.tomshardware.com/news/how-to-manage-virtual-memory-pagefile-windows-10,36929.html
Min: 4096 MB
Max: 8192 MB
is stable on 3 tested systems.
Another fix for crashes during lightningbuild is: Deactivate all shadows from pointlightlights.
29. Upload / Update
The final step for your map ;-)

Go to your documents folder and open
...\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC
If you don't have this folder you need to create it.
You might find these two files:



Delete them, these files are your local shader cache, they will be recreated when you open the sdk next time.
But you should delete them if you want to test the map like it will be for other players. They are local no other player will have these files like you.
Copy your map to this folder and name it like you set it up in the workshopsummary file.
The name of the guide map is: KF-TheGuide

The KFWorkshopMapSummary.ini need to be in the following folder:
...\Documents\My Games\KillingFloor2\KFGame\Config\Config
The config folder in the config folder is important.

Close the SDK. And start KF2 SDK → Workshop Upload Tool:



Go to the Maps/Mods Window:
• New Workshop Item
Name it like KF-"name" here it's KF-TheGuide

• Packages to Brew
→ Add the map you want to upload, it only show the files in the "unpuplished" folder

• INIs to add
→ Add the KFWorkshopMapSummary.ini
It should be the lowest entry of the list

• Workshop Title
Should be filled with the Workshop Item name

• Workshop description
Use the steam help and documentation how to add links, pictures and other things for a good workshop description.

• Workshop preview image
→ Use the 1:1 image we made before
Here it will be:



• Tags
→ Use the correct tags for your map:
Don't use Holdout for non-holdout maps and so on.
The right Tags for The Guide map are:
Maps, Survival, Objective (for the 7 wave survival ;-) )

• Brew → Clean and Full Rebrew



This should take between 20-200 seconds for 95% of maps.
Check the output log, warnings are often ok. Errors not ;-)

• Without error
→ Upload to Workshop

Now go to steam, check your profile and click at workshop



Here you can manage your workshop items
Click at the new one.



Important options here are:
• Edit titel & description
• Add/edit images & videos (people like to see a few pictures before they download something)
• Change Visibilty (when you upload or update a map it will be always hidden).
Hidden is ok as long as you test, make it friends only if you want to test with friends and you have a server. Make it puplic after everything is working ;-)

The update process is completely the same:
Use the same workshop item id in the uploader tool so you don't need to set up everything again.
You just need the updated map file, updated workshop description (if you updated it in steam), brew it again and puplish it. It will be of hidden visibilty.

A few notes:
• Don't use similar names for multiple maps... e.g. KF-Map 1 (test) and KF-Map 1
That could result in wrong workshop item will be updated. Spaces are often difficult to handle ;-)
• The profiles of the uploader tool are here:
...:\Steam\steamapps\common\killingfloor2\Binaries\SDKFrontend.Profiles
If you get issues with Tags, what could happen. It could help to check the profile .xml files.
• I recommend to update a map at least once. Even if there is no or just a minor error.
It seems like if you want to update a map after long time (>1 year) you can't update it. The uploader tool won't recognize the already upladed map and will always try to create a new one.
You can fix this by reseting the version of the map in steam to a previous version. And then upload/update from the workshop tool. It shold recognize the map now.

If you want to test directly after the update i recommend to delete the ID from your cache folder, unsubscribe wait a few seconds and subscribe again.
That's the fast way if you want the map to be able on the workshop.
You can also add the brewed map directly to your kf2 cache folder to skip the upload process.

If you have issues during the upload try the following things:
• Use a different preview picture
• Clean the steamdownload cache
• Check if other things in steam work how they should work, check e.g. https://steamstat.us/
30. Common Issues
Pivot

The pivot point is the snap point of a mesh. For most meshes it's the middle or an edge of the mesh.
Unfortunately there are many complex meshes with pivots that are good only for the official maps they are made for.
One example:



It's often the best to go to Top view and zoom out till you see the selected mesh. It could be really far away and not necessarily even on same z level.
To change it on a better position right click where you want the pivotpoint of the mesh
→ pivot → move here



Don't unselect the mesh
Right click again on the mesh and
→ pivot → save pivot to prepivot



Check the pivot in the properties and optimize it if you want.



Terrain Mesh Collision

During your tests you might experience a very special bug, dead ZEDs will fall trough the terrain.
That could happen on easy staticmeshes you use as terrain and increase the size.
You could also trough dosh or your weapon to the ground and it will fell trough it.
To fix this you need to adjust the collision of the terrain like this:



The Save issue
If you close the sdk and you see something like this:



!!!!
Alway Press "Don't save" !!!!
!!!!

The map location issue
Always try to start your map at x = 0, y = 0 & z = 0.
The further you are away the more likely you might get weired and sometimes difficult to find bugs, e.g. lightning artifacts.

Copy from official maps issue
When you copy something form an official you might be unable to move it.
Check it's properties → Advanced → lock location

Disappearing ZEDs / Weapons issue
Bugs like this happen with wrong collision setup.
• First remove all your self made static meshes or set them with "no collision" test again.
It's working check your meshes one by one and rebuild the collision of the broken mesh. Make collision of self made meshes always as simple as possible.
• Disable collision of all facade and sky related meshes.
• Remove all block and kfpawnblock volumes and build geometry

Map crash at start issue
• Always remove your selfmade assets first.
E.g. some official basematerials don't like to be used as basematerial for user generated stuff
→ test again
• Delete your complete kismet and check again
→ test again
31. Testing
Upload your map to the workshop and test it.
Test it
Then test it again.
Test everything you can think about, every collision block you build, every event or mechanic you created.
I recommend to make a screenshot for everything you have to fix during the gameplay.
Then open the SDK with your map, open steam → screenshots window and fix them one by one.
Most issues should be easy to fix.

But if you don't found the issue whatever you do try the following:
• Save the file temporary.
• Delete every blocking volume and kfpawnblockingVolume
→ Test again
• Delete a layer at the area you have the issue
→ Test again
• select all and copy paste everything to a new map. Try to get 0 0 0 as the center of your map.
→ Test again

For testing in KF2 a few console commands are useful:
• enablecheats
• ghost
• fly
• walk
• god
for further info read here:
https://wiki.killingfloor2.com/index.php?title=Useful_Console_Commands_(Killing_Floor_2)

Example how it could look like using
enablecheats
show rigidbody



You think your map is perfect? → No one else played it so far ;-)

If you want to test your map in multiplayer you need a server hosting it. Your options:
Find a server admin who is interested in workshop maps, rent a server, make your own.
32. Difficulty
The map might have awesome visuals, but if it's to easy it could be still boring to play.
Difficulty is important for an action game like KF2. I always try to make my maps as difficult as possible, without making it impossible for singleplayer or 2P, 3P on HoE.
How to adjust the difficulty of your "finished" map:

• Check your map for "Missing" SpawnVolumes. A few good placed SpawnVolumes can make a huge difference

• Mandatory objectives are always more difficult as no objectives or optional ones ;-)

• KFSpawner can help to increase the difficulty on open spots or dead ends

WorldInfo settings:

• The Wave Spawn Period in the WorldInfo. You think your map is far to easy set the wave spawn period to 0.00001 ;-)



• Spawn Replacements can make every map impossible... simple replace every ZED with a Fleshpound ;-)
A more reasonable change could be, replace 0.1 = 10% of all bloats to scrakes.

• Wave Scale simply increase the total amount of ZEDs. E.g. 1.5 means 50% more total ZEDs in this wave


"Serious" options
Tbh, i never saw something like this on a map not build by myself^^
but i like the idea to give the players an option to adjust the difficulty a bit.
The idea:
Give the player a button at the start of the match where he/she can trigger all ZEDs to always sprint during the complete map.
Disable this option at first trader start so no one joining could break the game for the player starting the match.



A Triggervolume will "draw text: All ZEDS sprint button" to the player touching it:
The player should know what he will trigger with this button ;-)
The button itself is the actor: KFTrigger_MinigameButton. Check that it's active in the properties after you set it.
The Pointlights_Toggable will show if its active or not.
The effect itself will be set with the KF → Set Monster Properties
You can use this mechanic also to adjust visual things e.g. a button that will disable the sun or a button that will switch to a second exponentialhighfog with very thick fog, or a button that will start rain.
33. Advanced topics
I will do a full tutorial for the following things, but after the first 32 chapters i need a few days break from the guide^^
So here just a few words about advanced stuff you might want to use:

Terrain editing

You might want to build a terrain by yourself and not just use a simple static mesh as terrain replacement.
The Actor you need is called: Landscape
• You could copy one from an official map: E.g. blackforest, nightmare, zedlanding.
• You can create one on your own: Here a short video from rockmax ;-)
https://youtu.be/wYb1f5wHp-E

But the issue you get when uploading a map with a terrain is:
→ The terrain lose its texture, that's unfortunately the case in many workshop maps.
Your options:

• You can convert the terrain to a staticmesh. You need additional programs for this. E.g. blender. So i won't write further about this ;-)

• You can use the serious terrain fix ( and yes, i found it ... so i'm free to give it a name :D )

→ Go to your ...\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC
where your map file is
→ Copy the mapfile in the same folder and rename it to something prior in alphabetic order
→ I name my copy always KF-a
→ Open the uploader tool
→ Add this KF-a map to your packages to brew... so you brew 2 maps at once. E.g. KF-a and KF-TheGuide.
→ Brew the package
→ Go to your pubplished folder:
...\Documents\My Games\KillingFloor2\KFGame\Published\BrewedPC
You should see both of your maps here: KF-a and KF-TheGuide
When your actual map file is larger than the KF-a the landscape Material is included
→ Back to the uploader tool delete the KF-a file from your package
→ Upload your map to workshop
(This "fix" is working for up to 9 different landscapes)

Cutscene

You want to use a cutscene for your map? Then there are 2 very different options to add them:
• 1. A cutscene after the boss, like it's in objective mode:
I highly recommend to copy paste the helicopter and it's attached assets from Outpost to your map. Afterwards copy paste the kismet for the helicopter to your map and adjust it.
IMPORTANT:
Do this only when the cutscene is the final sequence. The player don't need to move aftewards.

• 2. A cutscene during the map, e.g. at traderstart:
I made a map with multiple of them:
https://steamproxy.com/sharedfiles/filedetails/?id=2622243495
For now i recommend to play the map so you know which actors will move and where the cutscenes are. Then open the map in sdk, go to one of the cutscene actors and copy the kismet + all related remote events ;-)
The general idea: You need to move the camera actor for every individual player to the actor you want to show during the cutscene. You move the shown actor and the camera position with a simple matinee.
After the cutscene the camera for every individual player need to be set to the index of the actual player.
I made the map possible for 32 players, so i set the camera for player index 0-31.
This is very weired and seems redundant, but unfortunately it's the only node i found which is not buggy after the cutscene.

A few additional vids provided by RockMax:

• Custom ammo box
https://www.youtube.com/watch?v=klQOzy8NVQg

• Decal Material
https://www.youtube.com/watch?v=cxLfYTyfedk

• Sky MIC
https://www.youtube.com/watch?v=NM0d1EtDSHY

And another interesting chapter "importing videos to kf2 sdk" provided by Kasder. Also thanks for sharing to him ;-)

Download bink from Rad video game tools from http://www.radgametools.com/default.htm
Ensure your video can be processed.
I use a video editing software to export a wmv video file.
Do ensure that the video resolution and file size is acceptable.
I use 480p (852x480) often as I import videos over 1++ min long.
The larger the resolution and the longer the video, the larger the file will be.

If your video has audio, follow these steps, if not skip it:
Using the same video editing software, rip the audio from the video file as a wav file.
Do take note that the video sound has to be imported seperately into KF2.
Hence which is why it has to be seperated.

Open Rad video game tools (radvideo.exe), select the wmv file and click bink it!
Do not tick compress audio. We do not want any audio in the bik file.
Click bink it and a bik file should be generated.

Open KF2 SDK and open you map file, open content browser click import.
Find your video, click open.
It is good practice to give it a "Grouping" in the map for file organisation.
You want to select moviestream_memory instead of moviestream_file.
Right click the newly created texture movie file and click edit.
You can change some settings like no looping or no autoplay and reset on last frame etc etc.

Create a new material, preferably with a similar name.
Open material editor of new material.
Drag drop texturemovie into the material editor.
Link into diffuse or whichever link you want. Save.

Open Kismet, right click, new action > cinematic > control movie texture.
Select the movie texture in the content browser, click on the green arrow in kismet.
Use this kismet action node to control your video.
Don't forget to save.
If your video has audio, import it in now, link in kismet to play audio when video plays.


So ... i think that's enough for a "short" kf2 mapping guide. With these information you should be able to build pretty much every map you want and if you need things not covered in this guide you should be able to find a fix or workaround yourself.

Thanks for reading, comments, suggestions

Happy Mapping ;-)
12 ความเห็น
R2 1 ธ.ค. 2024 @ 4: 09am 
Fruke
Try it reinstall SDK to directory KF2.
Fruke 21 ส.ค. 2024 @ 12: 08pm 
Can anyone help me, I'm trying to launch the KF2 sdk through steam and nothing happens - seems a few people have been having this issue in recent years
Mr Senpai 21 เม.ย. 2023 @ 7: 07pm 
how can i copy a map into my map??
E.g i make houldout map and i want to copy a litle map from powercore or diffirent houldout map .
How can copy a map and all build from that map into my creat map??
Serious  [ผู้สร้าง] 3 ธ.ค. 2022 @ 4: 49am 
16 uunits are one feet or ~0.3 m in UE3 and the default character size is 180 cm if i remember right
It's long long ago i read the last time about this i think the fiew of the character is at 160 or 170 cm.
But this should be easy to check in. I will check this later to day :)
xXUmbrellaAgentXx 2 ธ.ค. 2022 @ 7: 45pm 
Great guide! Thank you! One question, and maybe I just haven;t seen it yet in your guide, but do you or anybody know what the default "Units" of measurement KF2 SDK uses? I know UE4 for example, uses a 1cm = 1 Unreal Unit formula. So I'm wondering what is it for this? (EX: 1 Unit of "Measurement" = 1 KF2 Unit.) Also, what is the default size for the player character in those Units? Want to design my own assets and modular pieces but cannot find this information anywhere for some reason.
Wehzy 13 พ.ค. 2022 @ 12: 15pm 
Thanks for postin this. Always wanted to check out KF2 mapping.
Christina 10 เม.ย. 2022 @ 9: 41am 
Thank you for making this guide, Serious. I'm definitely keeping it bookmarked, there's a lot of interesting stuff to look at. I know I might have said it before, but you're one of my favorite mappers for the game, your maps are always very creative and I appreciate how friendly and pleasant you are. :)
xSnowy 1 มี.ค. 2022 @ 5: 24pm 
:steamthumbsup:
Serious  [ผู้สร้าง] 1 มี.ค. 2022 @ 3: 16pm 
Thanks for the comments and steamawards :Olaf_Emoticon:
@sR~, i started working on a new progression/holdout map yesterday.
So the gameplay will be like egypt houldout but with a very different setting.
But there are some areas to build for this map... this could take some days. ;-)
Der'Kyela 1 มี.ค. 2022 @ 2: 17pm 
This is awesome! Thank you for all the effort you have put into this! :Fistofdosh: