Multimap Functionality

With the release of Conan Exiles: Isle of Siptah, we have added support for multiple maps to Conan Exiles. This is an overview of how to utilize that functionality and create additional maps.

Dedicated Server

Picking a Map via ini file: This is the preferred way to select a map for the server to run on. You need to edit Engine.ini located in Conan Exiles Dedicated Server\ConanSandbox\Saved\Config\WindowsServer. Add the following lines to this file:

[/Script/EngineSettings.GameMapsSettings]
ServerDefaultMap=/Game/DLC_EXT/DLC_Siptah/Maps/DLC_Isle_of_Siptah

Replace /Game/DLC_EXT/DLC_Siptah/Maps/DLC_Isle_of_Siptah with the filepath to the map you wish to play on. For the Exiled Lands this should be /Game/Maps/ConanSandbox/ConanSandbox

Picking a map via command line: This is a secondary way to select a map for the server to play on. Add the map path to the command line for launching the game, with no -, before the other command line options. It should look something like this

ConanSandboxServer.exe /Game/DLC_EXT/DLC_Siptah/Maps/DLC_Isle_of_Siptah -log

Save Files: Each map holds its own save file which is loaded when the map is started. The save files have a .db suffix and will be named something different for each map. For Exiled Lands this is Game.db, for Siptah this is DLC_Siptah.db. Each map also has their own backups and upgrade files.

Making a Map

Part of the multimap functionality was exposing everything needed to make a map to mod support, so that modders can make their own maps. As such, making a new map should be completely data driven. The basic flow for this is to either load different data files based on which map you are on as defined by the MapDataTable, or to add map restrictions to specific data tables and take those restrictions into account when reading the table.

The New Map (UWorld)

When planning a new map do not make a map bigger than 8km x 8km . Physics checks stop working outside that limit due to Code optimization.

Unreal documentation on good Landscape practices and settings:
https://docs.unrealengine.com/en-US/Engine/Landscape/TechnicalGuide/index.html

Unreal documentation on World Composition:
https://docs.unrealengine.com/en-US/Engine/LevelStreaming/WorldBrowser/index.html

For Isle of Siptah we used World Creator ( https://www.world-creator.com ) to experiment with landscape shapes and importing this as a heightmap into Unreal. During the course of production all areas have been manually touched, but it served as a useful quick iteration tool and a base to start with.

Undermeshing

Our players are quite skillful in finding new ways to build their bases in areas not intended, usually giving them a huge unfair advantage.
One on the most common exploit is utilizing the gaps between meshes and/or terrain and building their base there.

Anti undermesh system and special properties volume:

Because of the undermeshing exploits players have been using, an anti undermesh system has been created to stop players from being able to build and access areas they are not intended to. This system will detect if players are underneath or inside terrain or static meshes and will then kill players after a certain amount of time has passed. To prevent players from being killed inside caves, which normally are located under the landscape, a special properties volume is necessary. The special properties volume must cover all parts of the cave and allow undermeshing must be ticked on for the volume to work:

In case you want to make a cave that should also allow building in it, then you should tick the AllowBuildingUnderheightmap box as well.

This must be properly set up in caves even without PVP, as NPCs are using the undermesh detection system to navigate terrain and know where they are not allowed to go

Building blockers
If you want to limit the areas players can build: Create a BP_SplineBuildLimit that covers the playable build area and tag “Allows inside”. Anything outside this will be non-buildable unless you create more splines with “Allows inside”.
Create nobuild areas within this using additional volumes and splines.

For complex shapes use: /Game/Systems/BP_SplineBuildLimit (Often refered to as a BuildingBlockerSpline)

For simple shapes (Box) use: /Game/Systems/Building/BuildingBlockerVolume

Building Blocker volumes and splines need to be in the “Persistent Level” to ensure they are always loaded and active even if you teleport.

Climbing blockers

To stop the player from climbing in an area:

To allow climbing in an area which is climbing blocked, like ladders in a dungeon, use /Game/Systems/Building/BP_ClimbingOverrideVolume

Foliage

Procedural foliage (Experimental feature in unreal 4.15)
If using Procedural Foliage Volumes, it is very important that you set
Is editor only = ON & Initial Life span = 1
This is to stop the volume existing at runtime, which would block all npc attacks from hitting anything and break admin teleporting.

Water

It is often easier to just copy this from previous made map, but this will explain the components needed.

To be able to drink water:


Ripples:

Sound:

Pathfinding:
To stop monsters from pathfinding into a swimmable area: Create a “Nav Modifier Volume” and give it "Area Class - NavArea_Water”

Swimming:

Post process Volume is needed for underwater camera affect. Create your own or Use an existing one from Exiles/Isle of Siptah.

Good practices:


Optimization

It is good practice to have Camps and Caves in separate levels. This allows you to give more different streaming distances to reduce the amount of content in memory. Having anything underground in a separate level also makes it easier to make a Landscape LOD of only the “top” part.

Instancing:
Large amount of similar assets close together in an area should be instanced together to save drawcalls.
We use the Instance Tool add-on for this work, but be aware that:

Landscape:

On Exiles & Siptah we use no more than 4 landscape layers per chunk due to a hard lock on PS4 and general performance cost.
To see the layers used, make sure you are in Landscape Mode → Paint and find the Landscape visualizers


Use LOD 1 collision on landscape to save memory/performance.


The collision will be less accurate since it has less polygons than the visual mesh, in most cases this is not an issue, but there are things to be aware of.

Materials

If making a new asset, do not tweak any material that has a Material master used in a previous DLC/main game. Duplicate the master if need be and make material instances from this. Tweaking materials using existing Master Material files will trigger a granite bake for it, potentially increasing patch size by several Gigabytes.

MapDataTable (Content/Maps/AlwaysCook/MapDataTable)

The MapDataTable is the most important part of making a map. It defines many of the resources that your map will pull from in order to differentiate its behavior from other maps. It also provides names for your map in the UI, and for your map’s save files. Many of these are self explanatory, but we will discuss some of these in further detail later on.

MapDataTable must be loaded and merged early, before the Main menu is loaded.

To load and merge data for maps added by mods:

  1. Create a new directory in your mod called “ PreLoad

  2. Create a new, additional ModController in the “PreLoad” directory

  3. Create a new data table based on the MapDataRow in the “PreLoad” directory and add a new row with info about new map

  4. Add call to the MergeDataTables in the ModDataTableOperations function in the new ModController in the “PreLoad” directory to merge that new table to the MapDataTable from the base game

Map Coordinates and Spans

These enable player positions in the world to be mapped to positions on the 2d texture provided by the fullscreen map. You can get a map position using Ctrl+Alt+Shift+L in editor. I suggest choosing two locations that are easy to identify on the map and in world. Get the texture coordinates from the map, and go to those locations in world and get the world locations. You may need to adjust with a bit of trial and error.

Dungeon Locations Table

This table defines a mapping between dungeon locations and world locations on the map UI. If a player is within the MapToOverride and the GeneratedBounds then their location will be set to the OverrideLocation. This is how a player inside the Well of Skelos, which is actually far to the northeast of the map, appears to be located inside the volcano on the map.

  1. Find the “DungeonLocations” table

  2. Add a new entry to this table (or more if there are more levels you want to add as dungeons).

  3. Select a level to add in the MapToOverride drop down and add an override location. This could be the x and y world coordinates of the dungeon entrance.

  4. Now start the game in the editor as normal. Any map should do.

  5. Open the console and type in GenerateLevelBounds. The game can/should freeze at this point, but wait for Generation Complete to show on screen before you continue.

  6. When generation is done leave the game running and open the DungeonLocations (you need to close it first if it was already open) and make sure the GeneratedBounds are there for your new dungeon(s).

  7. Open the map in game (M) and press one (1) on the keyboard. Check that the dungeon is showing in the correct area on the map.

  8. Save and submit the DungeonLocations table.

Purge Config Table

This table sets up how the purge works, which locations are valid for which purges and so forth. This is too long do document here, instead please refer to Purge

Hints Table

This table is a list of hints that each have a random chance of being chosen to show up on a loading screen. Simply add a new entry in the table and write out your hint in the HintDescription text box. This table should use the HintsStructure struct as its base.

Character Creation Class

Character creation can be customized per-map. Each map has its own Character Creation actor that defines how its character creation works. In the properties panel on the character creation actor you can define cinematics, whether the finalize note is attached to the player, and overlay widgets for the cinematics. In the viewport you can supply camera positions for the various phases of character creation, and an animation blueprint to use for animating the character during character creation.

This actor is created when the character creation widget appears, and is placed in the world at the location of an actor with the actor tag “CharacterCreationActor.” Once you place this actor you can build your character creation scene around it to define how you want character creation to look.

Spawn Locations (MapSpawnLocations data table)

The Isle of Siptah update added the ability for players to select between multiple spawn locations for their randomized spawn location if they do not have a bed or bedroll, and do not have a dynamic spawn point (such as a dungeon).

Create a new row in this table for each map.

You must then place BP_ConanPlayerStart or PlayerStart Actors in your level and give them the tags used in SpawnPoint_NameTag in order for players to utilize them.

Character Preview & Dye Window

The character preview (Paperdoll) and Dye Window utilize a special level within the map that you will need to have set up. You can just copy Paperdoll.umap located in Content/Maps/ConanSandbox as it has everything set up to support this and no changes will be needed. The important thing to remember when setting this level up is that it needs to have its Streaming Distance disabled, otherwise it will only work when a player is within a certain range.

To do this, open the Levels window and then open the World Composition from there. Create a new layer by pressing the + icon at the top and name it BlueprintStreamed. Uncheck Stream Distance for this new layer, then add the Paperdoll level to it.

Exiles Journey (DT_ExilesJourney)

This data table defines journey steps. Each journey step has a MapRestriction array. A journey step will be available on all maps provided in this array. If the array is empty, the journey step will be present on all maps.

One important thing to keep in mind with Journey steps is to preserve the number of steps in each chapter. The UI will not automatically adjust its layout so a journey chapter without exactly 10 steps in it will cause UI issues.

Temperature

Temperature for a map is provided by a grayscale texture, with pure black being the coldest, and pure white being the hottest temperature. For reference, see T_TemperatureMap. Somewhere in your level you will need to place an actor with an EnergySource component on it. This allows you to set some values for how Temperature is managed in your map.

Here are the values for Siptah for reference

The important values here are the Energy Map, which defines the texture we discussed earlier, and the Top Left, Bottom Right values. An important note here is that Top Left needs to have positive values, and Bottom Right needs to have negative values. This may mean, depending on how your map is laid out in world coordinates, that you may need to rotate your texture 180 degrees so that it is upside down, and allows these values to invert it.

You can check your temperature map in game by pressing ] when the map UI is open. You may need to zoom in and back out once to get the temperature image to scale to the right aspect ratio.