# 5. Level Modding

# Beginner's Guide

This guide will cover the basics required to get started with level modding.

# Section 1: Before you begin modding

Section 1 will cover everything you need to know before you can begin editing or making your own enemy encounters.

There will be non-essential steps that you don't technically need to do, but it will streamline the modding process and be good in the long run. Watch out for those.

# Section 1: What is a level mod?

In order to untangle the mess that is teaching the pre-requisite knowledge of being able to create level mods on your own, it is best to lay down the process step by step.

This is something I've noticed this wiki does not do. It may have a lot of useful documentation such as eventcalls and miscellaneous entities such as damage triggers, particle effects, etc., but it does not put together a concise tutorial on how to use them properly.

This guide sets out to correct this.

First, a brief write-up of what exactly level mods are and how they work.

<p class="callout info">TL;DR: A level mod replaces the "level file" within a map's .resources file(s), which contains the sum total of all of its assets.</p>

A single map in Doom Eternal has the sum total of its assets and files located within its RESOURCES files, with the file extension ".resources".

A RESOURCES file is what you would imagine it would be, a file that is jam packed with a huge amount of assets and resources that, when combined and used by the map, form the entire experience of playing through it.

You can even see them for yourself. On the Steam/Windows version of Doom Eternal for example, the RESOURCES files for the World Spear for example are located in:

```
C:\Program Files (x86)\Steam\steamapps\common\DOOMEternal\base\game\dlc2\e5m1_spear
```

[![image-1644208628360.png](https://wiki.eternalmods.com/uploads/images/gallery/2022-02/scaled-1680-/image-1644208628360.png)](https://wiki.eternalmods.com/uploads/images/gallery/2022-02/image-1644208628360.png)

The \_patch files are merely extensions of the main file and are noticeably smaller in size, although \_patch2 is larger because it contains all of the World Spear's official Master Level assets.

These RESOURCES files, when combined, have everything the map needs to function properly. They have everything from particle effects to models to, most importantly, the file that determines how the map operates when loaded.

This file, with the file extension .entities, is what id Software themselves change when they push a new master level out.

This file is highly important, it takes all the individual assets in a map's RESOURCES file and mashes them together into a single playable experience. Particle effects, hazards, enemy encounters, triggers. Everything.

So all in all, these RESOURCES files, especially the .entities file, are pretty important then. The only thing they *don't* have is the map geometry itself.

Level mods edit these RESOURCES files directly. Specifically, they <span style="text-decoration: underline;">**replace**</span> the .entities files within. You know, the thing id Software themselves change when they push a new master level out.

Next step, we will gather the required tools needed to create level mods in a fast and efficient way. Don't worry, it's not a lot!

# Section 1: Required tools part 1

Now that we know that the file we actually edit to create a level mod is the .entities file, we will need a way to edit it.

And not just edit it, but find a way to edit it on the fly so we don't need to re-compress and re-inject the file after each and every change.

It is important to note a few, crucial details, each of which will have a corresponding tool or helpful asset to help with that.

1\. As you have seen in the last page, the .resources files aren't exactly openable. We will need to extract the .entities file from them to edit it.

2\. If you were to open the .resources files of a map, including its \_patch versions, you may notice multiple ones have their own .entities file. What gives?!

3\. This .entities file is actually just text and can be opened with any text editor. Unlike id Software who uses their own software called idStudio to edit levels in a 3D environment, we are left with 2d text. An .entities file purely consists of defined entities, or entitydefs. Entitydefs can be anything from triggers to encounter managers to pickups.

Example 1: An entity that is defined to be a spawn point for a marauder.

```
entity {
	entityDef encounter_5_marauder1 {
	inherit = "target/spawn";
	class = "idTarget_Spawn";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		[ The stuff that usually goes here ]
	}
}
}
```

Example 2: An entity that is defined to be shotgun ammo.

```
entity {
	entityDef pickups_pickup_ammo_shells_26 {
	inherit = "pickup/ammo/shells";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		[ The stuff that usually goes here]
	}
}
}
```

4\. If you ever tried to open the .entities file within an existing level mod, you may notice that it's made up of nonsense weird characters. This is because the file is compressed. Decompressed files are the plainly text versions you see, but are too large to replace an existing .entities file, which is why they are compressed before being put into a level mod.

5\. Assuming you want to spawn in an enemy on a brand new spawn point, you do not have any readily available way to have your current coordinate match the file's formatting.

Example 1: A basic spawnposition and spawnorientation. Does this look like you can manually type it out by hand, every single time?

```
spawnOrientation = {
	mat = {
		mat[0] = {
			x = 0.707107;
			y = -0.707107;
			z = 0.000000;
		}
		mat[1] = {
			x = 0.707107;
			y = 0.707107;
			z=0.000000;
		}
		mat[2] = {
			x = -0.000000;
			y = 0.000000;
			z = 1.000000;
		}
	}
}
spawnPosition = {
	x = -99.080002;
	y = -278.399994;
	z = 22.00265;
}
```

If these details made no sense to you, don't worry. I will provide each tool and let you know how they work in setting up your foundation to edit a level with.

They are:  
  
1\. SAMUEL to extract the .entities file from the .resources files.

[Download link for SAMUEL: GitHub](https://github.com/brongo/SAMUEL/releases)  
  
2\. A list of a map's current highest priority so you know *which* .resources file to extract from and subsequently edit. The game uses the .entities file from the map's highest priority patch. If you choose the wrong one and have your mod replace the .entities file in the wrong patch, it won't work.

[Link to the list: Google Docs](https://docs.google.com/spreadsheets/d/10R5fWKGyqPuCPdueqKeCYycHETSHg0QeFOCbWIQZUCY/edit#gid=1914776120)

3\. NotePad++ to edit the .entities file with. You may also use EntitySlayer, a program that is specifically designed to work with these files, but this guide will not use it as I have no experience with it.

[Download link for NotePad++: Official website](https://wiki.eternalmods.com/notepad-plus-plus.org)

[Download link for EntitySlayer: GitHub](https://github.com/FlavorfulGecko5/EntitySlayer/releases)

4\. idFileDeCompressor. You will not need to use this tool to decompress extracted .entities files as SAMUEL neatly gives them to you already readable and editable, but you will need it to re-compress them when packing them in the final .zip file in order to let level mods use it without giving you a memory error. EntitySlayer also has an option to compress files without the need of a dedicated compressor tool.  
  
[Download link for idFileDeCompressor: GitHub](https://github.com/brunoanc/idFileDeCompressorGo/releases/latest)

5\. meathook.dll. This tool is so useful for level modding that without it, I would say at least 99% of all master level mods would not exist today because they would've taken too long to make, ludicrously long. Meathook allows for on the fly editing and without it level modders would've been stuck re-compressing and re-injecting their edited .entities file over and over.

[Download link for v7.2: Direct download](https://github.com/brongo/m3337ho0o0ok/releases/tag/v7.2)

Next up, we will go over how to use these tools to set up your foundation for making a level mod.

# Section 1: Required tools part 2

Now that you have the needed tools, let's go over how to use them to set up your level mod. Don't worry, you'll be editing encounters in a step or two.

First, do the following:

<p class="callout info">Make sure you have the mod injector and all of its related contents installed beforehand, including file replacements, the mod injector, the mods folder, etc.</p>

1\. Download SAMUEL and extract its contents to anywhere you want.

2\. Open the list of the game's highest priority resources and have it on standby on a tab somewhere.

3\. Install NotePad++.

4\. Within IDCOMPRESSOR.zip, open the compressor files in which there should be two files, a .exe and a .bat. Place both files where you also put your mod injector, the DOOMEternal folder.

5\. Place meathook, which is going to be a file named XINPUT1\_3.dll, where you put the idFileDecompressor files, the DOOMEternal folder.

Now that we have all of our tools installed and put where they need to be, we can get started on setting up your mod.

We will only need the first 3 of these tools to begin, meathook is used during the modding process and idFileDecompressor is for when you're done with it.

We aren't going to setup the .zip files you see that are parts of mods, that will come at the very end.

Instead, we are going to setup an **overrides** folder that allows for the live editing of .entities files.

Here, we are going to set up an overrides file path for Cultist Base.

The process for each of them vary only in one step. You will see what I mean.

1\. Decide what map you want to edit. In this case, we've already decided on the aforementioned map.

2\. Find the names of the map as defined by the game. Cultist Base is e1m3\_cult.

-You can find the names of every map [here.](https://wiki.eternalmods.com/books/2-how-to-create-mods/page/extracting-resources)

3\. Using SAMUEL, we will extract the *correct* .entities file for each of the three. Open SAMUEL.exe, and click on Load Resource on the bottom left corner. A window will pop up asking you to select a file. We are going to extract Cultist Base first, so navigate to its .resources files.

```
C:\Program Files (x86)\Steam\steamapps\common\DOOMEternal\base\game\sp\e1m3_cult
```

4\. When you open this folder, you will see multiple .resources files, most of which you will find has its own .entities file if you were to open them up. In order to extract the correct one, we will get it from the .resources file that has the highest priority. Open up the list of highest priorities, and CTRL+F "e1m3\_cult". The **first** result that pops up is e1m3\_cult\_patch3, meaning that the .entities file in this specific .resources file will be the one the game uses. Open e1m3\_cult\_patch3.resources using SAMUEL.exe

5\. Look for .entities in the search bar. There will be one result. A file named e1m3\_cult.entities. Double click on it to export it.

[![image-1644285070370.png](https://wiki.eternalmods.com/uploads/images/gallery/2022-02/scaled-1680-/image-1644285070370.png)](https://wiki.eternalmods.com/uploads/images/gallery/2022-02/image-1644285070370.png)

6a. The file will be exported to the exports folder that is where SAMUEL.exe is located. Open the file with NotePad++, and make sure all future .entities files are opened by it.

6b. Export the file again to keep around as a reference point for the default .entities file. You don't have to do this, but it will make things easier.

7\. Now that we have the correct .entities file for Cultist Base, we are going to create an overrides folder in the DOOMEternal folder and place it in there so that it, the editable text file, directly overrides what the game uses so we can save our changes and reload quickly and efficiently. More on reloading in section 2. Within the DOOMEternal folder, create a new folder called overrides.

8\. You may have noticed there is a specific file path to the .entities file when you look it up in SAMUEL. We will have to recreate this exact file path within our new overrides folder. When you are done, your file path to your new editable file will look like this:

```
DOOMEternal\overrides\maps\game\sp\e1m3_cult\ <-- put the exported file in here
```

Your .entities file should now be here:

```
DOOMEternal\overrides\maps\game\sp\e1m3_cult\e1m3_cult.entities <--
```

<p class="callout info">When making overrides for TAG1 and TAG2, "sp" must be replaced with "dlc" and "dlc2" respectively. This is because "sp" is specifically in reference to the base campaign. Examples of DLC level overrides are below.</p>

```
DOOMEternal\overrides\maps\game\dlc\e4m3_mcity\e4m3_mcity.entities
DOOMEternal\overrides\maps\game\dlc2\e5m2_earth\e5m2_earth.entities
```

Let's test to make sure the overrides folder is added correctly. We're going to make an immediately noticeable change: switching the music. Open your new .entities file and CTRL+F idMusicEntity. Replace "cultist\_base\_music" with the music from Nekravol, "metal\_hell\_music".

More information on idMusicEntity(s) [here.](https://wiki.eternalmods.com/books/5-level-modding/page/idmusicentity)

Once you've made the change, open up DOOM Eternal and load up Cultist Base. If you already had Cultist Base open, type mh\_force\_reload in the console to reload the change. If the music is Nekravol's you've installed the overrides correctly and we can now start editing encounters. If it is not, please go over the last few pages again until you've successfully changed the music.

Of course, when you are ready to move on, feel free to revert the music. It was just a test.

# Section 2: Let's begin modding

Just as a refresher, this section assumes you have an editable .entities file in the correct place in which you can make changes on the fly.

Here, we are going to do the very core of level modding, editing encounters. The full walkthrough will include:

1. Learning about idAI2(s), idTarget\_Spawn(s), idTargetSpawnGroup(s), and idTarget\_Spawn\_Parent.
2. Using this knowledge to replace an existing demon in an existing encounter, then to...
3. Create and spawn a new demon in an existing encounter, then to...
4. Create an entirely new encounter.

Afterwards, we will move on to section 3, which will consist of just about everything else you can do in an encounter such as changing the music state, making and spawning our own orange barriers, event flags, and activating hazards.

Section 4 will cover all the miscellaneous stuff such as importing DLC ai and resources.

# Section 2: idAI2s and spawns

Before we edit an encounter, we need to know about the behind-the-scenes elements going on.

Specifically, this section will cover idAI2s and spawns.

#### idAI2s

Earlier, I said that:

<p class="callout info">An .entities file purely consists of defined entities, or entitydefs. Entitydefs can be anything from triggers to encounter managers to pickups.</p>

An idAI2 is an entity for a specific demon.

What do I mean by that? Let's take a look at an idAI2 for an Imp.

```
entity {
	layers {
		"spawn_target_layer"
	}
	entityDef ai_custom_imp {
	inherit = "ai/fodder/imp";
	class = "idAI2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		[ The stuff that usually goes here ]
	}
}
}
```

You can CTRL + F "ai/fodder/imp" to see what's usually in the edit section. It consists of important but irrelevant settings so I will not be including it here.

Think of idAI2s as the demon itself. These entities, however, will not do anything if you were to copy + paste a new one into your file. They need to be *spawned* in order to exist as you typically see them in-game.

How can we spawn them? We will get to that in this next section:

#### idTarget\_Spawns

idTarget\_Spawns are exactly what you think they are: they're spawn points for demons.

The catch is though: they must reference an idAI2 in some way.

<p class="callout info">I cannot stress this enough, a target spawn *must* reference an idAI2 in some way, either by itself or by being part of a spawn zone that references a spawn parent that references idAI2s.</p>

Making a spawn point is easy: copy + paste an existing one and edit the four important things:

- entitydefs
- aistateoverride
- spawnOrientation
- spawnPosition

It is these four, *and only these four*, that matter.

Here is an example of a custom spawn point, notice how it references our Imp idAI2 from earlier. I have also marked the other important things to edit with comments.

```
entity {
	entityDef custom_imp_spawn_1 {
	inherit = "target/spawn";
	class = "idTarget_Spawn";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnConditions = {
			maxCount = 0;
			reuseDelaySec = 0;
			doBoundsTest = false;
			boundsTestType = "BOUNDSTEST_NONE";
			fovCheck = 0;
			minDistance = 0;
			maxDistance = 0;
			neighborSpawnerDistance = -1;
			LOS_Test = "LOS_NONE";
			playerToTest = "PLAYER_SP";
			conditionProxy = "";
		}
		spawnEditableShared = {
			groupName = "";
			deathTrigger = "";
			coverRadius = 0;
			maxEnemyCoverDistance = 0;
		}
		entityDefs = {
			num = 1;
			item[0] = {
				name = "ai_custom_imp"; // the idAI2 is referenced in here
			}
		}
		conductorEntityAIType = "SPAWN_AI_TYPE_ANY";
		initialEntityDefs = {
			num = 0;
		}
		spawnEditable = {
			spawnAt = "";
			copyTargets = false;
			additionalTargets = {
				num = 0;
			}
			overwriteTraversalFlags = true;
			traversalClassFlags = "CLASS_A";
			combatHintClass = "CLASS_ALL";
			spawnAnim = "";
			aiStateOverride = "AIOVERRIDE_TELEPORT"; // this specifies that this ai will spawn in alongside the red teleport FX you see
			initialTargetOverride = "";
		}
		portal = "";
		targetSpawnParent = "";
		disablePooling = false;
		spawnOrientation = { // this is where the ai will face when it's spawned. it is ignored if the ai is teleported in.
			mat = {
				mat[0] = {
					x = -1.000000;
					y = -0.000000;
					z = -0.000000;
				}
				mat[1] = {
					x = 0.000000;
					y = -1.000000;
					z=0.000000;
				}
				mat[2] = {
					x = -0.000000;
					y = 0.000000;
					z = 1.000000;
				}
			}
		}
		spawnPosition = { // this is the spawn position of the ai
			x = -30.209999;
			y = -11.000000;
			z = -10;
		}
	}
}
}
```

Everything else in the target spawn can, and should, be ignored.

You can use the same idAI2 for as many target spawns as you want. For example I can very much have every single new spawn point I make that I want to support an imp all use "ai\_custom\_imp".

This is how idAI2s and idTarget\_Spawns work with each other. The idAI2 is just an entity for a specific demon that target spawns will take and place wherever you want, however many times you want.

Before going into encounter editing, we ought to go over two more entities that use idTarget\_Spawns, idTargetSpawnGroups and idTarget\_Spawn\_Parent, and how they are used in an encounter as well.

After that, we will go over incorporating all of this into an encounter in the next page, including how to obtain usable positions for our custom spawn points.

#### idTargetSpawnGroups

Earlier, you may have noticed that I said target spawns must reference an idAI2 in one of two ways, either by itself (which you have been given an example of above) or by being part of a spawn group that references a spawn parent that references idAI2s.

Spawn groups are special entities that are a set of multiple target spawns. On their own, they may sound useless (why bother when I want to spawn individual demons in?) but they are crucial for things like maintained AI (which you must have for respawning fodder) or if you want to just spawn many demons at once without having a whole lot of spawnSingleAIs.

Here is an example of an idTargetSpawnGroup below:

```
entity {
	entityDef custom_spawn_group_1 {
	inherit = "encounter/spawn_group/zone";
	class = "idTargetSpawnGroup";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 0;
			y = 0;
			z = -1000;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = NULL;
		}
		spawners = {
			num = 4;
			item[0] = "custom_ai_spawn_1";
			item[1] = "custom_ai_spawn_2";
			item[2] = "custom_ai_spawn_3";
			item[3] = "custom_ai_spawn_4";
		}
		targetSpawnParent = "custom_spawn_parent";
	}
}
}
```

Individual target spawns in these groups may have zero entitydefs defined, for so long as the spawn parent contains the idAI2 you wish to use.

What did I just mean by *that?* Let's see an example of a spawn parent:

#### idTarget\_Spawn\_Parents

Much like how a spawn group is a collection of target spawns, a spawn parent is a collection of idAI2s. Groups and parents go hand in hand to allow for more flexibility when placing down demons in an encounter.

Here is an example, pretend these idAI2s are already present in your file.

```
entity {
	entityDef custom_spawn_parent_1 {
	inherit = "encounter/spawn_group/parent";
	class = "idTarget_Spawn_Parent";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnConditions = {
			maxCount = 0;
			reuseDelaySec = 0;
			doBoundsTest = false;
			boundsTestType = "BOUNDSTEST_NONE";
			fovCheck = 0;
			minDistance = 0;
			maxDistance = 0;
			neighborSpawnerDistance = -1;
			LOS_Test = "LOS_NONE";
			playerToTest = "PLAYER_SP";
			conditionProxy = "";
		}
		spawnEditableShared = {
			groupName = "";
			deathTrigger = "";
			coverRadius = 0;
			maxEnemyCoverDistance = 0;
		}
		entityDefs = {
			num = 2;
			item[0] = {
				name = "ai_custom_imp";
			}
			item[1] = {
				name = "ai_custom_pinky";
			}
		}
		conductorEntityAIType = "SPAWN_AI_TYPE_ANY";
		initialEntityDefs = {
			num = 0;
		}
		spawnPosition = {
			x = 17.0000057;
			y = 1209.99939;
			z = 185.500961;
		}
		targets = {
			num = 2;
			item[0] = "ai_custom_imp";
			item[1] = "ai_custom_pinky";
		}
	}
}
}
```

When I say flexibility, I mean that when I use these two, I can change the ai spawned in an encounter on the fly without having to go into their individual spawn points and change the linked idAI2.

Instead, hypothetically, every spawn point can be part of a spawn group that is linked to a spawn parent that contains the idAI2s of every ai supported in the level (if DLC ai is not supported in the level, adding a DLC idAI2 into the file will not make it work on its own.)

You can reference the same spawn parent multiple times, so I use a "master parent" that does indeed contain every supported idAI2 in the specific level I'm working on at the time.

When you're spawning in individual demons in an encounter, you may choose to forgo putting in specific idAI2s in your spawn points in favor of this system if you so choose, but it is mandatory when having respawning enemies or spawning multiple enemies at once in its own specialized function rather than having multiple spawnSingleAIs.

Next step, we will bring our knowledge of idAI2s, idTargetSpawns, idTargetSpawnGroups, and idTarget\_Spawn\_Parents to finally be able to edit an encounter in a way you want to.

# Section 2: Editing an encounter: Replacing

Most people who want to make level mods, myself included, first got to the "let's open the .entities file" part of the process, saw the unorganized chaos it presented, and backed out.

With our pre-requisite knowledge, perhaps now it won't seem as overwhelming.

We're going to begin editing our first encounter by replacing one single enemy within.

Extract the .entities file of the level of your choice and get all your things in order - having a backup file, knowing where the file to extract them from is alongside which version of the file is the correct one, etc.

Do the music change text to make sure you have everything setup, and refer back to section 1 if you have any difficulties.

Load in the level itself and head to the encounter you wish to edit. This is where meathook will begin to shine as an important level modding tool. First, enable 'notarget' in the console to make life easier, then type in 'mh\_active\_encounter' to grab the name of the encounter itself. CTRL+F the name of said encounter in your .entities file.

If you know how the specific encounter you've chosen works, it should be easy to line up what you see in game with what the listed steps are in the file.

Now, you might think it's as easy as simply replacing, say, ENCOUNTER\_SPAWN\_ZOMBIE\_TIER\_1 with ENCOUNTER\_SPAWN\_IMP, and it is. Mostly.

But don't forget. The eventdef that spawns a demon not only has the type of demon to spawn, but also which spawn point to use. Refer to the previous section. If you use a spawn point that doesn't support the idAI2 you want it to spawn, the game will crash.

Luckily, this problem is easily solvable, simply add the idAI2 of your desired demon type into the spawn point. The name of an existing idAI2 can be simply found elsewhere in the file, or one can be made by you.

For more documentation on types of eventdefs, please refer to the Event Calls section of this wiki.

# Section 2: Editing an encounter: Adding

I'm going to be frank, I think ProdeusDoom does a much better job of explaining it, check it out here:

[https://www.youtube.com/watch?v=HgzoFr9Zaf8](https://www.youtube.com/watch?v=HgzoFr9Zaf8)

# Tools

Information about the tools necessary for Level Modding.

# Getting Started

### Entities Files

**Levels are edited through ".entities" files and are saved in:** `<resource>/maps/game/<campaign>/<level_name>/<level_name>.entities`

**<span style="text-decoration: underline;"><span style="font-family: Whitney, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: break-spaces; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">Example</span></span>**<span style="text-decoration: underline;"><span style="font-family: Whitney, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: break-spaces; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">**:**  
</span></span><span style="font-family: Whitney, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: break-spaces; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">`e1m1_intro_patch1/maps/game/sp/e1m1_intro/e1m1_intro.entities`</span><span style="font-family: Whitney, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: break-spaces; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">  
</span>&gt; This is the level file path for Hell on Earth.

<p class="callout warning">[<span style="text-decoration: underline;">Remember to check for the highest resource load priority for the level</span>](https://docs.google.com/spreadsheets/d/10R5fWKGyqPuCPdueqKeCYycHETSHg0QeFOCbWIQZUCY/edit#gid=1687603304)</p>

### M347h00k:

**M347h00k (aka Meathook or MH) *originally by Chrispy* - [Download](https://github.com/brongo/m3337ho0o0ok/releases/latest)**  
&gt; M347h00k unlocks developer commands and allows you to edit your level in-game.  
&gt; Although not mandatory, this would make level modding significantly easier.  
*To install: Download `XINPUT1_3.dll` and place it into the DOOM Eternal installation directory (like how you installed the Mod Injector).*

### Tools for Editing Levels:

**Text Editor - [Notepad++ Recommended](https://notepad-plus-plus.org/)**

**EntitySlayer by FlavorfulGecko5 - [Download](https://github.com/FlavorfulGecko5/EntitySlayer/releases)** &gt; EntitySlayer is an easy yet powerful entity editing tool that lists entities as nodes, while providing advanced features such as filtering, searching, multi-node selection.  
*&gt; To install: Download the Entity Slayer zip and extract its contents to whatever folder you want. Make sure to copy `oocore_8_win64.dll` from DOOM Eternal's installation directory to the folder.*

# Text Editor

<p class="callout info">[Notepad++ is the Recommended Text Editor to Use](https://notepad-plus-plus.org/)</p>

---

.entities files are compressed and must be decompressed in order to edit Entities.

### Decompressing Tools:

**Entity*Slayer by FlavorfulGecko5* - [Download](https://github.com/FlavorfulGecko5/EntitySlayer/releases)**  
File -&gt; Export to text (make sure the file extension is still .entities)

**SAMUEL Asset Extraction Tool *by SamPT* - [Download](https://github.com/brongo/SAMUEL/releases)** Currently exports textures, .decls, and .entities files.

**idFileDeCompressor *by PowerBall253* - [Download](https://github.com/brunoanc/idFileDeCompressorGo/releases/latest)**

<p class="callout warning">Even though the .entities file is decompressed, make sure it still retains the .entities file extension.</p>

When editing a decompressed .entities file while you are in game, you will need to create a folder called "overrides" in the DOOM Eternal installation directory. Structure it like this:  
`overrides/maps/game/<campaign>/<level_name>/<level_name>.entities`  
**<span style="text-decoration: underline;">Example:</span>**  
`overrides/maps/game/sp/e1m1_intro/e1m1_intro.entities`  
&gt; This is the level file path for Hell on Earth.

<p class="callout info">You can place as many level files you like in the overrides folder</p>

With M347h00k installed, you can enter your level and edit the decompressed entities file while you are in-game.  
Typing in the console command, `mh_force_reload` will reload the level with the recent changes you made in the text file.

# EntitySlayer

<p class="callout info">**EntitySlayer *by FlavorfulGecko5* - [Download](https://github.com/FlavorfulGecko5/EntitySlayer/releases)**</p>

> EntitySlayer is an easy yet powerful entity editing tool that lists entities as nodes, while providing advanced features such as filtering, searching, multi-node selection.  
> *To install: Extract the files to whatever folder you want. Make sure to copy `oocore_8_win64.dll` from DOOM Eternal's installation directory to the folder.*

---

<p class="callout info">EntitySlayer does not require you to decompress .entities files.</p>

You can open the compressed files within the application, but you should be in your chosen level and use  
**File -&gt; Open from MH** to open the Meathook instance. Be sure so save your instance somewhere.  
With EntitySlayer, you can press the button, "Reload level" and it will perform the command "mh\_force\_reload" for you.

If you wish, you can copy an entity into a dedicated text editor like Notepad++, make changes there, then copy the result back to EntitySlayer.

### Copying from EntitySlayer to Text Editor:

**1. Copy the eventCall selected** [![image-1631056663562.png](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/scaled-1680-/image-1631056663562.png)](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/image-1631056663562.png)  
**2. Paste into text editor**<span style="text-decoration: underline;">  
</span>[![image-1631056944137.png](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/scaled-1680-/image-1631056944137.png)](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/image-1631056944137.png)  
**3. Make your changes and only copy the following**  
[![image-1631056883313.png](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/scaled-1680-/image-1631056883313.png)](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/image-1631056883313.png)  
**4. Reinsert the eventCall into EntitySlayer**[![image-1631057148235.png](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/scaled-1680-/image-1631057148235.png)](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/image-1631057148235.png)  
**5. If you are replacing an eventCall, delete the original one, but you can always add more eventCalls this way.**

# Entities

A description of various entities that shape the level.

# Entities List (Doom Eternal)

An incomplete list of known entity classes in Doom Eternal:

```
idAASObstacle
idAASReachability
idAbnormalPlayerMetrics
idActionNode
idActor
idActorAmbientFilter
idActorWorkNode
idAFEntity_Corpse
idAFEntity_Dummy
idAFEntity_Generic
idAFEntity_GetUpTest
idAI2
idAIAASHint
idAICombatHint
idAICombatHint_SuppressionFirePoint
idAIDeathVolume
idAIDebugCamera
idAIHint
idAIHintGroup
idAIInteraction
idAIMapMarkupEntity
idAISearchHintAnimation
idAISearchHintAuto
idAISearchHintGroup
idAITest
idAITest_Rotation
idAlignedEntity
idAmbientNodeExclusionArea
idAmbientNodeGenerationArea
idAmbientTriggerModifier_SetAITypes
idAnimated
idAnimated_AnimWeb
idAnimated_AnimWeb_Samuel
idAnimated_ThreatSensor
idAnimatedAttachment
idAnimatedAttachment_AF
idAnimatedEntity
idAnimatedInteractable
idAnimatedSimple_AnimSys
idAnimatedSimple_Faust
idAnimCamera
idAnimNode
idAnnouncementManager
idArchvileTemplate
idAutomapMapGroupRevealEntity
idAutomapSectionRevealTrigger
idBarricade
idBasePropSpawner
idBFG_Geyser
idBfgBurn
idBillboard
idBloatedEntity
idBossInfo
idBotActionEntity
idBotActionEntity_Info
idBotActionEntity_Info_POI
idBotActionEntity_Info_RoamGoal
idBotActionEntity_Usable
idBotPathNodeEntity
idBreakable
idBreakablePlatform
idBuildArea
idCamera
idCameraView
idCampaignInvaderStart
idCaptureFrames
idCinematicCamera
idCollectibleEntity
idCollisionExclusionVolume
idCollisionStreamArea
idCombatGrouping
idCombatVolume
idCoopStartingInventory
idCrusher
idCyberdemonMissileShooter
idDamageableAttachment
idDeathmatchPlayerStart
idDebrisEntity
idDecalEntity
idDecalEntity_Coop
idDemonPlayer
idDemonPlayer_Arachnotron
idDemonPlayer_Archvile
idDemonPlayer_Baron
idDemonPlayer_Cacodemon
idDemonPlayer_Mancubus
idDemonPlayer_Marauder
idDemonPlayer_PainElemental
idDemonPlayer_Pinky
idDemonPlayer_Prowler
idDemonPlayer_Revenant
idDemonPlayer_Summoner
idDemonPlayerStart
idDestroyableProp
idDestructible
idDestructibleManager
idDynamicEntity
idDynamicEntity_Damageable
idDynamicVisibilityBlocker
idEditorModelEntity
idElectricBoltEmitter
idEncounterAmbientAudio
idEncounterGroupMgr
idEncounterManager
idEncounterModifier_Reset
idEncounterModifier_SetEnabledState
idEncounterModifier_SetNextScriptIndex
idEncounterTrigger_AmbientAIAudio
idEncounterTrigger_Commit
idEncounterTrigger_Exit
idEncounterTrigger_OverrideCombatGrouping
idEncounterTrigger_PreCombat
idEncounterTrigger_RaiseUserFlag
idEncounterVolume_ValidCover
idEnergyShell
idEngineEntity
idEntity
idEntityCamera
idEntityFx
idEntityFxRandom
idEnvArea
idEnvironmentalDamage_Hurt_Trigger
idEnvironmentalDamage_Point
idEnvironmentalDamage_PointManager_Trigger
idEscapePod
idExtraLifeTeleportLocation
idFlightVolumeTraversalSpline
idFreeCamera
idFreeDbgCam
idFuncRotate
idFuncShadowCaster
idFuncSwing
idGameChallenge
idGameChallenge_CampaignSinglePlayer
idGameChallenge_Horde
idGameChallenge_PVP
idGameChallenge_PVPTutorial
idGameChallenge_Shell
idGeomCacheEntity
idGladiatorShield
idGoreEntity
idGuiEntity
idGuiEntity_Cinematic
idGuiEntity_Text
idHeightmapVolumeEntity
idHighlightBehavior
idHighlightBehavior_Augment
idInfluenceSpawnSettings
idInfo
idInfo_BounceDestination
idInfo_DoorTraversalChain
idInfo_FastTravel
idInfo_SpawnConditionProxy
idInfo_TeleportDestination
idInfo_TraversalBase
idInfo_TraversalChain
idInfo_TraversalPoint
idInfo_Trigger_Facing_Target
idInfo_UniversalTraversal
idInfoAAS
idInfoAmbient
idInfoBounds
idInfoCloudShot
idInfoCover
idInfoCoverExposed
idInfoDebugMarker
idInfoExportHint
idInfoFlightVolumeEntrance
idInfoFocus
idInfoGoalPosition
idInfoLevelFadeIn
idInfoLookTarget
idInfoLookTargetGroup
idInfoOrbit
idInfoPath
idInfoPlayerHud
idInfoRoam
idInfoRuler
idInfoSpawnPoint
idInfoSplineChild
idInfoStandPoint
idInfoTexLod
idInfoTraversal
idInfoTraversal_Bot
idInfoTraversal_Ultimate
idInfoTraversalEndPoint
idInfoWaitForButtonAfterLoad
idInteractable
idInteractable_Automap
idInteractable_BatterySocket
idInteractable_Challenge_Shrine
idInteractable_CollectibleViewer
idInteractable_CurrencyExchange
idInteractable_Doom
idInteractable_EliteGuard
idInteractable_EliteGuard_Coop
idInteractable_GiveItems
idInteractable_GoreBud
idInteractable_GoreNest
idInteractable_HighlightSelector
idInteractable_JukeBox
idInteractable_LootCrate
idInteractable_LootDrop
idInteractable_Minigame
idInteractable_Moveable
idInteractable_NightmareMarker
idInteractable_Obstacle
idInteractable_Respec
idInteractable_Rune
idInteractable_Shooter
idInteractable_SlayerGate
idInteractable_SlayerGate_Coop
idInteractable_SonicBoost
idInteractable_Tutorial
idInteractable_VegaTraining
idInteractable_WeaponModBot
idInteractable_WorldCache
idInteractionCamera
idInvasionAreaManager
idInvasionBlocker
idInventoryStorage
idIOS_MeteorCrater
idItemPropSpawner
idJostleAnimated
idJostleSpring
idJostleSwivel
idLensFlare
idLight
idLogicEntity
idLowGravityMover
idMidnightCutscene
idMover
idMoverModifier
idMultiplayerTrigger
idMusicEntity
idNetworkedEntityFx
idNetworkedParticleEmitter
idNetworkLight
idObjective_Relay
idOverTheShoulderCamera
idParticleEmitter
idPathCorner
idPerceptionVolume
idPhotoModeCamera
idPieceEmitter
idPlayer
idPlayerStart
idPortalSurface
idPortalWorld
idPoseableEntity
idProjectile
idProjectile_AIHomingRocket
idProjectile_Auger
idProjectile_BfgArc
idProjectile_BfgBurn
idProjectile_CacoDemonRocket
idProjectile_CyberdemonSwarmMissile
idProjectile_DamageOverTime
idProjectile_Destroyer
idProjectile_EMP
idProjectile_Grenade
idProjectile_GrenadeFast
idProjectile_Mancubus_Smoke
idProjectile_MeatHook
idProjectile_Rocket
idProjectile_RollingFire
idProjectile_SiphonGrenade
idProjectile_SwarmMissile
idProjectile_SwarmMissile_V2
idProjectileShield
idProp
idProp_AIArmor
idProp_ArmorPickup
idProp_Breakable
idProp_BreakableLoot
idProp_ContinuallyUsed
idProp_Coop
idProp_Coop_Billboard
idProp_DemonCircle
idProp_ElectricArmor
idProp_Explosive
idProp_HealthPickup
idProp_Moveable
idProp_OnlineCollectible
idProp_Pickup
idProp_PlayableDemonCircle
idProp_Spawnable
idProp_Static
idProp_Usable
idProp_WeaponPickup
idProp_WeaponStatic
idProp2
idPurifyingBeam
idReferenceMap
idRegenArea
idResurrectionProxy
idRibbon2Emitter
idRiftBuildPosition
idRotatableCamera
idSlowMotionCamera
idSoundAreaEntity
idSoundBeamEntity
idSoundBoxEntity
idSoundEntity
idSoundPrefetchEntity
idSoundSphereEntity
idSoundSubtitlesEntity
idSoundTrigger
idSpawnArea
idSpawnNode
idSpawnNodeSplines
idSpawnPoint
idSpectacleCamera
idSpectatorCamera
idSpitfireCannon
idSplinePath
idSpringCamera
idStaticEntity
idStaticMultiGuiEntity
idStaticVisibilityBlocker
idStaticWaterEntity
idSummoningTemplate
idSyncEntity
idTarget
idTarget_ActionScript
idTarget_AdaptiveTickToggle
idTarget_AIEvent
idTarget_AIGlobalSettings
idTarget_AIProxy
idTarget_AmplitudeTrigger
idTarget_AnimWebChangeState
idTarget_AnimWebChangeStateVia
idTarget_AnimWebPause
idTarget_AnimWebUnpause
idTarget_ApplyExplosionImpulse
idTarget_ApplyImpulse
idTarget_Award_Adrenaline
idTarget_Award_RushAttack
idTarget_Break
idTarget_ChangeColor
idTarget_ChangeMaterial
idTarget_ChangeVolume_PlayerEnvOverride
idTarget_ClearFakeEnemy
idTarget_Codex
idTarget_CollisionDamage
idTarget_Command
idTarget_Conditional
idTarget_ConditionalAccessor
idTarget_Count
idTarget_Count_Random
idTarget_Credits
idTarget_CurrencyCheck
idTarget_Cvar
idTarget_Damage
idTarget_DeactivateStatusEffects
idTarget_DemonBountyAiTypes
idTarget_DevLoadoutSwap
idTarget_DisableEscMenu
idTarget_DisableInvasion
idTarget_Disconnect
idTarget_Disconnect_GoToScreen
idTarget_DormancyRadius
idTarget_DummyFire
idTarget_DynamicChallenge_End
idTarget_DynamicChallenge_FailChallenge
idTarget_DynamicChallenge_GiveBonus
idTarget_DynamicChallenge_PointTrigger
idTarget_DynamicChallenge_Start
idTarget_EnableAIEvent
idTarget_EnableGroup
idTarget_EnableTarget
idTarget_EncounterChallenge
idTarget_EndInvasion
idTarget_EndOfCampaign
idTarget_Enemy
idTarget_EquipItem
idTarget_FadeComplete
idTarget_FakeEnemy
idTarget_FastTravelInhibit
idTarget_FastTravelUnlock
idTarget_FireWeapon
idTarget_FirstThinkActivate
idTarget_ForceDormancy
idTarget_ForceGroupRole
idTarget_GameChallengeGameOver
idTarget_GameStateIntInc
idTarget_GameStateIntSet
idTarget_GeomCacheStreamer
idTarget_GiveItems
idTarget_GiveWeaponUpgradePoints
idTarget_GroupExpression
idTarget_GroupMessage
idTarget_GUICommand
idTarget_Hide
idTarget_HideHands
idTarget_InteractionAction
idTarget_Intro
idTarget_InventoryCheck
idTarget_LayerStateChange
idTarget_LevelTransition
idTarget_LightController
idTarget_MakeActivatable
idTarget_MapGroupUnlock
idTarget_Melee
idTarget_ModifyGroup
idTarget_ModifyTraversalClass
idTarget_Notification
idTarget_Objective_Complete
idTarget_Objective_Give
idTarget_Objective_HideEntities
idTarget_Objective_Replace
idTarget_Objective_Triggered
idTarget_Path
idTarget_Perk
idTarget_Ping
idTarget_PlayerCheckpoint
idTarget_PlayerInvulnerability
idTarget_PlayerModifier
idTarget_PlayerStatModifier
idTarget_PlayerStatus
idTarget_PlayerViewEffect
idTarget_PlayerWhiplash
idTarget_PlayVoiceOver
idTarget_PodiumSpawn
idTarget_POI
idTarget_Print
idTarget_RandomImpulse
idTarget_Remove
idTarget_RemoveItems
idTarget_RemoveSaveGate
idTarget_Secret
idTarget_SetGroupCombatStage
idTarget_SetInEncounterGroup
idTarget_SetSpawnSpot
idTarget_ShakeTrigger
idTarget_Show
idTarget_ShowGui
idTarget_ShowHands
idTarget_Snap_Objective
idTarget_SoundDuck
idTarget_Spawn
idTarget_Spawn_Parent
idTarget_Spawn_Target
idTarget_StartSoundShader
idTarget_Subtitle
idTarget_SwapFaction
idTarget_SwapNavMesh
idTarget_Teleport
idTarget_TestPlayerState
idTarget_Timeline
idTarget_Timer
idTarget_TutorialGui
idTarget_UnlockUltraNightmare
idTarget_ViewPos
idTarget_VisibilityController
idTargetSpawnGroup
idTeamCapturePoint
idTeleporterPad
idTendrilEye
idTest_MetaData_Bounds
idTest_MetaData_Circle
idTest_MetaData_Cylinder
idTest_MetaData_Cylinder2
idTest_MetaData_Fov
idTest_MetaData_FovPitch
idTest_MetaData_FovYaw
idTest_MetaData_Line
idTest_MetaData_Model
idTest_MetaData_MoveableSpheres
idTest_MetaData_Plane
idTest_MetaData_SectorPitch
idTest_MetaData_SectorYaw
idTest_MetaData_String
idTest_MetaData_Target
idTest_MetaData_WebPath
idTest_Sector
idTestEntity
idTestModel2
idTexlodNodeGenerationArea
idToucher
idTrailerCamera
idTrigger
idTrigger_AIInteraction
idTrigger_BouncePad
idTrigger_ChallengeBoundry
idTrigger_Damage
idTrigger_DemonDamageOutModifier
idTrigger_Dormancy
idTrigger_DummyFire
idTrigger_DynamicHurt
idTrigger_EnergyField
idTrigger_Facing
idTrigger_ForcePlayerBodyReactionOnce
idTrigger_GorillaBar
idTrigger_Hurt
idTrigger_InvasionAreaEnter
idTrigger_InvasionAreaExit
idTrigger_ModPlayerVelocity
idTrigger_MovementModifier
idTrigger_Multiplayer
idTrigger_Push
idTrigger_RemoveEntities
idTrigger_RemoveInventoryItems
idTrigger_Repulsor
idTrigger_SonicBoom
idTrigger_StatDrivenEvent
idTrigger_TakeDamage
idTrigger_Teleporter
idTrigger_Teleporter_Fade
idTrigger_TestPlayerState
idTrigger_VisibilityController
idTrigger_VoiceCommunication
idTriggerToucher
idTurret
idUmbraVisibilityContributionVolume
idUmbraVolume
idUtilityCamera
idVolume
idVolume_Blocking
idVolume_ControlPointSpawnInfluence
idVolume_CustomLedgeGrab
idVolume_Damage
idVolume_DamageOverTime
idVolume_DemonicBait
idVolume_DemonicPossession
idVolume_DeployedLaser
idVolume_DoomGravity
idVolume_EmpField
idVolume_Flight
idVolume_FlightObstacle
idVolume_ForceDormant
idVolume_Gravity
idVolume_Invasion
idVolume_InvasionInhibit
idVolume_InvasionSpawnZone
idVolume_KillDownedInjured
idVolume_LightRigModifier
idVolume_LocationCalling
idVolume_MancubusFlamethrower
idVolume_MancubusSteam
idVolume_MancubusSteamFX
idVolume_MatterBallWarp
idVolume_OliviasGuardFight_DangerZone
idVolume_PlacedFlightVolume
idVolume_PlasmaPuddle
idVolume_PlasmaPuddleFX
idVolume_PlayerBodyReaction
idVolume_PlayerEnvOverride
idVolume_PlayerUseProxy
idVolume_PlayerViewEffect
idVolume_RevivePlayer
idVolume_RunCycleHint
idVolume_RuneHint
idVolume_SecretHint
idVolume_Siphon
idVolume_SpaceWarp
idVolume_Stairs
idVolume_StatusEffect
idVolume_StealthField
idVolume_StreamTreeMarkup
idVolume_ToggleableDamageOverTime
idVolume_TogglePlayerBodyReaction
idVolume_TraversalGen
idVolume_Trigger
idVolume_VisualImpairment
idWaterEntity
idWaveShield
idWeaponEntity
idWorldClipBounds
idWorldspawn
jakesDevWidget
```

# idAI2

<p class="callout info">An entity for AI/NPCs, usually demons.</p>

`idAI2` can be individually placed throughout a map, or more preferably, spawned with an [idTarget\_Spawn](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idtarget-spawn). The exact ai type of the idAI2 can be checked by looking at the `inherit` parameter.

## Usage

This is an example of a Hell Soldier AI.

<p class="callout warning">idAI2 entities can greatly vary based on the AI.</p>

```JSON
entity {
	layers {
		"spawn_target_layer"
	}
	entityDef example_ai_soldier_eternal {
	inherit = "ai/fodder/soldier_blaster";
	class = "idAI2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = { // See "struct idAI2 : public idActor"
		highlightDecl = "glorykill_highlight";
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 0.600000024;
				y = 0.600000024;
				z = 1.829;
			}
		}
		dormancy = {
			delay = 30;
			distance = 19.5070019;
		}
		spawn_statIncreases = { // Increase these stats on spawn
			num = 1;
			item[0] = {
				stat = "STAT_AI_SPAWNED";
				increase = 1;
			}
		}
		targetingDecl = "characters/soldier_blaster"; // Targeting Decl ( defines specific aim assist / AR target points )
		actorConstants = { // See "struct idActor::idActorConstant"
			perception = {
				eyeOffset = { // offset of eye relative to physics origin {{ units = m }}
					z = 1.71500003;
				}
				crouchedEyeOffset = { // eye offset when crouched {{ units = m }}
					z = 1.06700003;
				}
			}
			actorSounds = {
				sndFootsteps = "footsteps/hellified_soldier/hs_footstep";
				sndRagdollStart = "play_hell_soldier_death_short";
			}
			footstepEffectTable = "impacteffect/footsteps/ai_soldier";
			footstepEvents = "footstepevents/default";
			painInfo = {
				decayDelay = 1000; // delay for the decay, in game ticks.
				bucketMaxValue = 400; // the max value for the leaky bucket
				decayRate = -20; // the decay rate for the bucket
			}
			bulletPenetrationData = {
				energyCostToPenetrate = 10; // costs this much penetration energy to penetrate this actor
				damageScaleToPenetrate = 0.75; // bullet damage is scaled by this amount after penetrating
			}
			footstepEffectTable_Sprint = "impacteffect/footsteps/ai_soldier_sprint";
			footstepEffectTable_SlowWalk = "impacteffect/footsteps/ai_soldier";
			footstepEffectTable_CrouchWalk = "impacteffect/footsteps/ai_soldier";
			footstepEffectTable_Landing = "impacteffect/footsteps/ai_soldier_landing";
			footstepEffectTable_HeavyLanding = "impacteffect/footsteps/ai_soldier_landing";
			ledgeGrabEffectTable = "impacteffect/footsteps/ai_soldier";
			ledgeGrabEffectTable_Heavy = "impacteffect/footsteps/ai_soldier";
			ledgeGrabEffectTable_Friendly = "impacteffect/footsteps/ai_soldier";
			ledgeGrabEffectTable_FriendlyHeavy = "impacteffect/footsteps/ai_soldier";
		}
		actorEditable = { // See "struct idActor::idActorEditable"
			entityDamageComponent = { // names of joint groups, their associated damage scale, and armor level
				entityDamage = "entitydamage/ai/soldier_blaster/base";
			}
			injuredStates = { // defines parameters of each injured state, see "struct idInjuredState"
				num = 1;
				item[0] = {
					name = "not_injured";
					damageGroupMaxGoreLevels = {
						num = 6;
						item[0] = {
							damageGroupName = "head";
							maxGoreLevel = "GORELEVEL_TATTERED";
						}
						item[1] = {
							damageGroupName = "chest";
							maxGoreLevel = "GORELEVEL_TATTERED";
						}
						item[2] = {
							damageGroupName = "right_arm";
							maxGoreLevel = "GORELEVEL_TATTERED";
						}
						item[3] = {
							damageGroupName = "left_arm";
							maxGoreLevel = "GORELEVEL_TATTERED";
						}
						item[4] = {
							damageGroupName = "right_leg";
							maxGoreLevel = "GORELEVEL_TATTERED";
						}
						item[5] = {
							damageGroupName = "left_leg";
							maxGoreLevel = "GORELEVEL_TATTERED";
						}
					}
					allowIK = true; // true if AI uses IK in this injured state
					canUseAllTraversalsWhileInjured = true; // true if AI can use all traversals in this injured state
					canUseDownTraversalsWhileInjured = true; // true if AI can use down traversals in this injured state
				}
			}
			radiusDamageJoints = { // names of joints to trace to for radius damage tests
				num = 6;
				item[0] = "head_part01_md";
				item[1] = "spine_part01_md";
				item[2] = "arm_hand_lf";
				item[3] = "arm_hand_rt";
				item[4] = "leg_lower_lf";
				item[5] = "leg_lower_rt";
			}
		}
		factionName = "blaster";
		mass = 18.1439991; // mass of the actor {{ units = kg }}
		lootable = false;
		lootDropComponent = { // lootdrop decl for campaign
			lootDropDataDecl = "ai/default_fodder";
		}
		pvpLootDropComponent = { // lootdrop decl for Battlemode
			lootDropDataDecl = "ai/default_fodder_pvp";
		}
		aiConstants = { // See "struct idAI2::idAIConstant"
			components = {
				ptr = {
					ptr[12] = {
						componentDecl = "aicomponent/pathmanager/base";
					}
					ptr[14] = {
						componentDecl = "aicomponent/attack/base";
					}
					ptr[9] = {
						componentDecl = "aicomponent/positionawareness/soldier_blaster/base";
					}
					ptr[10] = {
						componentDecl = "aicomponent/extendedsense/soldier_blaster/base";
					}
					ptr[11] = {
						componentDecl = "aicomponent/transientfocus/soldier_blaster/base";
					}
					ptr[13] = {
						componentDecl = "aicomponent/soldier_blaster";
					}
				}
			}
			syncMelee = { // See "struct idSyncAttack"
				msAfterAttackBeforeCanSync = 250; // how long after a regular attack before a sync attack can be performed
				syncMeleeEntityDefs = { // entityDef decls for syncmelee
					num = 2;
					item[0] = "syncmelee/soldier_blaster";
					item[1] = "syncmelee/soldier_blaster_3p";
				}
				syncGroups = { // See "struct idSyncAttack"
					num = 1;
					item[0] = {
						syncGroupName = "";
						syncInteractions = { // syncInteraction decls
							num = 19;
							item[0] = "syncdeath/playervsai/soldier_blaster/right_upper";
							item[1] = "syncdeath/playervsai/soldier_blaster/left_upper";
							item[2] = "syncdeath/playervsai/soldier_blaster/front_upper";
							item[3] = "syncdeath/playervsai/soldier_blaster/front_head";
							item[4] = "syncdeath/playervsai/soldier_blaster/left_lower";
							item[5] = "syncdeath/playervsai/soldier_blaster/above_back";
							item[6] = "syncdeath/playervsai/soldier_blaster/above_front";
							item[7] = "syncdeath/playervsai/soldier_blaster/front_rightarm";
							item[8] = "syncdeath/playervsai/soldier_blaster/front_leftarm";
							item[9] = "syncdeath/playervsai/soldier_blaster/berserk/berserk_above_front";
							item[10] = "syncdeath/playervsai/soldier_blaster/chainsaw/cut_back";
							item[11] = "syncdeath/playervsai/soldier_blaster/back_lower";
							item[12] = "syncdeath/playervsai/soldier_blaster/chainsaw/cut_front";
							item[13] = "syncdeath/playervsai/soldier_blaster/berserk/berserk_front_upper";
							item[14] = "syncdeath/playervsai/soldier_blaster/right_lower";
							item[15] = "syncdeath/playervsai/soldier_blaster/back_upper";
							item[16] = "syncdeath/playervsai/soldier_blaster/crucbile/crucible_front";
							item[17] = "syncdeath/playervsai/soldier_blaster/crucbile/crucible_back";
							item[18] = "syncdeath/playervsai/soldier_blaster/front_lower";
						}
					}
				}
				alwaysAllowChainsawGloryKill = true; // if true then always allow chainsaw glory kills without needing stagger states or other such things
			}
			aiDeathStat = "STAT_HELL_MARINE_KILLED"; // what stat to increase on death of this ai
			positioningParms = { // parms used to control major positioning in behaviour finite state machine
				num = 2;
				item[0] = "soldier_blaster/plasma";
				item[1] = "soldier_blaster/plasma_object";
			}
			aiDeathCodex = "codex/hell/demon_soldier_blaster"; // what codex to give the player when this ai dies
		}
		aiEditable = { // See "struct idAIEditable"
			perception = { // See "struct idAIPerception"
				actorPerceptionRadius = 39; // max radius at which AI can perceive other actors {{ units = m }}
				obstaclePerceptionRadius = 78; // max radius at which AI can perceive obstacles {{ units = m }}
				closePerceptionRadius = 5; // max radius .... for close FOV {{ units = m }}
				eventPerceptionRadius = 39; // max radius at which AI will perceive any events {{ units = m }}
				senseUpdatesOnNonEnemies = false; // if true, AI will skip all worldstate updates for non-enemies
			}
			useTouchComponent = true;
			death = { // See "struct idAIEditable::idAIDeath"
				ignoreDamageType = "DAMAGETYPE_EMP"; // entity will not take any damage from any damage decl that ANDs with this value
				fadeOutAfterDeathDelay_Seconds = { // delay burn-away fx until at least after this much time ( 0 uses default, negative implies never )
					value = 3;
				}
				removeAfterFadeOutDelay_Seconds = { // remove the entity this long after burn away fx start
					value = 3;
				}
				canBecomeInjured = false; // if true, AI can become injured and use injured runs and idles
				explosionDecl = "ai/default";
				declTwitchPain = "twitchpain/soldier_blaster";
				deathAnim = ""; // animation to force on death
				trigger = ""; // idEntity to trigger on death
				triggerGloryKill = ""; // idEntity to trigger on death by glory kill
				triggerNonGloryKill = ""; // idEntity to trigger on death by normal kill
				onlyDieByGK = false; // true if the AI will only die as a result of receiving sync damage (glory killed)
			}
			movement = { // See "struct idAIEditable::idAIMovement"
				wanderRadius = 19.5070019; // how far an AI can randomly wander from its spawn position {{ units = m }}
				useTraversalClassA = true; // if true, can use class A traversals
			}
			cover = { // See "struct idAIEditable::idAICoverInfo"
				coverRadius = 19.5070019; // max radius at which the AI will check for cover {{ units = m }}
			}
			behaviors = { // See "struct idAIBehaviors"
				decl = "behaviors/soldier_blaster/soldier_blaster"; // the behavior typeinfo decl this behavior uses.
				declBehaviorEvents = "behaviorevents/default"; // AI events
				attackGraph = "ai/soldier_blaster"; // available attacks
			}
			vsAIDamageMask = "HEALTH"; // damageCategoryMask_t; how to process damage taken from other AI
			spawnSettings = { // Refer to "struct idAIEditable::idAISpawn"
				entranceAnimPath = "animweb/characters/monsters/soldier_blaster/spawn/teleport_entrance"; // initial animation to play specified via animref if entranceAnim not given
				spawnFXEntityDef = "fx/spawn_in_fodder"; // entity def for fx to use when spawned with AIOVERRIDE_TELEPORT
				initialState = "AIOVERRIDE_TELEPORT"; // initial valye for aiStateOverride_t; can be overwritten in the spawn target
				teleportDelayMS = 750; // How long it takes to spawn in when using AIOVERRIDE_TELEPORT
				chanceMissingArmor = { // See "struct idAIEditable::idAIMissingArmor"
					num = 0;
					item[0] = {
						damageGroup = "head"; // damage group whose armour may or may not be there
						missingChance = 100; // 0-100 % chance that armour is missing
					}
				}
			}
			demonTeamInfo = {
				canHostLostSouls = true;
			}
			staggerEnabled = true; // Set to false to disable staggering
		}
		aiHealth = { // Refer to "struct idHealthT < aiHealthComponent_t , AI_HEALTH_MAX , AI_HEALTH_HITPOINTS >"
			components = {
				components[1] = {
					max = 0; // Max regen allowed
					regenInterval = { // interval, in seconds, between regen updates.
						value = 0;
					}
				}
				components[0] = {
					max = 400; // Max HP allowed
					starting = 400; // HP when spawned
				}
			}
		}
		goreComponent = { // See "struct idGoreComponent"
			goreContainer = "ai/fodder/soldier"; // gore component decl
		}
		afProperties = { // See "struct idAnimator_AF : public idAnimator_Base"
			impactEffectTable = "impacteffect/ragdoll/ragdoll_fodder"; // impact table for sound and particles
			articulatedFigure = "characters/monsters/soldier_blaster_auto"; // the articulated figure decl to use
		}
		renderModelInfo = {
			model = "md6def/characters/monsters/soldier_blaster/base/soldier_blaster.md6"; // md6def decl to use
			lightRigDecl = "soldier_blaster/soldier_blaster_default";
			materialRemap = { // Use to replace the textures on a per entity basis
				num = 0;
			}
		}
		fxDecl = "character/hellified_soldier_blaster/hellified_soldier_blaster"; // fx decl for this entity
		startingInventory = { // See "struct idInventoryAttachmentDef"
			num = 2;
			item[0] = {
				startSlot = "EQUIPPED"; // startingSlot_t; EQUIPPED, HOLSTERED, or BACKPACK
				inventoryDecl = "weapon/ai/soldier_blaster/plasma"; // inventory decl for this attachment
			}
			item[1] = {
				showHolstered = false; // if true, attach and show the item when it's holstered
				inventoryDecl = "weapon/ai/soldier_blaster/plasma_slug";
			}
		}
		walkIKDecl = "walkik/biped_base";
		killerNames = { // What to string display when killed by this entity
			num = 1;
			item[0] = "#str_decl_demoncard_summon_fodder_blaster_soldier_name_GHOST53375";
		}
		spawnPosition = { // Spawn position does not really matter
			x = 1;
			y = 1;
			z = 1;
		}
		flags = {
			hide = true;
		}
	}
}
}
```

# idArchvileTemplate

<p class="callout info">An entity to control what ai types an Archvile can summon.</p>

## Usage

```
entity {
	entityDef example_archvile_template {
	class = "idArchvileTemplate";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		summonList = { // List of ai types to spawn
			aiSpawnTypeList = {
				num = 10;
				item[0] = "ENCOUNTER_SPAWN_PROWLER";
				item[1] = "ENCOUNTER_SPAWN_HELL_KNIGHT";
				item[2] = "ENCOUNTER_SPAWN_MANCUBUS";
				item[3] = "ENCOUNTER_SPAWN_REVENANT";
				item[4] = "ENCOUNTER_SPAWN_CARCASS";
				item[5] = "ENCOUNTER_SPAWN_DREAD_KNIGHT";
				item[6] = "ENCOUNTER_SPAWN_CACODEMON";
				item[7] = "ENCOUNTER_SPAWN_PAIN_ELEMENTAL";
				item[8] = "ENCOUNTER_SPAWN_CYBER_MANCUBUS";
				item[9] = "ENCOUNTER_SPAWN_ARACHNOTRON";
			}
		}
		spawnPosition = {
			x = 0;
			y = 0;
			z = 0;
		}
	}
}
}
```

## See Also

- [spawnArchvile](https://wiki.eternalmods.com/books/entities-custom-encounters/page/spawnarchvile)

# idDestructible

<p class="callout info">An entity that can be destroyed by certain actions.</p>

### Breakable Concrete Wall

```
entity {
	entityDef game_destructible_e2m1_nest_breakable_concrete_wall_1 {
	inherit = "destructible/e2m1_nest/breakable_concrete_wall";
	class = "idDestructible";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		whenToSave = "SGT_CHECKPOINT";
		flags = {
			skipRenderModelReplication = true;
		}
		soundOffset = {
			z = 1.5;
		}
		renderModelInfo = {
			emissiveColor = {
				r = 0;
				b = 0;
				g = 0;
				a = 0;
			}
			emissiveScale = 6;
			model = "art/kit/hell_earth/walls/crack_concrete_a_whole.lwo";
			scale = {
				x = 0.699999988;
				y = 0.699999988;
				z = 0.699999988;
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 7;
				y = 0.5;
				z = 7;
			}
			numSides = 6;
			offset = {
				y = 0.25;
			}
		}
		soundOcclusionBypass = true;
		targetingDecl = "destructible_wall";
		fxDecl = "gameplay/invasion/demon_door";
		destructible = {
			idleCommands = {
				num = 1;
				item[0] = {
					time = 10000;
					command = "IDLE_COMMAND_BECOME_STATIC";
				}
			}
			decl = "destructible/e2m1_nest/breakable_concrete_wall";
		}
		effectiveDamageTypes = {
			num = 5;
			item[0] = "damage/player/melee_d5_forward";
			item[1] = "damage/player/melee_d5_blood_punch";
			item[2] = "damage/special/ability_dash";
			item[3] = "damage/player/crucible";
			item[4] = "damage/firearm/melee_d5_crucible_projectile";
		}
		meleeOnDash = true;
		dissolveDistance = 20;
		demonPlayerRenderModel = "art/kit/hell_earth/walls/crack_concrete_a_demon.lwo";
		umbraSoundBlocking = "CAN_BLOCK";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		targets = {
			num = 1;
			item[0] = "game_target_secret_1"; // targets a secret
		}
		dormancy = {
			playerDistance = 20;
			playerRearwardDistance = 20;
			allowDistanceDormancy = false;
			allowDormancy = true;
			allowPvsDormancy = false;
		}
		disableTargetsOnReload = true;
	}
}
}
```

# idDynamicEntity

<p class="callout info">An entity that consists of various objects not connected to the level geometry.</p>

## Usage

```
entity {
	entityDef example_func_dynamic {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Be sure to set its spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = { // Be sure to set its rotation
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
				}
			}
		}
		flags = {
			hide = false; // Set to true to hide the object
		}
		renderModelInfo = { // The visible model
			model = ""; // If set to NULL, then the object will be invisible
		}
		clipModelInfo = { // The physical dimensions
			clipModelName = ""; // If set to NULL, then you can move right through the object 
		}
	}
}
}
```

## Example

This is an example of an energy barrier that would commonly be used to lock the player in an arena.

```
entity {
	entityDef example_energy_barrier {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Be sure to set its spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = { // Be sure to set its rotation
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
				}
			}
		}
		flags = {
			hide = false;
		}
		renderModelInfo = {
			model = "art/gameplay/gameplay_energyBarrier_a.lwo";
			scale = {
				x = 1.2;
				y = 1.2;
				z = 1.2;
			}
		}
		clipModelInfo = {
			clipModelName = "art/gameplay/gameplay_energyBarrier_b.lwo";
		}
	}
}
}
```

<p class="callout info">Simply activating the entity can toggle its hide flag.</p>

## See Also

[activateTarget](https://wiki.eternalmods.com/books/5-level-modding/page/activatetarget)

[idTarget\_Count (Relays)](https://wiki.eternalmods.com/books/5-level-modding/page/idtarget-count)

# idEncounterManager

<p class="callout info">An entity that scripts the encounters. This is what is used to spawn in demons.</p>

## Usage

```
entity {
	entityDef example_encounter_manager {
	inherit = "encounter/manager";
	class = "idEncounterManager";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		enableAIHighlightOnFinish = true;
		disabledAITypeForHighlight = "AI_MONSTER_SPECTRE AI_MONSTER_BUFF_POD AI_MONSTER_TENTACLE";
		playerMetricDef = "encounter/player_metrics";
		chargeCombatGrouping = "encounter/combat_role/charge_command";
		aiTypeDefAssignments = "actorpopulation/default/default_no_bosses";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		combatRatingScale = "COMBAT_RATING_SCALE_IGNORE"; // Progress reward for Demonic Corruption Meter (set to none)
		ignoreTelemetry = true;
		encounterComponent = {
			entityEvents = {
				num = 1;
				item[0] = {
					entity = "example_encounter_manager";
					events = {
						num = 0; // eventCalls go here
					}
				}
			}
		}
		commitTriggers = {
			num = 0;
		}
		exitTriggers = {
			num = 0;
		}
		userFlagTriggers = {
			num = 0;
		}
	}
}
}
```

In the **aiTypeDefAssignments** line, the **"actorpopulation/default/default\_no\_bosses"** define what demons can spawn in the encounter.  
DLC1 **aiTypeDefAssignments** would look like **"actorpopulation/default/dlc1"** and DLC2 would look like **"actorpopulation/default/dlc2"**

**[commitTriggers](https://wiki.eternalmods.com/books/5-level-modding/page/idencountertrigger-commit)** show what volume trigger would activate the encounter.

[**exitTriggers** ](https://wiki.eternalmods.com/books/5-level-modding/page/idencountertrigger-exit)show what volume trigger would turn off the encounter.

[**userFlagTriggers** ](https://wiki.eternalmods.com/books/5-level-modding/page/idencountertrigger-raiseuserflag)show what Flag Triggers are enabled for the encounter.

## Example

Encounter managers can be quite long, but this example displays a very simple encounter.

#### **Here's a rundown of what it does chronologically:**

1\. Sets music to be light  
2\. Spawns a Hell Knight  
3\. Waits for 2 seconds  
4\. Spawns a Cacodemon  
5\. Continuously maintains 4 Imps at a time  
6\. Makes the AI aware of the player  
7\. Waits for 0 AI with the "main\_combat" string to remain (which is the Hell Knight and Cacodemon)  
8\. Sets music to be heavy  
9\. Spawns a Baron of Hell  
10\. Waits for 0 AI with the "main\_combat" string to remain (which is the Baron)  
11\. Stops all AI from respawning (which are the Imps)  
12\. Forces all remaining AI to charge towards you  
13\. Waits for 0 AI to remain  
14\. Sets music to be ambient

```
entity {
	entityDef example_encounter_manager {
	inherit = "encounter/manager";
	class = "idEncounterManager";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		enableAIHighlightOnFinish = true;
		disabledAITypeForHighlight = "AI_MONSTER_SPECTRE AI_MONSTER_BUFF_POD AI_MONSTER_TENTACLE";
		playerMetricDef = "encounter/player_metrics";
		chargeCombatGrouping = "encounter/combat_role/charge_command";
		aiTypeDefAssignments = "actorpopulation/default/default_no_bosses";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		combatRatingScale = "COMBAT_RATING_SCALE_IGNORE";
		ignoreTelemetry = true;
		encounterComponent = {
			entityEvents = {
				num = 1;
				item[0] = {
					entity = "example_encounter_manager";
					events = {
						num = 14;
						item[0] = {
							eventCall = {
								eventDef = "setMusicState";
								args = {
									num = 3;
									item[0] = {
										entity = "musicentity_1";
									}
									item[1] = {
										decl = {
											soundstate = "music_ghost_states/main_light";
										}
									}
									item[2] = {
										string = "Light Music";
									}
								}
							}
						}
						item[1] = {
							eventCall = {
								eventDef = "spawnSingleAI";
								args = {
									num = 3;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_KNIGHT";
									}
									item[1] = {
										entity = "example_spawn_1";
									}
									item[2] = {
										string = "main_combat";
									}
								}
							}
						}
						item[2] = {
							eventCall = {
								eventDef = "wait";
								args = {
									num = 2;
									item[0] = {
										float = 2;
									}
									item[1] = {
										bool = false;
									}
								}
							}
						}
						item[3] = {
							eventCall = {
								eventDef = "spawnSingleAI";
								args = {
									num = 3;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CACODEMON";
									}
									item[1] = {
										entity = "example_spawn_2";
									}
									item[2] = {
										string = "main_combat";
									}
								}
							}
						}
						item[4] = {
							eventCall = {
								eventDef = "maintainAICount";
								args = {
									num = 8;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP";
									}
									item[1] = {
										int = 4;
									}
									item[2] = {
										int = -1;
									}
									item[3] = {
										float = 2;
									}
									item[4] = {
										int = 3;
									}
									item[5] = {
										entity = "example_spawn_group";
									}
									item[6] = {
										string = "fodder";
									}
									item[7] = {
										float = 6;
									}
								}
							}
						}
						item[5] = {
							eventCall = {
								eventDef = "makeAIAwareOfPlayer";
								args = {
									num = 4;
									item[0] = {
										bool = true;
									}
									item[1] = {
										bool = true;
									}
									item[2] = {
										string = "";
									}
									item[3] = {
										bool = false;
									}
								}
							}
						}
						item[6] = {
							eventCall = {
								eventDef = "waitAIRemaining";
								args = {
									num = 4;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
									}
									item[1] = {
										int = 0;
									}
									item[2] = {
										string = "main_combat";
									}
									item[3] = {
										bool = false;
									}
								}
							}
						}
						item[7] = {
							eventCall = {
								eventDef = "setMusicState";
								args = {
									num = 3;
									item[0] = {
										entity = "musicentity_1";
									}
									item[1] = {
										decl = {
											soundstate = "music_ghost_states/main_heavy";
										}
									}
									item[2] = {
										string = "Heavy Music";
									}
								}
							}
						}
						item[8] = {
							eventCall = {
								eventDef = "spawnSingleAI";
								args = {
									num = 3;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON";
									}
									item[1] = {
										entity = "example_spawn_3";
									}
									item[2] = {
										string = "main_combat";
									}
								}
							}
						}
						item[9] = {
							eventCall = {
								eventDef = "waitAIRemaining";
								args = {
									num = 4;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
									}
									item[1] = {
										int = 0;
									}
									item[2] = {
										string = "main_combat";
									}
									item[3] = {
										bool = false;
									}
								}
							}
						}
						item[10] = {
							eventCall = {
								eventDef = "stopMaintainingAICount";
								args = {
									num = 2;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
									}
									item[1] = {
										string = "";
									}
								}
							}
						}
						item[11] = {
							eventCall = {
								eventDef = "forceChargeOnAllAI";
								args = {
									num = 0;
								}
							}
						}
						item[12] = {
							eventCall = {
								eventDef = "waitAIRemaining";
								args = {
									num = 4;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
									}
									item[1] = {
										int = 0;
									}
									item[2] = {
										string = "";
									}
									item[3] = {
										bool = false;
									}
								}
							}
						}
						item[13] = {
							eventCall = {
								eventDef = "setMusicState";
								args = {
									num = 3;
									item[0] = {
										entity = "musicentity_1";
									}
									item[1] = {
										decl = {
											soundstate = "music_ghost_states/main_ambient";
										}
									}
									item[2] = {
										string = "Ambient Music";
									}
								}
							}
						}
					}
				}
			}
		}
		commitTriggers = {
			num = 1;
			item[0] = "example_encounter_trigger_commit";
		}
		exitTriggers = {
			num = 1;
			item[0] = "example_encounter_trigger_exit";
		}
		userFlagTriggers = {
			num = 1;
			item[0] = "example_encounter_user_flag_trigger";
		}
	}
}
}
```

# idEncounterTrigger_Commit

<p class="callout info">An entity used to trigger an encounter manager</p>

## Usage

```
entity {
	entityDef example_trigger_commit {
	inherit = "encounter/trigger/commit";
	class = "idEncounterTrigger_Commit";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		triggerOnce = false;
		spawnPosition = { // Be sure to set spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = { // Be sure to set trigger dimensions
			clipModelName = NULL;
		}
	}
}
}
```

Simply entering the trigger's volume will trigger the encounter manager if it has this entity added to it in the **commitTriggers** section.

## See Also

[idEncounterManager](https://wiki.eternalmods.com/books/5-level-modding/page/idencountermanager)

[idEncounterTrigger\_Exit](https://wiki.eternalmods.com/books/5-level-modding/page/idencountertrigger-exit)

# idEncounterTrigger_Exit

<p class="callout info">An entity used to end an encounter manager</p>

## Usage

```
entity {
	entityDef example_trigger_exit {
	inherit = "encounter/trigger/exit";
	class = "idEncounterTrigger_Exit";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		triggerOnce = false;
		spawnPosition = { // Be sure to set spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = { // Be sure to set trigger dimensions
			clipModelName = NULL;
		}
		soundOcclusionBypass = true;
		forceAIToFlee = true; // Set to true if you want all AI to despawn once this is triggered
	}
}
}
```

Simply entering the trigger's volume will abruptly end the encounter manager if it has this entity added to it in the **exitTriggers** section.

Be sure to use exit triggers to despawn remaining AI when scripting brand new encounters.

## See Also

[idEncounterManager](https://wiki.eternalmods.com/books/5-level-modding/page/idencountermanager)

[idEncounterTrigger\_Commit](https://wiki.eternalmods.com/books/5-level-modding/page/idencountertrigger-commit)

# idEncounterTrigger_RaiseUserFlag

<p class="callout info">An entity used to trigger (raise a flag) for encounters.</p>

## Usage

```
entity {
	entityDef example_user_flag {
	inherit = "encounter/trigger/user_flag";
	class = "idEncounterTrigger_RaiseUserFlag";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		triggerOnce = false;
		spawnPosition = { // Be sure to set spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = { // Be sure to set trigger dimensions
			clipModelName = NULL;
		}
		userFlag = "User_Flag"; // Flag Name
	}
}
}
```

Flag Triggers can activate when entering a certain section of the map or when [activateTarget](https://wiki.eternalmods.com/books/5-level-modding/page/activatetarget) for the entity is used.  
This is useful if you want to activate Energy Barriers to lock you in an arena, or if you need to enter a section of the arena for the encounter to progress.

<p class="callout info">If you only plan on triggering the User Flag through **activateTarget**, then **clipModel** dimensions would not be needed.</p>

[waitForEventFlag](https://wiki.eternalmods.com/books/5-level-modding/page/waitforeventflag) is the eventCall that this entity signals.

<p class="callout warning">The Encounter Manager must contain the **idEncounterTrigger\_RaiseUserFlag** entity for it to recognize the flag name.</p>

# idEntityFx

<p class="callout info">An entity that will play FX.</p>

### Usage

```
entity {
	layers {
		"game/pvp/slayer_team" // give the FX a layer
	}
	instanceId = 4206901337; // give the FX an instance ID so it can easily be attached to a timeline.
	originalName = "left_func_fx_slayer_portal_1";
	entityDef invasion_left_func_fx_slayer_portal_1_4206901337 { // use the entityDef when targeting this entity
	inherit = "func/fx";
	class = "idEntityFx";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		dormancy = {
			delay = 5;
			distance = 78.029007;
		}
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = { // spawn orientation requires all 3 mat
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 1;
				}
			}
		}
		fxEffect = "gameplay/invasion/teleporter_flat_demon"; // the FX used
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}

```

# idEnvironmentalDamage_Hurt_Trigger

<p class="callout info">An entity that deals damage when entering its volume. Essentially the damaging part of a hazard.</p>

## Usage

```
entity {
	entityDef example_hurt_trigger {
	inherit = "envhazard/volume/electrical_blue";
	class = "idEnvironmentalDamage_Hurt_Trigger";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		killerNames = {
			num = 1;
			item[0] = ""; // What to string display when killed by this entity
		}
		envDamageType = "ENVIRONMENTAL_DAMAGE_NUM";
		envDamage = ""; // Uses a damage decl that will define how much damage is caused
		envDamageInterval = 500; // How often the hazard will damage you in milliseconds
		envWarningInterval = 500;
		spawnPosition = { // Be sure to set its spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = { // Be sure to set its rotation
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
				}
			}
		}
		renderModelInfo = { // The hazard would normally be invisible
			model = NULL;
		}
		clipModelInfo = {
			type = ""; // Defines what kind of shape it is
			size = { // Be sure to set its scale
				x = 1;
				y = 1;
				z = 1;
			}
			clipModelName = NULL;
		}
	}
}
}
```

## Example

This example is an electric floor hazard.

```
entity {
	entityDef example_electric_hazard {
	inherit = "envhazard/volume/electrical_blue";
	class = "idEnvironmentalDamage_Hurt_Trigger";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		killerNames = {
			num = 1;
			item[0] = "#str_decl_damage_hazard_electrical_GHOST53193";
		}
		demonPlayerCanActivate = true;
		deadAiCanActivate = false;
		envDamageType = "ENVIRONMENTAL_DAMAGE_NUM";
		envDamage = "damage/hazard/electrical_bluefx";
		envDamageInterval = 500;
		envWarningInterval = 500;
		spawnPosition = { // Be sure to set its spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = { // Be sure to set its rotation
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
				}
			}
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			size = {
				x = 10;
				y = 10;
				z = 1;
			}
			clipModelName = NULL;
		}
	}
}
}
```

<p class="callout warning">Hurt triggers are usually invisible so you should add a particle entity on it to convey its physical dimensions.</p>

## See Also

[idParticleEmitter](https://wiki.eternalmods.com/books/5-level-modding/page/idparticleemitter)

# idGameChallenge

<p class="callout info">An entity that determines the game mode for the level. Only one idGameChallenge entity can exist per entities file.</p>

### idGameChallenge\_CampaignSinglePlayer

```
entity {
	entityDef gameplay_info_game_challenge_campaign_1 {
	inherit = "info/game_challenge/campaign";
	class = "idGameChallenge_CampaignSinglePlayer";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		networkSerializeTransforms = false;
		hostileTeamColor = {
			r = 1;
			g = 1;
			b = 0;
		}
		actorModifierListDecl = "actormodifiers_invasion";
		botGameManagerType = "BOT_GAME_MANAGER_TYPE_COOP";
		difficultySettings = {
			playerIncomingDamageScale = "campaign/playerincomingdamage";
			aiIncomingDamageScale = "campaign/aiincomingdamage";
			healthPickupScale = "campaign/healthpickup";
			armorPickupScale = "campaign/armorpickup";
			ammoPickupScale = "campaign/ammopickup";
			bfgAmmoPickupScale = "campaign/bfgammopickup";
			healthDropScale = "campaign/healthdrop";
			armorDropScale = "campaign/armordrop";
			ammoDropScale = "campaign/ammodrop";
			bfgAmmoDropScale = "campaign/bfgammodrop";
		}
		gcGameEventCallouts = {
			lootBlockedCallout = "invasion/slayer_loot_blocked";
			demonCriticalHealth = "invasion/demon_critical_health";
			demonCriticalRecovery = "invasion/demon_health_recovery";
			demonRespawn = "invasion/demon_spawned";
			slayerCriticalHealth = "invasion/slayer_critical_health";
			slayerCriticalRecovery = "invasion/slayer_health_recovery";
		}
		hitConfirmSoundsInfo = "default";
		availableDemonCardDecks = {
			num = 1;
			item[0] = "demoncarddeck/invasion/deck_1";
		}
		invasionDemonOptions = {
			num = 5;
			item[0] = {
				actorModifierDecl = "actormodifier/invasion/demon/archvile";
				demonCardDeckDecl = "demoncarddeck/invasion/archvile/invasion_deck_1";
			}
			item[1] = {
				actorModifierDecl = "actormodifier/invasion/demon/mancubus";
				demonCardDeckDecl = "demoncarddeck/invasion/mancubus/invasion_deck_1";
			}
			item[2] = {
				actorModifierDecl = "actormodifier/invasion/demon/marauder";
				demonCardDeckDecl = "demoncarddeck/invasion/marauder/invasion_deck_1";
			}
			item[3] = {
				actorModifierDecl = "actormodifier/invasion/demon/painelemental";
				demonCardDeckDecl = "demoncarddeck/invasion/painelemental/invasion_deck_1";
			}
			item[4] = {
				actorModifierDecl = "actormodifier/invasion/demon/revenant";
				demonCardDeckDecl = "demoncarddeck/invasion/revenant/invasion_deck_1";
			}
		}
		globalAIsettings = "default";
		desummonKillDamage = "damage/hazard/pvp_round_kill";
		slayerHighlightDecl = "invasion/slayer_view_demon_outline";
		demonHighlightDecl = "invasion/demon_view_slayer_outline";
		teammateHighlightDecl = "invasion/demon_view_teammate_outline";
		demonSpawnTargetEntity = "online/summon_target";
		demonSpawnTargetEntityOneHit = "online/summon_target_onehit";
		demonDisguiseHideFXEntity = "online/invasion/fx/hide_fx";
		demonDisguiseRevealFXEntity = "online/invasion/fx/reveal_fx";
		demonBecomingGhostFXEntity = "online/invasion/fx/become_ghost_fx";
		demonPosessionFXEntity = "online/invasion/fx/posession";
		demonPossessionShootableEntity = "online/invasion/possession_shootable_target";
		demonPossessionTouchDamage = "damage/special/disguisetouch";
		spawnTimer = 15000;
		playerSpawnDef = "player";
		invasionCallouts = {
			demonDisguiseRevealed = "invasion/demon_disguise_revealed";
			slayerInvasionStart = "invasion/demon_player_joined";
			slayerInvasionPartyStart = "invasion/demon_party_joined";
			slayerVictory = "invasion/slayer_victory";
			demonVictory = "invasion/demon_victory";
			noWinnerEnd = "invasion/invasion_ended";
			noInteractionEnd = "invasion/invasion_ended";
			threeDemonLivesRemaining = "invasion/three_demon_lives_left";
			twoDemonLivesRemaining = "invasion/two_demon_lives_left";
			oneDemonLifeRemaining = "invasion/one_demon_life_left";
			demonKilled = "invasion/demon_killed";
			threeSlayerLivesRemaining = "invasion/three_slayer_lives_left";
			twoSlayerLivesRemaining = "invasion/two_slayer_lives_left";
			oneSlayerLifeRemaining = "invasion/one_slayer_life_left";
			slayerKilled = "invasion/slayer_killed";
			invasionEndingSoon = "invasion/invasion_ending_soon";
		}
		invasionSettings = "default";
		sentinelArmorDecl = "sentinel_armor";
		extraLifeDecl = "extra_life";
		OnslaughtInfiniteCheat = "statuseffect/onslaught_infinite";
		OverdriveInfiniteCheat = "statuseffect/overdrive_infinite";
		BerserkInfiniteCheat = "statuseffect/berserk_infinite";
		flameBelchEquipmentDecl = "weapon/player/equipment_flame_belch";
		throwableIceEquipmentDecl = "throwable/player/ice_bomb";
		throwableFragEquipmentDecl = "throwable/player/frag_grenade";
		equipmentLauncherDecl = "equipmentlauncher/equipmentlauncherleft";
		quakeConModeSettings = "quakeconmodesettings";
		extraLifeLayerName_None = "game/sp/extralives/extralives_none";
		extraLifeLayerName_Some = "game/sp/extralives/extralives_some";
		extraLifeLayerName_Many = "game/sp/extralives/extralives_many";
		demonicCorruptionDecl = "e3m4_boss";
		playerInventoryItems = {
			num = 112;
			item[0] = "abilities/blood_punch";
			item[1] = "abilities/environmentsuit";
			item[2] = "abilities/grapplegloves";
			item[3] = "argent/ammo_upgrade";
			item[4] = "argent/armor_upgrade";
			item[5] = "argent/health_upgrade";
			item[6] = "collectible/albums/album_01";
			item[7] = "collectible/albums/album_02";
			item[8] = "collectible/albums/album_03";
			item[9] = "collectible/albums/album_04";
			item[10] = "collectible/albums/album_05";
			item[11] = "collectible/albums/album_06";
			item[12] = "collectible/albums/album_07";
			item[13] = "collectible/albums/album_08";
			item[14] = "collectible/albums/album_09";
			item[15] = "collectible/albums/album_10";
			item[16] = "collectible/albums/album_11";
			item[17] = "collectible/albums/album_12";
			item[18] = "collectible/albums/album_13";
			item[19] = "collectible/albums/album_14";
			item[20] = "collectible/albums/album_15";
			item[21] = "collectible/albums/album_16";
			item[22] = "collectible/cheats/infinite_ammo";
			item[23] = "collectible/cheats/infinite_berserk";
			item[24] = "collectible/cheats/infinite_extra_lives";
			item[25] = "collectible/cheats/infinite_onslaught";
			item[26] = "collectible/cheats/infinite_overdrive";
			item[27] = "collectible/cheats/instant_stagger_mode";
			item[28] = "collectible/cheats/party_mode";
			item[29] = "collectible/cheats/silver_bullet_mode";
			item[30] = "collectible/toys/doom_slayer";
			item[31] = "collectible/toys/dreadknight";
			item[32] = "collectible/toys/gargoyle";
			item[33] = "collectible/toys/gladiator";
			item[34] = "collectible/toys/hellknight";
			item[35] = "collectible/toys/icon_of_sin";
			item[36] = "collectible/toys/imp";
			item[37] = "collectible/toys/khan_maykr";
			item[38] = "collectible/toys/lost_soul";
			item[39] = "collectible/toys/mancubus_fire";
			item[40] = "collectible/toys/mancubus_goo";
			item[41] = "collectible/toys/marauder";
			item[42] = "collectible/toys/maykr_drone";
			item[43] = "collectible/toys/pain_elemental";
			item[44] = "collectible/toys/pinky";
			item[45] = "collectible/toys/pinky_spectre";
			item[46] = "collectible/toys/prowler";
			item[47] = "collectible/toys/revenant";
			item[48] = "collectible/toys/soldier_blaster";
			item[49] = "collectible/toys/soldier_shield";
			item[50] = "collectible/toys/tyrant";
			item[51] = "collectible/toys/whiplash";
			item[52] = "collectible/toys/zombie_tier_1";
			item[53] = "collectible/toys/zombie_tier_3";
			item[54] = "equipment/flame_belch";
			item[55] = "equipment/frag_grenade";
			item[56] = "equipment/ice_bomb";
			item[57] = "map_objects/rad_shield_damage_decreases_shield";
			item[58] = "map_objects/rad_suit_refill_shield";
			item[59] = "map_objects/suit_upgrade_points";
			item[60] = "map_objects/keycard/cultist";
			item[61] = "map_objects/keycard/hell_flesh_blue";
			item[62] = "map_objects/keycard/hell_flesh_red";
			item[63] = "map_objects/keycard/hell_flesh_yellow";
			item[64] = "map_objects/keycard/mech_battery";
			item[65] = "map_objects/keycard/slayer_key";
			item[66] = "map_objects/keycard/uac_blue";
			item[67] = "map_objects/keycard/uac_red";
			item[68] = "map_objects/keycard/uac_yellow";
			item[69] = "jumpboots/base";
			item[70] = "sentinel_armor";
			item[71] = "throwable/player/frag_grenade";
			item[72] = "throwable/player/ice_bomb";
			item[73] = "weapon/player/bfg";
			item[74] = "weapon/player/chaingun";
			item[75] = "weapon/player/chaingun_energy_shell";
			item[76] = "weapon/player/chaingun_energy_shell_primary";
			item[77] = "weapon/player/chaingun_turret_primary";
			item[78] = "weapon/player/chaingun_turret_secondary";
			item[79] = "weapon/player/chainsaw";
			item[80] = "weapon/player/crucible";
			item[81] = "weapon/player/doomblade";
			item[82] = "weapon/player/double_barrel";
			item[83] = "weapon/player/double_barrel_meat_hook";
			item[84] = "weapon/player/double_barrel_primary_lockon";
			item[85] = "weapon/player/equipment_flame_belch";
			item[86] = "weapon/player/fists";
			item[87] = "weapon/player/fists_berserk";
			item[88] = "weapon/player/fists_doom5melee";
			item[89] = "weapon/player/fists_swim";
			item[90] = "weapon/player/gauss_rifle";
			item[91] = "weapon/player/gauss_rifle_ballista";
			item[92] = "weapon/player/gauss_rifle_destroyer";
			item[93] = "weapon/player/heavy_cannon";
			item[94] = "weapon/player/heavy_cannon_bolt_action";
			item[95] = "weapon/player/heavy_cannon_burst_detonate";
			item[96] = "weapon/player/heavy_cannon_burst_detonate_faster_recharge";
			item[97] = "weapon/player/heavy_cannon_burst_detonate_mastery";
			item[98] = "weapon/player/plasma_rifle";
			item[99] = "weapon/player/plasma_rifle_secondary_aoe";
			item[100] = "weapon/player/plasma_rifle_secondary_aoe_mastery_primary_supercharge";
			item[101] = "weapon/player/plasma_rifle_secondary_microwave";
			item[102] = "weapon/player/pointing_arm";
			item[103] = "weapon/player/rocket_launcher";
			item[104] = "weapon/player/rocket_launcher_detonate";
			item[105] = "weapon/player/rocket_launcher_lock_mod";
			item[106] = "weapon/player/rocket_launcher_lock_mod_mastery";
			item[107] = "weapon/player/shotgun";
			item[108] = "weapon/player/shotgun_secondary_full_auto";
			item[109] = "weapon/player/shotgun_secondary_pop_rockets";
			item[110] = "weapon/player/shotgun_secondary_pop_rockets_mastery";
			item[111] = "weapon/player/unmaykr";
		}
		playerPerks = {
			num = 112;
			item[0] = "perk/player/argent/ammo_capacity_0";
			item[1] = "perk/player/argent/ammo_capacity_1";
			item[2] = "perk/player/argent/ammo_capacity_2";
			item[3] = "perk/player/argent/ammo_capacity_3";
			item[4] = "perk/player/argent/armor_capacity_0";
			item[5] = "perk/player/argent/armor_capacity_1";
			item[6] = "perk/player/argent/armor_capacity_2";
			item[7] = "perk/player/argent/armor_capacity_3";
			item[8] = "perk/player/argent/health_capacity_0";
			item[9] = "perk/player/argent/health_capacity_1";
			item[10] = "perk/player/argent/health_capacity_2";
			item[11] = "perk/player/argent/health_capacity_3";
			item[12] = "perk/player/blood_punch/base";
			item[13] = "perk/player/blood_punch/ai_charge_rate";
			item[14] = "perk/player/blood_punch/area_of_effect";
			item[15] = "perk/player/blood_punch/max_charges";
			item[16] = "perk/player/runes/glory_kill_speed";
			item[17] = "perk/player/runes/glory_kill_dash";
			item[18] = "perk/player/runes/speed_boost_on_glory_kill";
			item[19] = "perk/player/runes/double_jump_air_control";
			item[20] = "perk/player/runes/modify_enemy_stagger_duration";
			item[21] = "perk/player/runes/activate_focus_on_death_blow";
			item[22] = "perk/player/runes/target_strike";
			item[23] = "perk/player/runes/decrease_equipment_recharge";
			item[24] = "perk/player/runes/blood_punch_loot_on_damage";
			item[25] = "perk/player/suit/self_preservation/reduce_hazard_damage";
			item[26] = "perk/player/suit/self_preservation/reduce_self_weapon_damage";
			item[27] = "perk/player/suit/extermination/barrels_respawn";
			item[28] = "perk/player/suit/extermination/barrels_drop_ammo";
			item[29] = "perk/player/equipment/frag_base";
			item[30] = "perk/player/equipment/frag_reduce_cooldown";
			item[31] = "perk/player/equipment/frag_concussive_blast";
			item[32] = "perk/player/equipment/frag_cluster_bombs";
			item[33] = "perk/player/equipment/frag_max_capacity";
			item[34] = "perk/player/equipment/ice_base";
			item[35] = "perk/player/equipment/ice_reduce_cooldown";
			item[36] = "perk/player/equipment/ice_extend_duration";
			item[37] = "perk/player/equipment/ice_health_drops";
			item[38] = "perk/player/equipment/ice_melee_shatter";
			item[39] = "perk/player/suit/fundamentals/ledge_grab_speed";
			item[40] = "perk/player/suit/fundamentals/weapon_change_speed";
			item[41] = "perk/player/suit/dash/dash_regen_delay";
			item[42] = "perk/player/suit/dash/dash_gk_restore_dash";
			item[43] = "perk/player/suit/exploration/automap_shows_map_station";
			item[44] = "perk/player/suit/exploration/automap_shows_progression_items";
			item[45] = "perk/player/suit/exploration/automap_increased_fog_radius";
			item[46] = "perk/player/suit/exploration/dossier_shows_progression_items";
			item[47] = "perk/player/equipment/flame_reduce_cooldown";
			item[48] = "perk/player/suit/fundamentals/increase_pickup_radius";
			item[49] = "perk/player/equipment/flame_extend_duration";
			item[50] = "perk/player/suit/self_preservation/overhealth";
			item[51] = "perk/player/equipment/flame_more_loot";
			item[52] = "perk/player/suit/self_preservation/overarmor";
			item[53] = "perk/player/weapons/chaingun/turret";
			item[54] = "perk/player/weapons/chaingun/turret_faster_equip";
			item[55] = "perk/player/weapons/chaingun/turret_faster_movement";
			item[56] = "perk/player/weapons/chaingun/turret_mastery";
			item[57] = "perk/player/weapons/chaingun/energy_shell";
			item[58] = "perk/player/weapons/chaingun/energy_shell_faster_recharge";
			item[59] = "perk/player/weapons/chaingun/energy_shell_dash_smash";
			item[60] = "perk/player/weapons/chaingun/energy_shell_mastery";
			item[61] = "perk/player/weapons/chainsaw/default";
			item[62] = "perk/player/weapons/bfg/firemode_charge";
			item[63] = "perk/player/weapons/bfg/shape_sphere";
			item[64] = "perk/player/weapons/bfg/element_arc";
			item[65] = "perk/player/weapons/crucible/base";
			item[66] = "perk/player/weapons/doomblade/level_1";
			item[67] = "perk/player/weapons/double_barrel/meat_hook";
			item[68] = "perk/player/weapons/double_barrel/meat_hook_faster_reload";
			item[69] = "perk/player/weapons/double_barrel/default_faster_reload";
			item[70] = "perk/player/weapons/double_barrel/meat_hook_mastery";
			item[71] = "perk/player/weapons/gauss_cannon/ballista";
			item[72] = "perk/player/weapons/gauss_cannon/ballista_movement";
			item[73] = "perk/player/weapons/gauss_cannon/ballista_larger_explosion";
			item[74] = "perk/player/weapons/gauss_cannon/ballista_mastery";
			item[75] = "perk/player/weapons/gauss_cannon/destroyer";
			item[76] = "perk/player/weapons/gauss_cannon/destroyer_charge_levels_aoe";
			item[77] = "perk/player/weapons/gauss_cannon/destroyer_faster_charge_and_recovery";
			item[78] = "perk/player/weapons/gauss_cannon/destroyer_charge_levels";
			item[79] = "perk/player/weapons/heavy_cannon/bolt_action";
			item[80] = "perk/player/weapons/heavy_cannon/bolt_action_faster_movement";
			item[81] = "perk/player/weapons/heavy_cannon/bolt_action_faster_reload";
			item[82] = "perk/player/weapons/heavy_cannon/bolt_action_mastery_upgrades";
			item[83] = "perk/player/weapons/heavy_cannon/burst_detonate";
			item[84] = "perk/player/weapons/heavy_cannon/burst_detonate_faster_recharge";
			item[85] = "perk/player/weapons/heavy_cannon/burst_detonate_faster_charge";
			item[86] = "perk/player/weapons/heavy_cannon/burst_detonate_primary_charge";
			item[87] = "perk/player/weapons/heavy_cannon/burst_detonate_mastery";
			item[88] = "perk/player/weapons/plasma_rifle/secondary_aoe_no_primary_delay";
			item[89] = "perk/player/weapons/plasma_rifle/secondary_aoe_faster_charge";
			item[90] = "perk/player/weapons/plasma_rifle/secondary_aoe_mastery";
			item[91] = "perk/player/weapons/plasma_rifle/secondary_microwave_faster_charge";
			item[92] = "perk/player/weapons/plasma_rifle/secondary_microwave_max_range";
			item[93] = "perk/player/weapons/plasma_rifle/secondary_microwave_mastery";
			item[94] = "perk/player/weapons/rocket_launcher/detonate";
			item[95] = "perk/player/weapons/rocket_launcher/detonate_proximity_flare";
			item[96] = "perk/player/weapons/rocket_launcher/detonate_concussive";
			item[97] = "perk/player/weapons/rocket_launcher/detonate_explosive_array_horizontal";
			item[98] = "perk/player/weapons/rocket_launcher/lockon_faster_recovery";
			item[99] = "perk/player/weapons/rocket_launcher/lockon_decrease_lock_time";
			item[100] = "perk/player/weapons/rocket_launcher/lockon_mastery";
			item[101] = "perk/player/weapons/shotgun/pop_rocket";
			item[102] = "perk/player/weapons/shotgun/pop_rocket_faster_recharge";
			item[103] = "perk/player/weapons/shotgun/pop_rocket_larger_explosion";
			item[104] = "perk/player/weapons/shotgun/pop_rocket_more_bombs";
			item[105] = "perk/player/weapons/shotgun/secondary_full_auto";
			item[106] = "perk/player/weapons/shotgun/secondary_full_auto_faster_recovery";
			item[107] = "perk/player/weapons/shotgun/secondary_full_auto_faster_charge";
			item[108] = "perk/player/weapons/shotgun/secondary_full_auto_increased_movement_speed";
			item[109] = "perk/player/weapons/shotgun/secondary_full_auto_ammo_giveback";
			item[110] = "perk/player/weapons/unmaykr/firemode_change";
			item[111] = "perk/player/e3_tutorial/flame_reduce_cooldown_e3_tutorial";
		}
		spawnPosition = { // spawn position is not important
			x = 1;
            y = 1;
            z = 1;
		}
		disabledCheats = {
			num = 1;
			item[0] = "CHEAT_CODE_TYPE_POWERUP_INFINITE_DURATION_BERSERK";
		}
		aiSpawnPoolDecl = "maps/game/sp/e3m4_boss"; // change this depending on the level used
	}
}
}
```

### idGameChallenge\_PVP

```
entity {
	entityDef game_info_game_challenge_battlearena_1 {
	inherit = "info/game_challenge/battlearena";
	class = "idGameChallenge_PVP";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		networkSerializeTransforms = false;
		modeFlags = {
			allowRespawning = true;
			allowBulletPenetration = false;
		}
		scoreLimit = 3;
		numLives = 9;
		numRounds = 5;
		actorModifierListDecl = "actormodifiers_pvp";
		gcGameEventCallouts = {
			slayerPowerWeapon = "pvp/combat_events/slayer_power_weapon";
			demonSummonedCallout = "pvp/combat_events/general_card_event";
			demonEffectCallout = "pvp/combat_events/general_card_event";
			demonEffectStatusTimer = "pvp/status_timers/demon_effect";
			demonQuickUse1Callout = "pvp/combat_events/general_card_event";
			demonQuickUse2Callout = "pvp/combat_events/general_card_event";
			damageBoostCallout = "pvp/combat_events/general_card_event";
			damageBoostStatusTimer = "pvp/status_timers/timer_damage_boost";
			hasteCallout = "pvp/combat_events/general_card_event";
			hasteStatusTimer = "pvp/status_timers/timer_haste";
			mitigationCallout = "pvp/combat_events/general_card_event";
			mitigationStatusTimer = "pvp/status_timers/timer_damage_mitigation";
			invulnerableCallout = "pvp/combat_events/general_card_event";
			invulnerableStatusTimer = "pvp/status_timers/timer_invulnerable";
			berserkCallout = "pvp/combat_events/general_card_event";
			berserkStatusTimer = "pvp/status_timers/timer_berserk";
			regenCallout = "pvp/combat_events/general_card_event";
			regenStatusTimer = "pvp/status_timers/timer_regeneration";
			lootBlockedCallout = "pvp/voiced/loot_blocked";
			lootBlockedStatusTimer = "pvp/status_timers/timer_loot_blocked";
			extraLifeCallout = "pvp/combat_events/general_card_event";
			demonCriticalHealth = "pvp/voiced/demon_health_critical";
			demonCriticalRecovery = "pvp/voiced/demon_healed";
			slayerCriticalHealth = "pvp/voiced/slayer_health_critical";
			everyoneCritical = "pvp_sudden_death";
		}
		hitConfirmSoundsInfo = "default";
		characterStatusEventText = {
			invulnerableText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45053";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
			toughenedText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45054";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
			vulnerableText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45055";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
			strengthenedText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45056";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
			hastedText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45057";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
			slowedText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45058";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
			berserkingText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45059";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
			lootBlockedText = {
				textId = "#str_decl_powerup_statuseffect_GHOST45060";
				color = {
					r = 0.87450999;
					g = 0.87450999;
					b = 0.87450999;
				}
			}
		}
		aiSpawnPoolDecl = "maps/game/pvp/battlemode";
		enableBrinkOfDeath = false;
		desummonKillDamage = "damage/hazard/pvp_round_kill";
		slayerHighlightDecl = "pvp/slayer_view_demon_outline";
		demonHighlightDecl = "pvp/demon_view_slayer_outline";
		teammateHighlightDecl = "pvp/demon_view_teammate_outline";
		slayerHighlightLOSBoxDecl = "highlight_los_slayer";
		demonSpawnTargetEntity = "online/summon_target";
		demonSpawnTargetEntityOneHit = "online/summon_target_onehit";
		playerSpawnDef = "player";
		teamSuperSettings = {
			damageFactorAI = 9.99999975e-05;
			tickFactor = 0.00329999998;
		}
		playerAlwaysFullBodyGibs = true;
		maxPlayersPerTeam = {
			ptr = {
				ptr[0] = 1;
				ptr[1] = 2;
			}
		}
		demonOutlineColor = {
			g = 0.501960993;
		}
		demonAllyOutlineColor = {
			r = 1;
			g = 0.501960993;
			b = 0;
		}
		fillColorDemonSees = {
			r = 0.199999988;
			g = 0.199999988;
			b = 0.199999988;
			a = 0.850000024;
		}
		fillColorSlayerSees = {
			r = 0.199999988;
			g = 0.199999988;
			b = 0.199999988;
			a = 0.850000024;
		}
		fillColorHitFlash = {
			g = 0;
			b = 0;
			a = 0.501960993;
		}
		slayerHighlightOptions = {
			enemyDemon = "EHM_ONLY_IN_VIEW";
		}
		demonHighlightOptions = {
			allyDemon = "EHM_ALWAYS";
			enemySlayer = "EHM_ALWAYS";
		}
		raceToStyle = true;
		pvpGameEventCallouts = {
			roundOne = "pvp/voiced/round_one";
			roundTwo = "pvp/voiced/round_two";
			roundThree = "pvp/voiced/round_three";
			roundFour = "pvp/voiced/round_four";
			roundFinal = "pvp/voiced/final_round";
			preMatchFiveSecondsRemaining = "pvp/chimes/five";
			preMatchFourSecondsRemaining = "pvp/chimes/four";
			preMatchThreeSecondsRemaining = "pvp/chimes/three";
			preMatchTwoSecondsRemaining = "pvp/chimes/two";
			preMatchOneSecondRemaining = "pvp/chimes/one";
			roundStart = "pvp/voiced/fight";
			finalRound = "pvp/voiced/final_round";
			demonsRoundLost = "pvp/voiced/demons_round_lost";
			slayerRoundLost = "pvp/voiced/slayer_round_lost";
			slayerKilled = "pvp/voiced/slayer_killed";
			demonKilled = "pvp/voiced/demon_killed";
			demonsKilled = "pvp/voiced/demons_killed";
			slayerVictory = "pvp/voiced/slayer_won_the_match";
			demonVictory = "pvp/voiced/demons_won_the_match";
			demonRespawningSoon = "pvp/voiced/demon_resurrecting_soon";
			respawnFiveSecondsRemaining = "pvp/chimes/resurrect_five";
			respawnFourSecondsRemaining = "pvp/chimes/resurrect_four";
			respawnThreeSecondsRemaining = "pvp/chimes/resurrect_three";
			respawnTwoSecondsRemaining = "pvp/chimes/resurrect_two";
			respawnOneSecondRemaining = "pvp/chimes/resurrect_one";
			demonRespawned = "pvp/voiced/demon_resurrected";
			delayDuringSync = {
				num = 3;
				item[0] = "pvp/voiced/slayer_killed";
				item[1] = "pvp/voiced/demons_won_the_match";
				item[2] = "pvp/voiced/slayer_round_lost";
			}
		}
		jockeyTimeDuration = {
			value = 5;
		}
		roundCalloutTimeDuration = {
			value = 3;
		}
		roundStartCalloutDelaySec = {
			value = 2;
		}
		pvpProgressionScoringDecl = "battle_arena";
		pvpLifecycleManager = {
			podiumAvatarEntDefs = {
				num = 7;
				item[0] = "podiums/avatars/archvile";
				item[1] = "podiums/avatars/doom_marine";
				item[2] = "podiums/avatars/mancubus";
				item[3] = "podiums/avatars/pain_elemental";
				item[4] = "podiums/avatars/revenant";
				item[5] = "podiums/avatars/marauder";
				item[6] = "podiums/avatars/dreadknight";
			}
			podiumLayers = {
				num = 1;
				item[0] = "game/pvp/podium_stage";
			}
			slayerPodiumEntities = "pvp_match_slayer_podium_";
			demonPodiumEntities = "pvp_match_demon_podium_slot_";
			characterAnimBlendMS = 0;
			playerAppearSound = "play_pvp_staging_spawnin";
		}
		slayerPVPLoadoutDecl = "pvploadout/default";
		demonPVPLoadoutDecl = "pvpdemonloadout/default";
		respawnTimeSec = {
			branchPairs = {
				num = 1;
				item[0] = {
					branchKey = "CONTROLLERPAD_DECL";
					branchResult = {
						value = 22;
					}
				}
			}
		}
		respawnTimeCapSec = {
			defaultValue = {
				value = 20;
			}
			branchPairs = {
				num = 1;
				item[0] = {
					branchKey = "CONTROLLERPAD_DECL";
					branchResult = {
						value = 22;
					}
				}
			}
		}
		respawnStatusEffects = {
			num = 2;
			item[0] = "statuseffect/pvp/demon_action/respawn_protection";
			item[1] = "statuseffect/pvp/demon_action/respawn_haste";
		}
		idealRespawnDistanceFromSlayer = 100;
		slayerLayersToActivate = {
			num = 1;
			item[0] = "game/pvp/slayer_team";
		}
		demonLayersToActivate = {
			num = 1;
			item[0] = "game/pvp/demon_team";
		}
		layersToDeactivate = {
			num = 1;
			item[0] = "game/pvp/permanently_hidden";
		}
		musicFirstLoadedState = "music_ghost_states/pvp_lobby";
		musicIntroState = "music_ghost_states/pvp_lobby_player_ready";
		musicMatchState = "music_ghost_states/pvp_lobby_end";
		musicWinState = "music_ghost_states/pvp_win";
		musicLoseState = "music_ghost_states/pvp_lose";
		musicHealthCriticalState = "music_ghost_states/pvp_sudden_death";
		musicRoundWinState = "music_ghost_states/pvp_win_round";
		musicRoundLoseState = "music_ghost_states/pvp_lose_round";
		closeCallHealthThreshold = 50;
		clutchThreshold = 5;
		comebackThreshold = 3;
		surpriseTimeLimit = {
			value = 3;
		}
		surviveThreshold = 4;
		soundOcclusionBypass = true;
		spawnPosition = { // spawn position is not important
			x = 1;
			y = 1;
			z = 1;
		}
	}
}
}
```

# idGuiEntity_Text

<p class="callout info">An entity that displays text in the world.</p>

### Example

```
entity {
	entityDef sample_text { // name of the entity
	inherit = "gui/text";
	class = "idGuiEntity_Text";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noknockback = false;
		}
		renderModelInfo = {
			model = "editors/models/gui_text.lwo";
			scale = { // size of the entity
				x = 10;
				y = 10;
				z = 10;
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_NONE";
		}
		swf = "swf/guientity/generic_text.swf";
		spawnPosition = { // location of where the entity will appear
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = { // direction the entity will face
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 1;
				}
			}
		}
		dormancy = {
			allowDistanceDormancy = false;
			allowDormancy = false;
			allowPvsDormancy = false;
		}
		dynamicMoveActive = true;
		swfScale = 0.02; // size of the string
		bodyText = {
			text = "Sample Text"; // the string itself
		}
		headerText = { // Use if using generic_text.swf and without bodyText
			text = "Text\nWith\nLine\nBreaks"; // enter text here
			color = {
				r = 1;
				g = 1;
				b = 1;
			}
			relativeWidth = 1; // the width of the text relative to the swf (eg. generic_text = 1.0, generic_text_wide = 1.95)
			alignment = "SWF_ET_ALIGN_CENTER"; // Text alignment; SWF_ET_ALIGN_LEFT, SWF_ET_ALIGN_RIGHT, SWF_ET_ALIGN_CENTER, or SWF_ET_ALIGN_JUSTIFY
		}                                      
		billboard = true; // if true, the text entity will always face the player
	}
}
}
```

<p class="callout success">String customization applies to both **BLANG** files and **idGuiEntity\_Text** entities.</p>

### See Also

- [String Customization](https://wiki.eternalmods.com/books/beginners-guide-how-to-create-mods/page/string-customization)

# idInteractable

<p class="callout info">An entity that is interactable with a melee input.</p>

<p class="callout warning">Some of these entities only work in specific resources.   
You will need to pull assets from other levels if you want to use them in a level where they normally do not exist.</p>

### Skull Switch

```
entity {
	entityDef interact_use_panel_sentinel_skull_switch_1 {
	inherit = "interact/use_panel/sentinel_skull_switch";
	class = "idInteractable";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		whenToSave = "SGT_CHECKPOINT";
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 0.75;
				y = 1.20000005;
				z = 1.95000005;
			}
		}
		interaction = {
			initalState = "interactables/console/sentinel_skull_switch/sentinel_skull_idle";
			interactionGraph = "interactables/console";
			stateData = {
				num = 6;
				item[0] = {
					stateName = "interactables/console/sentinel_skull_switch/sentinel_skull_activate";
				}
				item[1] = {
					stateName = "interactables/console/sentinel_skull_switch/sentinel_skull_activate_repeat";
				}
				item[2] = {
					stateName = "interactables/console/sentinel_skull_switch/sentinel_skull_idle";
				}
				item[3] = {
					stateName = "interactables/console/sentinel_skull_switch/sentinel_skull_idle_repeat";
				}
				item[4] = {
					stateName = "interactables/console/sentinel_skull_switch/sentinel_skull_used";
				}
				item[5] = {
					stateName = "interactables/console/sentinel_skull_switch/sentinel_skull_used_repeat";
				}
			}
			transitionData = {
				num = 6;
				item[0] = {
					transitionName = "sentinel_skull_activate_To_sentinel_skull_idle";
					additionalWaitMs = 250;
				}
				item[1] = {
					transitionName = "sentinel_skull_activate_repeat_To_sentinel_skull_idle_repeat";
					additionalWaitMs = 250;
				}
				item[2] = {
					transitionName = "sentinel_skull_usable_To_sentinel_skull_used";
				}
				item[3] = {
					transitionName = "sentinel_skull_usable_repeat_To_sentinel_skull_used_repeat";
				}
				item[4] = {
					transitionName = "sentinel_skull_used_To_sentinel_skull_idle";
					additionalWaitMs = 250;
				}
				item[5] = {
					transitionName = "sentinel_skull_used_repeat_To_sentinel_skull_idle_repeat";
					additionalWaitMs = 2000;
				}
			}
			animWebDecl = "animweb/interact/skull_switch_sentinel/skull_switch_sentinel_interact";
		}
		touchData = {
			triggerDef = "trigger/interact/use_panel";
		}
		activateTargetsOnUse = false;
		stateColors = {
			num = 6;
			item[0] = {
				color = {
					g = 0.0588235036;
					b = 0.0588235036;
				}
				colorScale = 5;
				state = "sentinel_skull_activate";
			}
			item[1] = {
				color = {
					g = 0.0588235036;
					b = 0.0588235036;
				}
				colorScale = 5;
				state = "sentinel_skull_activate_repeat";
			}
			item[2] = {
				color = {
					r = 0.196078002;
					b = 0.0392156988;
				}
				colorScale = 5;
				state = "sentinel_skull_idle";
			}
			item[3] = {
				color = {
					r = 0.196078002;
					b = 0.0392156988;
				}
				colorScale = 5;
				state = "sentinel_skull_idle_repeat";
			}
			item[4] = {
				color = {
					r = 0;
					g = 0;
					b = 0;
				}
				colorScale = 0;
				state = "sentinel_skull_used";
			}
			item[5] = {
				color = {
					g = 0.0588235036;
					b = 0.0588235036;
				}
				colorScale = 5;
				state = "sentinel_skull_used_repeat";
			}
		}
		activateTargetsOnEndInteraction = true;
		thirdPersonInteractionData = {
			thirdPersonInteractionType = "PLAYER_MECHANIC_THIRD_PERSON_INTERACT_TYPE_BUTTON";
		}
		renderModelInfo = {
			model = "md6def/objects/interact/skull_switch_sentinel/skull_switch_sentinel.md6";
		}
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		targets = { // activates these entities on interact
			num = 1;
			item[0] = "activate_something_1";
		}
	}
}
}
```

### Weapon Mod Bot

```
entity {
	entityDef game_progress_mod_bot_1 {
	inherit = "progress/mod_bot";
	class = "idInteractable_WeaponModBot";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		soundOffset = {
			z = 1.29999995;
		}
		saveType = "SGS_GAME_DATA";
		automapPropertiesDecl = "mod_bot";
		renderModelInfo = {
			model = "md6def/objects/interact/mod_bot/mod_bot.md6";
			lightRigDecl = "mod_bot/mod_bot_default";
			contributesToLightProbeGen = false;
			materialRemapRT = {
				num = 3;
				item[0] = {
					from = "art/pickups/mod_bot/slayer_mod_bot_01";
					to = "art/pickups/mod_bot/slayer_mod_bot_01_rt";
				}
				item[1] = {
					from = "art/pickups/mod_bot/slayer_modbot_bag_01";
					to = "art/pickups/mod_bot/slayer_modbot_bag_01_rt";
				}
				item[2] = {
					from = "art/pickups/mod_bot/slayer_mod_bot_01_used";
					to = "art/pickups/mod_bot/slayer_mod_bot_01_used_rt";
				}
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			size = {
				x = 1.5;
				y = 1.5;
				z = 1;
			}
			offset = {
				z = 1.04999995;
			}
			numSides = 8;
		}
		spawn_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_ITEMS_SPAWNED";
				increase = 1;
			}
		}
		fxDecl = "gameplay/mod_bot";
		interaction = {
			initalState = "interactables/progress/mod_bot/idle_mod";
			animWebDecl = "animweb/interact/mod_bot/mod_bot_interact";
			interactionGraph = "interactables/progress";
			stateData = {
				num = 4;
				item[0] = {
					stateName = "interactables/progress/mod_bot/activate_to_use";
				}
				item[1] = {
					stateName = "interactables/progress/mod_bot/idle_mod";
				}
				item[2] = {
					stateName = "interactables/progress/mod_bot/selection_mod";
				}
				item[3] = {
					stateName = "interactables/progress/mod_bot/used_mod";
					onEnterCodexEntry = "codex/tutorials/mod_station";
					hideMeshOnEnter = {
						num = 1;
						item[0] = "crate";
					}
				}
			}
		}
		touchData = {
			triggerDef = "trigger/interact/use_panel";
			triggerDefOffset = {
				x = 0.25;
			}
		}
		activateTargetsOnUse = false;
		stateColors = {
			num = 4;
			item[0] = {
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/pickups/mod_bot/slayer_mod_bot_01";
						to = "art/pickups/mod_bot/slayer_mod_bot_01_used";
					}
					item[1] = {
						from = "art/pickups/mod_bot/slayer_modbot_bag_01";
						to = "art/pickups/mod_bot/slayer_modbot_bag_01_used";
					}
				}
				state = "selection_mod";
			}
			item[1] = {
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/pickups/mod_bot/slayer_mod_bot_01_used";
						to = "art/pickups/mod_bot/slayer_mod_bot_01";
					}
					item[1] = {
						from = "art/pickups/mod_bot/slayer_modbot_bag_01_used";
						to = "art/pickups/mod_bot/slayer_modbot_bag_01";
					}
				}
				state = "idle_mod";
			}
			item[2] = {
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/pickups/mod_bot/slayer_mod_bot_01_used";
						to = "art/pickups/mod_bot/slayer_mod_bot_01";
					}
					item[1] = {
						from = "art/pickups/mod_bot/slayer_modbot_bag_01_used";
						to = "art/pickups/mod_bot/slayer_modbot_bag_01";
					}
				}
				state = "usable_mod";
			}
			item[3] = {
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/pickups/mod_bot/slayer_mod_bot_01";
						to = "art/pickups/mod_bot/slayer_mod_bot_01_used";
					}
					item[1] = {
						from = "art/pickups/mod_bot/slayer_modbot_bag_01";
						to = "art/pickups/mod_bot/slayer_modbot_bag_01_used";
					}
				}
				state = "used_mod";
			}
		}
		activateTargetsOnEndInteraction = true;
		progressionCategory = "PROGRESSION_CATEGORY_MODBOT";
		removeForMasterLevels = true;
		thirdPersonInteractionData = {
			thirdPersonInteractionType = "PLAYER_MECHANIC_THIRD_PERSON_INTERACT_TYPE_GENERIC";
			firstPersonSyncEntityForInteractionToPositionOnUse = "interact/mod_bot/mod_bot_sync";
			firstPersonSyncAnimWebPath = "animweb/interact/mod_bot/mod_bot_syncanimweb/autoSyncAnim/mod_bot";
		}
		userMustBeInTouchTrigger = true;
		useCodex = "codex/tutorials/mod_station";
		enterSound = "play_ui_mod_bot_entrance";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		dormancy = {
			allowDistanceDormancy = false;
			allowPvsDormancy = false;
		}
	}
}
}
```

### Rune Station

```
entity {
	entityDef pickups_progress_rune_1 {
	inherit = "progress/rune";
	class = "idInteractable_Rune";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		soundOffset = {
			z = 1;
		}
		saveType = "SGS_GAME_DATA";
		automapPropertiesDecl = "rune";
		renderModelInfo = {
			model = "md6def/objects/props/maykr_rune_interact/maykr_rune_interact.md6";
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			size = {
				x = 1.5;
				y = 1.75;
				z = 2.5;
			}
			offset = {
				x = -0.600000024;
			}
			numSides = 21;
		}
		dormancy = {
			playerDistance = 20;
		}
		fxDecl = "gameplay/rune_pickup";
		interaction = {
			initalState = "interactables/progress/rune/idle_rune";
			unuseableState = "interactables/progress/rune/used_rune";
			animWebDecl = "animweb/interact/rune/rune_interact";
			interactionGraph = "interactables/progress";
			stateData = {
				num = 3;
				item[0] = {
					stateName = "interactables/progress/rune/idle_rune";
				}
				item[1] = {
					stateName = "interactables/progress/rune/ready_rune";
				}
				item[2] = {
					stateName = "interactables/progress/rune/used_rune";
					markForGameUsed = true;
				}
			}
			transitionData = {
				num = 3;
				item[0] = {
					transitionName = "open_rune_To_ready_rune";
					playSoundOnTransition = "play_rune_interact_open";
				}
				item[1] = {
					transitionName = "closed_rune_To_waiting_rune";
					playSoundOnTransition = "play_rune_interact_close";
				}
				item[2] = {
					transitionName = "selection_rune_To_used_rune";
					playSoundOnTransition = "play_rune_pickup";
				}
			}
		}
		touchData = {
			triggerDef = "trigger/interact/progress_rune";
			retouchDelaySec = 250;
		}
		activateTargetsOnUse = false;
		onUseCodexEntry = "codex/tutorials/rune";
		stateColors = {
			num = 3;
			item[0] = {
				materialSwapList = {
					num = 1;
					item[0] = {
						from = "art/kit/maykr/prop/textures/maykr_rune_static";
						to = "art/kit/maykr/prop/textures/maykr_rune_interact_01";
					}
				}
				state = "ready_rune";
			}
			item[1] = {
				materialSwapList = {
					num = 1;
					item[0] = {
						from = "art/kit/maykr/prop/textures/maykr_rune_interact_01";
						to = "art/kit/maykr/prop/textures/maykr_rune_static";
					}
				}
				state = "selection_rune";
			}
			item[2] = {
				materialSwapList = {
					num = 1;
					item[0] = {
						from = "art/kit/maykr/prop/textures/maykr_rune_interact_01";
						to = "art/kit/maykr/prop/textures/maykr_rune_static";
					}
				}
				state = "used_rune";
			}
		}
		activateTargetsOnEndInteraction = true;
		progressionCategory = "PROGRESSION_CATEGORY_RUNE";
		removeForMasterLevels = true;
		thirdPersonInteractionData = {
			thirdPersonInteractionType = "PLAYER_MECHANIC_THIRD_PERSON_INTERACT_TYPE_GENERIC";
			firstPersonSyncEntityForInteractionToPositionOnUse = "interact/rune/use_sync";
			firstPersonSyncAnimWebPath = "animweb/interact/rune/use_sync/use_sync/interact";
		}
		userMustBeInTouchTrigger = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
	}
}
}
```

### Praetor Suit Token

```
entity {
	entityDef game_progress_praetor_token_1 {
	inherit = "progress/praetor_token";
	class = "idInteractable_GiveItems";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		soundOffset = {
			z = 2;
		}
		saveType = "SGS_GAME_DATA";
		automapPropertiesDecl = "praetor_token";
		renderModelInfo = {
			model = "md6def/objects/interact/praetor_suit_token/praetor_suit_token.md6";
			lightRigDecl = "soldier_blaster/soldier_blaster_default";
			materialRemap = {
				num = 6;
				item[0] = {
					from = "models/characters/sentinel_knight/sentinel_knight_arm_right";
					to = "models/characters/sentinel_knight/ghost/sentinel_knight_arm_right";
				}
				item[1] = {
					from = "models/characters/sentinel_knight/sentinel_knight_base";
					to = "models/characters/sentinel_knight/ghost/sentinel_knight_base";
				}
				item[2] = {
					from = "models/characters/sentinel_knight/sentinel_knight_base_arm";
					to = "models/characters/sentinel_knight/ghost/sentinel_knight_base_arm";
				}
				item[3] = {
					from = "models/characters/sentinel_knight/sentinel_knight_helmet";
					to = "models/characters/sentinel_knight/ghost/sentinel_knight_helmet";
				}
				item[4] = {
					from = "models/characters/sentinel_knight/sentinel_knight_leg_right";
					to = "models/characters/sentinel_knight/ghost/sentinel_knight_leg_right";
				}
				item[5] = {
					from = "models/characters/sentinel_knight/sentinel_knight_torso";
					to = "models/characters/sentinel_knight/ghost/sentinel_knight_torso";
				}
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_CONE";
			size = {
				x = 1.5;
				y = 1.5;
				z = 3;
			}
			numSides = 8;
		}
		dormancy = {
			playerDistance = 20;
			playerRearwardDistance = 30;
			allowDistanceDormancy = false;
			allowDormancy = false;
			allowPvsDormancy = false;
		}
		fxDecl = "gameplay/praetor_token_interact";
		interaction = {
			initalState = "interactables/progress/praetor/idle_praetor";
			animWebDecl = "animweb/interact/preator_suit_token/preator_suit_token_interact";
			interactionGraph = "interactables/progress";
			stateData = {
				num = 3;
				item[0] = {
					stateName = "interactables/progress/praetor/activate_praetor";
				}
				item[1] = {
					stateName = "interactables/progress/praetor/idle_praetor";
					playSoundOnEnter = "play_praetorsuittoken_loop";
				}
				item[2] = {
					stateName = "interactables/progress/praetor/used_praetor";
					stateStats = {
						num = 1;
						item[0] = {
							stat = "STAT_GAINED_FIRST_PRAETOR_TOKEN";
						}
					}
					removeCollisionOnEnter = true;
					hideMeshOnEnter = {
						num = 1;
						item[0] = "coin";
					}
				}
			}
			transitionData = {
				num = 1;
				item[0] = {
					transitionName = "usable_praetor_To_used_praetor";
					playSoundOnTransition = "stop_praetorsuittoken_loop";
				}
			}
		}
		touchData = {
			triggerDef = "trigger/interact/use_panel";
		}
		activateTargetsOnUse = false;
		onUseCodexEntry = "codex/tutorials/praetor_suit_perks";
		stateColors = {
			num = 1;
			item[0] = {
				materialSwapList = {
					num = 6;
					item[0] = {
						from = "models/characters/sentinel_knight/ghost/sentinel_knight_arm_right";
						to = "models/characters/sentinel_knight/ghost/sentinel_knight_arm_right_used";
					}
					item[1] = {
						from = "models/characters/sentinel_knight/ghost/sentinel_knight_base";
						to = "models/characters/sentinel_knight/ghost/sentinel_knight_base_used";
					}
					item[2] = {
						from = "models/characters/sentinel_knight/ghost/sentinel_knight_base_arm";
						to = "models/characters/sentinel_knight/ghost/sentinel_knight_base_arm_used";
					}
					item[3] = {
						from = "models/characters/sentinel_knight/ghost/sentinel_knight_helmet";
						to = "models/characters/sentinel_knight/ghost/sentinel_knight_helmet_used";
					}
					item[4] = {
						from = "models/characters/sentinel_knight/ghost/sentinel_knight_leg_right";
						to = "models/characters/sentinel_knight/ghost/sentinel_knight_leg_right_used";
					}
					item[5] = {
						from = "models/characters/sentinel_knight/ghost/sentinel_knight_torso";
						to = "models/characters/sentinel_knight/ghost/sentinel_knight_torso_used";
					}
				}
				state = "used_praetor";
			}
		}
		activateTargetsOnEndInteraction = true;
		progressionCategory = "PROGRESSION_CATEGORY_ELITE";
		useStat = "STAT_SUIT_PAGE_UNLOCKED";
		removeForMasterLevels = true;
		thirdPersonInteractionData = {
			thirdPersonInteractionType = "PLAYER_MECHANIC_THIRD_PERSON_INTERACT_TYPE_GENERIC";
		}
		userMustBeInTouchTrigger = true;
		currencyList = {
			num = 1;
			item[0] = {
				currencyType = "CURRENCY_PRAETOR_UPGRADE";
			}
		}
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
	}
}
}
```

### Argent Cell Crystal &amp; Top Destructible

```
entity {
	entityDef game_progress_argent_cell_1 {
	inherit = "progress/argent_cell";
	class = "idInteractable_WorldCache";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		saveType = "SGS_GAME_DATA";
		automapPropertiesDecl = "argent_cell";
		renderModelInfo = {
			model = "md6def/objects/interact/argent_cell/argent_cell.md6";
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			contentsFilter = {
				monsterClip = false;
				moveableClip = false;
				shotClip = false;
				ikClip = false;
				opaqueClip = false;
				allTeamsShotClip = false;
			}
			size = {
				x = 1.25;
				y = 1.75;
				z = 2;
			}
			numSides = 8;
		}
		dormancy = {
			delay = 0;
			distance = 100;
			playerDistance = 120;
			playerRearwardDistance = 80;
			allowPvsDormancy = false;
		}
		fxDecl = "interact/argentcell/argent_cell_fx";
		interaction = {
			initalState = "interactables/progress/argent_cell/idle_argent";
			unuseableState = "interactables/progress/argent_cell/used_argent";
			animWebDecl = "animweb/interact/argent_cell/argent_cell_interact";
			interactionGraph = "interactables/progress";
			stateData = {
				num = 3;
				item[0] = {
					stateName = "interactables/progress/argent_cell/activate_argent";
					hideMeshOnEnter = {
						num = 1;
						item[0] = "destroyed__2_";
					}
				}
				item[1] = {
					stateName = "interactables/progress/argent_cell/idle_argent";
					hideMeshOnEnter = {
						num = 1;
						item[0] = "destroyed__2_";
					}
				}
				item[2] = {
					stateName = "interactables/progress/argent_cell/used_argent";
					onEnterCodexEntry = "codex/tutorials/argent_cell";
					markForGameUsed = true;
					hideMeshOnEnter = {
						num = 1;
						item[0] = "crystal__2_";
					}
					stateActivateList = {
						num = 1;
						item[0] = "game_destructible_interact_argent_cell_1_1313774949";
					}
				}
			}
		}
		touchData = {
			triggerDef = "trigger/interact/use_panel";
			triggerDefOffset = {
				x = 0.25;
			}
		}
		activateTargetsOnUse = false;
		stateColors = {
			num = 1;
			item[0] = {
				materialSwapList = {
					num = 4;
					item[0] = {
						from = "art/kit/sentinel/prop/argent_cell_bottom";
						to = "art/kit/sentinel/prop/argent_cell_bottom_used";
					}
					item[1] = {
						from = "art/kit/sentinel/prop/argent_cell_destroyed";
						to = "art/kit/sentinel/prop/argent_cell_destroyed_used";
					}
					item[2] = {
						from = "art/kit/sentinel/prop/argent_cell_bottom_secretpath";
						to = "art/kit/sentinel/prop/argent_cell_bottom_used";
					}
					item[3] = {
						from = "art/kit/sentinel/prop/argent_cell_destroyed_secretpath";
						to = "art/kit/sentinel/prop/argent_cell_destroyed_used";
					}
				}
				state = "used_argent";
			}
		}
		progressionCategory = "PROGRESSION_CATEGORY_ARGENT";
		useStat = "STAT_PROG_AMMO_HEALTH_ARMOR";
		removeForMasterLevels = true;
		secretMaterial = "art/objects/progression/temp_progression_items_secret";
		thirdPersonInteractionData = {
			thirdPersonInteractionType = "PLAYER_MECHANIC_THIRD_PERSON_INTERACT_TYPE_SENTINEL_CRYSTAL";
			thirdPersonSyncEntityForInteractionStartPositionOnUse = "interact/argent_cell/argent_cell_sync_3p";
			thirdPersonSyncAnimWebPathForStartPositionOnUse = "animweb/interact/argent_cell/argent_cell_3p/use_sync/interact";
		}
		userMustBeInTouchTrigger = true;
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = -1;
					z = 0;
				}
				mat[1] = {
					x = 1;
					y = 0;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 1;
				}
			}
		}
		targets = {
			num = 1;
			item[0] = "game_destructible_interact_argent_cell_1"; // removes the top part of the model
		}
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
	}
}
}

```

```
entity {
	entityDef game_destructible_interact_argent_cell_1 {
	inherit = "destructible/interact/argent_cell";
	class = "idDestructible";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		whenToSave = "SGT_NORMAL";
		flags = {
			skipRenderModelReplication = true;
		}
		saveType = "SGS_GAME_DATA";
		renderModelInfo = {
			model = "art/kit/sentinel/prop/argent_cell_top.lwo";
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		clipModelInfo = {
			contentsFilter = {
				playerClip = false;
				monsterClip = false;
				ikClip = false;
				opaqueClip = false;
				allTeamsShotClip = false;
			}
			size = {
				x = 1;
				y = 1;
				z = 1;
			}
			offset = {
				z = 1.25;
			}
			numSides = 6;
		}
		destructible = {
			decl = "destructible/interact/argent_cell";
			idleCommands = {
				num = 1;
				item[0] = {
					time = 10000;
					command = "IDLE_COMMAND_BECOME_STATIC";
				}
			}
		}
		effectiveDamageTypes = {
			num = 1;
			item[0] = "damage/special/no_damage";
		}
		demonPlayersPassThrough = false;
		removeForMasterLevels = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 1;
				}
			}
		}
	}
}
}
```

# idMover

<p class="callout info">An entity that can move around on pre-programmed paths, and also scripted to move around from timelines.</p>

<p class="callout warning">**Note:** This page was originally written by Chrispy. It was recovered from the now-deleted idTech 7 wiki, and copied here for preservation. This information may be incomplete and needs further details to expand upon it.</p>

## idMover Entity

Most of the things you see in the game that are moving are `idMovers`, except for ai, physics props, and a group of entity types may also move (`idFuncSwing`, `idFuncRotate`, etc) but in very limited ways.

Movers, like all entities, can have an arbitrary `collisionmodel` / `rendermodel`, or none at all. They can be used along with binding and the scripted movement events (`moveTo`) to create complex moving objects.

Within Movers you may define a scripted sequence of movements that will be executed when the mover is activated by another entity, or may activate immediately on spawn. The sequence can happen once, or loop.

**Things you can do with** `idMover` **include:**

1. `offsetOrientation` - Rotate by Angles (roll, pitch,yaw)
2. `offsetDestination` - Move by offset (X Y Z units from current position)
3. `destinationEntity`(sp?) - Move to an entities current position.
4. Activate a list of entities when a scripted movement starts, or ends.

# idMusicEntity

<p class="callout info">Music Entities are used to play music in the level.</p>

### Usage

```
entity {
	entityDef sound_sound_musicentity_1 {
	inherit = "sound/musicentity";
	class = "idMusicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		initialState = "music_ghost_states/main_ambient"; // music state when level first loads
		initialSwitchGroup = "music_ghost_switch";
		initialSwitchState = "intro_music"; // level music
	}
}
}
```

&gt; This Music Entity will play ambient music from Hell on Earth.

---

Not all Music Entities are structured the exact same way.  
<span style="text-decoration: underline;">The music for **Super Gore Nest**, **Mars Core**, and the **Hub** have their usage shown below:</span>

```
entity {
	entityDef sound_sound_musicentity_2 {
	inherit = "sound/musicentity";
	class = "idMusicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		initialState = "music_ghost_states/main_ambient"; // music state when level first loads
		initialSwitchGroup = "music_ghost_switch";
		initialSwitchState = "supergorenest_music"; // level music
		secondarySwitchGroup = "supergorenest_music"; // should be the same as above
		initialSecondarySwitchState = "sgn_combat_suite_1"; // music variant
	}
}
}
```

&gt; This Music Entity will play ambient music from Super Gore Nest's first music variation.

### Notes:

The .entities file will play the bottom-most Music Entity when loading the level.  
Use the [setMusicState](https://wiki.eternalmods.com/books/entities-custom-encounters/page/setmusicstate) Event Call to shift the music to its ghost states (ambient, light, heavy, etc).  
You can activate different music in the same level through [activateTarget](https://wiki.eternalmods.com/books/entities-custom-encounters/page/activatetarget).

### Music States Per Level:

<span style="text-decoration: underline;">**Hell on Earth:**</span>  
Switch State: `intro_music`  
Ghost States: `main_ambient, main_light, main_heavy, additional_reveal, cine_1, cine_2, cine_3`

<span style="text-decoration: underline;">**Exultia/Taras Nabad:**  
</span>Switch State: `slayer_city_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, cine_4`

<span style="text-decoration: underline;">**Cultist Base:**  
</span>Switch State: `cultist_base_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2`

<span style="text-decoration: underline;">**Doom Hunter Base:**  
</span>Switch State: `doom_hunter_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, boss_phase1, boss_phase2, boss_vulnerable, cine_boss_intro, cine_boss_end`

<span style="text-decoration: underline;">**Super Gore Nest 1:**  
</span>Switch State: `supergorenest_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2`  
Secondary Switch: `sgn_combat_suite_1`

<span style="text-decoration: underline;">**Super Gore Nest 2:**  
</span>Switch State: `supergorenest_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2`  
Secondary Switch: `sgn_combat_suite_2`

<span style="text-decoration: underline;">**ARC Complex:**  
</span>Switch State: `samuelsbase_music`  
Ghost States: `main_ambient, main_light, main_heavy`

<span style="text-decoration: underline;">**Phobos:**  
</span>Switch State: `mars_core_music`  
Ghost States: `main_ambient, main_light, main_heavy, alt_ambient, alt_light, alt_heavy, cine_1, level_marscore_baron, escape_pod`  
Secondary Switch: `phobos`

<span style="text-decoration: underline;">**Mars Core:**  
</span>Switch State: `mars_core_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, level_marscore_painelemental, stinger`  
Secondary Switch: `space`

<span style="text-decoration: underline;">**Sentinel Prime:**  
</span>Switch State: `gladiator_music`  
Ghost States: `cine_1, cine_2, cine_3, cine_4, boss_phase1, boss_phase2, boss_vulnerable, boss_end, additional_reveal, additional_levelstart`

<span style="text-decoration: underline;">**Nekravol:**  
</span>Switch State: `metal_hell_music`  
Ghost States: `main_ambient, main_light, main_heavy`

<span style="text-decoration: underline;">**Urdak:**  
</span>Switch State: `maykr_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, cine_4, boss_phase1, boss_phase2, boss_vulnerable, additional_reveal, additional_levelstart`

<span style="text-decoration: underline;">**Final Sin:**  
</span>Switch State: `icon_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, boss_phase1, boss_phase2, boss_vulnerable, boss_end, credits_start, credits_end`

**<span style="text-decoration: underline;">UAC Atlantica Facility:  
</span>**Switch State: `dlc1_oil_rig`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, cine_6, stinger`

<span style="text-decoration: underline;">**The Blood Swamps:**  
</span>Switch State: `dlc1_hell_swamp_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, boss_phase1, boss_phase2`

<span style="text-decoration: underline;">**The Holt:**  
</span>Switch State: `dlc1_maykr_city_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_3, cine_boss_intro, boss_phase1, boss_phase2, boss_phase3, boss_vulnerable, boss_end, credits_end`

<span style="text-decoration: underline;">**The World Spear:**  
</span>Switch State: `dlc_2_spear`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, additional_levelstart, stinger`

<span style="text-decoration: underline;">**Reclaimed Earth:**  
</span>Switch State: `dlc2_overgrown_earth_music`  
Ghost States: `main_ambient, main_light, main_heavy`

<span style="text-decoration: underline;">**Immora/The Dark Lord:**  
</span>Switch State: `dlc2_tech_hell_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, boss_phase1, boss_phase2, boss_phase3, boss_end, credits_start`

<span style="text-decoration: underline;">**Hub/BFG Division:**  
</span>Switch State: `hub_music`  
Ghost States: `main_ambient, main_light, main_heavy, cine_1, cine_2`  
Secondary Switch: `hub`

<span style="text-decoration: underline;">**Blood Harvester: (unused track)**  
</span>Switch State: `bloodharvester_music`  
Ghost States: `main_ambient, main_light`

<span style="text-decoration: underline;">**BATTLEMODE Music: (pvp)** </span>Switch State: `pvp`  
Ghost States: `main_ambient, pvp_lobby, pvp_lobby_end, pvp_lobby_player_ready, pvp_lose, pvp_win, pvp_sudden_death`

<span style="text-decoration: underline;">**Classic Music: (in Slayer Tutorial)** </span>Switch State: `tutorial_switch`  
Ghost States: `main_ambient`

# idParticleEmitter

<p class="callout info">An entity that emits particles.</p>

## Usage

```
entity {
	entityDef example_particle_emitter {
	inherit = "func/emitter";
	class = "idParticleEmitter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		dormancy = {
			delay = 5;
			distance = 78.029007;
		}
		fadeIn = 0;
		fadeOut = 0;
		startOff = true;
		spawnPosition = { // Be sure to set its spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = { // Size and color of the particle
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
			color = {
				r = 1;
				g = 1;
				b = 1;
			}
			emissiveColor = {
				r = 1;
				g = 1;
				b = 1;
			}
			emissiveScale = 1;
		}
		particleSystem = ""; // Particle model
	}
}
}
```

## Example

This example emits lightning on the ground. It would normally be used for electric floor hazards and would have a hurt trigger to go with it.

```
entity {
	entityDef example_electric_floor {
	inherit = "func/emitter";
	class = "idParticleEmitter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		dormancy = {
			delay = 5;
			distance = 78.029007;
		}
		fadeIn = 0;
		fadeOut = 0;
		startOff = true;
		spawnPosition = { // Be sure to set its spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			scale = {
				x = 1.3;
				y = 1.3;
				z = 1.3;
			}
			color = {
				r = 0.0549019873;
				g = 0.349020004;
				b = 0.690195978;
			}
			emissiveColor = {
				r = 0.082352899;
				g = 0.50980401;
			}
			emissiveScale = 4;
		}
		particleSystem = "map_e1m2_battle/lightning_water_crossroads2";
	}
}
}
```

## See Also

[idEnvironmentalDamage\_Hurt\_Trigger](https://wiki.eternalmods.com/books/5-level-modding/page/idenvironmentaldamage-hurt-trigger)

# idPlayerStart

<p class="callout info">An entity that defines the spawn position for players.</p>

### Single Player

```
entity {
	entityDef initial_player_start_1 {
	class = "idPlayerStart";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
        targets = {
			num = 1;
			item[0] = "some_post_checkpoint_relay"; // optional, trigger these entities when a checkpoint using this spawn is loaded.
		}

	}
}
}
```

### Multiplayer - Slayer

```
entity {
	entityDef game_online_battle_arena_player_start_1 {
	class = "idPlayerStart";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		team = "TEAM_ONE";
        respawnOnly = false; // can slayer players respawn in this location
	}
}
}

```

### Multiplayer - Demon

```
entity {
	entityDef game_online_battle_arena_demon_start_1 {
	class = "idDemonPlayerStart";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		team = "TEAM_TWO";
		respawnOnly = false; // can demon players respawn in this location
	}
}
}
```

# idProp2

<p class="callout info">An entity that will spawn a pickup or barrel.</p>

### Health

```
entity {
	entityDef pickups_pickup_health_large_1 {
	inherit = "pickup/health/large";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		renderModelInfo = {
			model = "art/pickups/health/health_pack_big_a.lwo";
			contributesToLightProbeGen = false;
			ignoreDesaturate = true;
			emissiveScale = 0.5;
			scale = {
				x = 1.75;
				y = 1.75;
				z = 1.75;
			}
		}
		spawn_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_ITEMS_SPAWNED";
				increase = 1;
			}
		}
		equipOnPickup = true;
		lootStyle = "LOOT_TOUCH";
		triggerDef = "trigger/props/pickup";
		isStatic = true;
		canBePossessed = true;
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		difficultyScaleType = "DST_PICKUP";
		pickup_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_HEALTH_PICKUP";
				increase = 1;
			}
		}
		useableComponentDecl = "health/sp_health_large";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		dormancy = {
			playerDistance = 20;
			playerRearwardDistance = 20;
		}
	}
}
}
```

### Armor

```
entity {
	entityDef pickups_pickup_armor_large_1 {
	inherit = "pickup/armor/large";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		renderModelInfo = {
			model = "art/pickups/armor/pickup_armor_01.lwo";
			contributesToLightProbeGen = false;
			ignoreDesaturate = true;
			scale = {
				x = 2;
				y = 2;
				z = 2;
			}
			emissiveScale = 0.5;
		}
		spawn_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_ITEMS_SPAWNED";
				increase = 1;
			}
		}
		equipOnPickup = true;
		lootStyle = "LOOT_TOUCH";
		triggerDef = "trigger/props/armor_large";
		isStatic = true;
		canBePossessed = true;
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		difficultyScaleType = "DST_PICKUP";
		pickup_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_ARMOR_PICKUP";
				increase = 1;
			}
		}
		useableComponentDecl = "armor/sp_armor_50";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		dormancy = {
			playerDistance = 20;
			playerRearwardDistance = 20;
		}
	}
}
}
```

### Ammo

```
entity {
	entityDef pickups_pickup_ammo_shells_1 {
	inherit = "pickup/ammo/shells";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		renderModelInfo = {
			model = "art/pickups/ammo/ammo_shotgun_01.lwo";
			contributesToLightProbeGen = false;
			ignoreDesaturate = true;
			emissiveScale = 0.2;
			scale = {
				x = 1.39999998;
				y = 1.39999998;
				z = 1.39999998;
			}
		}
		spawn_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_ITEMS_SPAWNED";
				increase = 1;
			}
		}
		equipOnPickup = false;
		lootStyle = "LOOT_TOUCH";
		triggerDef = "trigger/props/pickup";
		isStatic = false;
		canBePossessed = true;
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		flags = {
			canBecomeDormant = true;
		}
		fxDecl = "pickups/ammo_shotgun";
		difficultyScaleType = "DST_PICKUP";
		updateFX = true;
		pickup_statIncreases = {
			num = 2;
			item[0] = {
				stat = "STAT_AMMO_PICKUP";
				increase = 1;
			}
			item[1] = {
				stat = "STAT_PLACED_AMMO_PICKUP";
				increase = 1;
			}
		}
		useableComponentDecl = "propitem/ammo/shotgun_10";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		dormancy = {
			playerDistance = 20;
			playerRearwardDistance = 20;
		}
	}
}
}
```

### Extra Life

```
entity {
	layers {
		"game/sp/extralives/extralives_many" // the layer prevents it from spawning in Ultra Nightmare difficulty
	}
	entityDef pickups_pickup_extra_life_extra_life_1 {
	inherit = "pickup/extra_life/extra_life_1";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		whenToSave = "SGT_NORMAL";
		saveType = "SGS_GAME_DATA";
		removeFlag = "RMV_IMMEDIATE_ALLOW_MS";
		automapPropertiesDecl = "extra_life";
		renderModelInfo = {
			model = "art/pickups/extraLife.lwo";
			contributesToLightProbeGen = false;
			ignoreDesaturate = true;
			scale = {
				x = 1.75;
				y = 1.75;
				z = 1.75;
			}
			emissiveColor = {
				r = 0;
				b = 0.68235302;
			}
			emissiveScale = 1;
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
		}
		fxDecl = "pickups/ammo_extralife";
		physicsAttributes = "lootdrop/health";
		useableComponentDecl = "sp_extra_life_1";
		thinkComponentDecl = "bobthink";
		triggerDef = "trigger/props/pickup_large";
		updateFX = true;
		canBePossessed = true;
		sendNotableItemTelemetryEvent = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		flags = {
			canBecomeDormant = true;
			forcePhysicsUpdate = true;
			forceFXThink = true;
		}
		bindInfo = {
			bindParent = "movers_func_mover_1"; // bind it to an idMover
			bindOriented = true;
			lockLocalOffset = true;
		}
		dormancy = {
			playerDistance = 30;
			playerRearwardDistance = 30;
		}
	}
}
}
```

### Barrel

```
entity {
	entityDef game_envhazard_barrels_red_1 {
	inherit = "envhazard/barrels/red";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		flags = {
			forcePhysicsUpdate = true;
			takedamage = true;
		}
		renderModelInfo = {
			model = "art/breakable/barrel/barrel_explode_a.lwo";
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			contentsFilter = {
				playerClip = false;
			}
			numSides = 10;
		}
		networkSerializeTransforms = true;
		killerNames = {
			num = 1;
			item[0] = "#str_decl_damage_hazard_explosive_barrel_GHOST53200";
		}
		fxDecl = "breakable/barrel_01";
		physicsAttributes = "barrels";
		isStatic = false;
		damageComponentDecl = "barrel/default";
		lootDrop = {
			lootDropDataDecl = "barrels/rune";
		}
		canBePossessed = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
	}
}
}
```

### Key Card

```
entity {
	entityDef pickups_keycard_uac_red_1 {
	inherit = "pickup/keycard/uac_red";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		renderModelInfo = {
			model = "art/pickups/keycard_pickup_r.lwo";
			contributesToLightProbeGen = false;
			materialRemap = {
				num = 1;
				item[0] = {
					from = "art/pickups/keycard_r";
					to = "art/pickups/keycard_r_dlc";
				}
			}
			emissiveColor = {
				g = 0.0333333015;
				b = 0;
			}
		}
		spawn_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_ITEMS_SPAWNED";
				increase = 1;
			}
		}
		equipOnPickup = true;
		lootStyle = "LOOT_TOUCH";
		triggerDef = "trigger/props/progression_small";
		isStatic = true;
		canBePossessed = true;
		whenToSave = "SGT_CHECKPOINT";
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		flags = {
			canBecomeDormant = true;
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
		}
		useableComponentDecl = "propitem/keycard/uac_red";
		thinkComponentDecl = "bob_rotate";
		sendNotableItemTelemetryEvent = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		fxDecl = "dlc1/e4m1_rig/red_keycard";
	}
}
}
```

# idProp_Coop

<p class="callout info">An entity that can create a physical obstruction for all players.</p>

### Usage

```
entity {
	entityDef prop_barrier_1 {
	class = "idProp_Coop";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = -1;
					z = 0;
				}
				mat[1] = {
					x = 1;
					y = 0;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 1;
				}
			}
		}
		renderModelInfo = {
			model = "art/gameplay/gameplay_energyBarrier_a.lwo"; // render model can be set to "NULL" to create an invisible barrier
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		clipModelInfo = {
			clipModelName = NULL;
			type = "CLIPMODEL_BOX";
			size = {
				x = 1;
				y = 1;
				z = 1;
			}
			contentsFilter = {
				playerClip = false;
			}
			forceObstacle = true;
		}
		showOnStart = true;
		isSolid = true;
		forceContentSolidOnSpawn = true;
	}
}
}
```

# idSoundEntity

<p class="callout info">Sound entities are used to broadcast sounds to a player.</p>

### Usage

```
entity {
	entityDef sound_buffpod_1 {
	inherit = "sound/soundentity";
	class = "idSoundEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		temporarySoundEvent = true; // if true, the sound effect will only play for its duration
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		soundOcclusionBypass = true; // if true, the sound effect plays with no barrier obstruction
		startEvents = {
			num = 1;
			item[0] = "play_ui_empowered_demon_incoming"; // the sound that will play
		}
		stopEvents = {
			num = 1;
			item[0] = "play_ui_empowered_demon_incoming"; // the sound that will stop, this makes it repeatable
		}
	}
}
}
```

### See Also

- [idMusicEntity](https://wiki.eternalmods.com/books/5-level-modding/page/idmusicentity)

# idTarget_Command

<p class="callout info">An entity to trigger the specified console commands.</p>

## Usage

```
entity {
	entityDef example_target_command_eternal {
	class = "idTarget_Command";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		commandText = "give ammo; give armor; give health; judgementMeter_Set 3";
		spawnPosition = {
			x = 0;
			y = 0;
			z = 0;
		}
	}
}
}
```

# idTarget_Count

<p class="callout info">An entity that is commonly used for relays.</p>

As with most computing logic, relays wait for specified inputs before it can send its output.

## Usage

```
entity {
	entityDef example_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = { // Spawn position does not matter
			x = 1;
			y = 1;
			z = 1;
		}
		targets = { // Entities that activate once the relay outputs
			num = 1;
			item[0] = "example_entity";
		}
		repeat = true; // If the relay is repeatable
		count = 1; // How many inputs this relay needs to output
		delay = 1; // Activation delay in seconds
	}
}
}
```

<p class="callout info">Relays are useful if you want to activate several entities at once, give a delay before the entities activate, or have an entity require multiple inputs before activating.</p>

# idTarget_DevLoadoutSwap

<p class="callout info">An entity that replaces the Slayer's current loadout with something else.</p>

### Usage

```
entity {
    entityDef devinvloadout_swap_1 {
    class = "idTarget_DevLoadoutSwap";
    expandInheritance = false;
    poolCount = 0;
    poolGranularity = 2;
    networkReplicated = false;
    disableAIPooling = false;
    edit = {
        flags = {
            noFlood = true;
        }
        networkSerializeTransforms = false;
        spawnPosition = { // spawn position is not important
            x = 1;
            y = 1;
            z = 1;
        }
        newDevloadout = "devinvloadout/dlc/e5m1_spear"; // replace loadout with e5m1_spear
        clearPrevInventory = true; // remove current inventory before replacing
        count = 1; // only needs to execute once
    }
}
}
```

### See Also

- [DevInvLoadout Fundamentals](https://wiki.eternalmods.com/books/5-level-modding/page/devinvloadout-fundamentals)

# idTarget_EnableTarget

<p class="callout info">An entity that either exclusively enables targets, or exclusively disables them, in contrast to other entity types that tend to simply trigger or toggle their targets.</p>

```
entity {
	entityDef example_enable {
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		targets = {
			num = 1;
			item[0] = "exaple_target";
		}
	}
}
}
```

`enableFlag`:Defaults to true if omitted, set to false if you want to disable specified targets.

# idTarget_FirstThinkActivate

<p class="callout info">An entity that will execute on map load.</p>

### Usage

```
entity {
	entityDef first_think_activate_1 {
	class = "idTarget_FirstThinkActivate";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnPosition = { // spawn position is not important
			x = 1;
			y = 1;
			z = 1;
		}
		targets = { // triggers these entities on first map load
			num = 1;
			item[0] = "sample_relay_1";
		}
	}
}
}
```

# idTarget_LayerStateChange

<p class="callout info">An entity that can save the player's progress as a checkpoint and-as its name implies-manipulate layers.</p>

### Checkpoint

```
entity {
	entityDef checkpoint_target_change_layer_1 {
	class = "idTarget_LayerStateChange";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		activate_NextMapLoad = {
			num = 1;
			item[0] = "game/sp/e1m1_intro/cp_01";
		}
		checkpointName = "cp_01";
		playerSpawnSpot = "checkpoint_player_start_cp_01";
		saveCheckpoint = true;
	}
}
}
```

### Checkpoint parameters

`checkpointName`: Define a checkpoint name.

<p class="callout warning">If you attempt to load a save when no layer state change entity with `checkpointName` set to the value the game is expecting, it will crash to the desktop. If meathook is installed, a message box will appear telling you the missing checkpoint.</p>

`playerSpawnSpot`: the `idPlayerStart` entity the player will spawn at when loading the checkpoint.

`saveCheckpoint`: whether or not to save a checkpoint. Defaults to true, so if you only want to manipulate layers when activated, then explicitly set this to false.

### Layer Manipulation

<p class="callout info">Entities will only react to state changes applied to its first layer. You may notice entities in vanilla levels with multiple layers; this is pointless.</p>

<p class="callout success">All layers in the game can be used in all levels.</p>

`activate_NextMapLoad`: Wait until the player loads the checkpoint to activate this layer. This is typically used to activate checkpoint layers that are placed on idTarget\_FirstThinkActivate entities that set the map up as if the player had progressed through it when a checkpoint is loaded.

`activate_Immediately`: Spawn all entities attached to the layers specified right away.

`remove_Immediately`: Completely remove any entities attached to these layers from the map.

<p class="callout warning">These options are used to hide and show parts of the map as the player progresses through it for optimization. Improperly handling these layers can cause visual bugs, or degraded graphical performance. Usage is recommended only for advanced modders that are certain they have a specific reason to do so. (for example, you intend the player to progress through the map backwards what is traditionally expected)</p>

`hideRenderModels_Immediately`: Make all entities and map geometry with these layers visible.

`showRenderModels_Immediately`: Make all entities and map geometry with these layers invisible.

`dormant_Immediately`: Suspends entities with these layers, meaning they don't have an effect on the world, player, and so on.

`awake_Immediately`: Resumes entities with these layers.

"NextMapLoad" variants of all layer state changes exist, however they are unused, with the exception of the aforementioned activate\_NextMapLoad.

### idTrigger\_VisibilityController

For optimization, visibility controller entities activate layer changes as the player traverses the map. You probably should not touch these, this is listed here for completeness in the unlikely event you need to edit one.

```
entity {
	entityDef visibility_trigger_visibility_controller_trigger_34 {
	inherit = "trigger/visibility_controller_trigger";
	class = "idTrigger_VisibilityController";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		demonPlayerCanActivate = true;
		playerCanActivate = true;
		onlyLocalPlayerCanActivate = true;
		spawnPosition = {
			x = -15;
			y = 295;
			z = 15;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = "maps/game/sp/e3m1_slayer/e3m1_slayer/visibility_trigger_visibility_controller_trigger_34";
		}
		onActivateLayerChangeTarget = "visibility_target_change_layer_1_zone15_on";
	}
}
}
```

# idTarget_Notification

<p class="callout info">An entity that creates a notification on player's screen when triggered.</p>

## Usage

```JavaScript
entity {
	entityDef example_notification {
	class = "idTarget_Notification";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnPosition = {
			x = 0;
			y = 0;
			z = 0;
		}
		notificationType = "HUD_EVENT_PLAYER_NOTIFICATION"; // from list below or notificationType from generated/decls/notification/hud
		header = "#str_swf_notification_secret_found"; // headerText from generated/decls/notification/hud
		subtext = "#str_decl_callout_suit_sentinel_training_unlocked_GHOST82861"; // subText from generated/decls/notification/hud
		icon = "art/ui/dossier/icons/ico_extra_life_3up_on"; // icon from generated/decls/notification/hud
	}
}
}
```

### notificationType list

```
HUD_NOTIFY_OBJECTIVE_UPDATE
HUD_NOTIFY_OBJECTIVE_COMPLETE
HUD_NOTIFY_OBJECTIVE_REPLACE
HUD_NOTIFY_OBJECTIVE_SHOW_LAST
HUD_NOTIFY_OBJECTIVE_PIN
HUD_NOTIFY_CODEX_RECIEVED
HUD_NOTIFY_CODEX_UPDATED
HUD_NOTIFY_INVENTORY_ACQUIRED
HUD_NOTIFY_RUNE_ACQUIRED
HUD_NOTIFY_RUNE_UPGRADE_TOKEN_ACQUIRED
HUD_NOTIFY_MOD_ACQUIRED
HUD_NOTIFY_PRAETOR_ACQUIRED
HUD_NOTIFY_SENTINEL_BATTERY_ACQUIRED
HUD_NOTIFY_EQUIPMENT_ACQUIRED
HUD_NOTIFY_ARGENTUPGRADE_ACQUIRED
HUD_NOTIFY_COLLECTIBLE_ACQUIRED
HUD_NOTIFY_FAST_TRAVEL_UNLOCKED
HUD_NOTIFY_CHECKPOINT
HUD_NOTIFY_GENERIC_CALLOUT
HUD_NOTIFY_ROUND_TIMER_CALLOUT
HUD_NOTIFY_ROUND_NUMBER_CALLOUT
HUD_NOTIFY_ROUND_LOSE_CALLOUT
HUD_NOTIFY_ROUND_WIN_CALLOUT
HUD_NOTIFY_ROUND_START_CALLOUT
HUD_NOTIFY_ENEMY_USED_CARD_CALLOUT
HUD_NOTIFY_ALLY_USED_CARD_CALLOUT
HUD_NOTIFY_MATCH_VICTORY_CALLOUT
HUD_NOTIFY_MATCH_DEFEAT_CALLOUT
HUD_NOTIFY_INVASION_CALLOUT
HUD_NOTIFY_INVASION_INCOMING
HUD_NOTIFY_CALLOUT_STATUS_TIMER
HUD_NOTIFY_CALLOUT_MAJOR_TIMER
HUD_NOTIFY_CALLOUT_MAJOR_ICON
HUD_NOTIFY_CALLOUT_INVASION_ICON
HUD_NOTIFY_SENTINEL_ARMOR_ACTIVATED
HUD_NOTIFY_SENTINEL_ARMOR_DEACTIVATED
HUD_NOTIFY_EXTRA_LIFE_ACTIVATED
HUD_NOTIFY_EXTRA_LIFE_ACQUIRED
HUD_NOTIFY_EXTRA_LIFE_ACQUIRED_2
HUD_NOTIFY_EXTRA_LIFE_ACQUIRED_3
HUD_NOTIFY_EXTRA_LIFE_MAXED
HUD_NOTIFY_CHEAT_CODE_ACQUIRED
HUD_NOTIFY_GAME_HINT
HUD_NOTIFY_SECRET_HINT
HUD_NOTIFY_SECRET_FOUND
HUD_NOTIFY_SECRET_ENCOUNTER_FOUND
HUD_NOTIFY_SECRET_ENCOUNTER_FAILED
HUD_NOTIFY_SECRET_ENCOUNTER_COMPLETE
HUD_NOTIFY_COMBAT_POINT
HUD_NOTIFY_WEAPON_MASTERY_ACQUIRED
HUD_NOTIFY_BOUNTY_COMPLETE
HUD_NOTIFY_BOUNTY_ACTIVE
HUD_NOTIFY_KEYCARD
HUD_NOTIFY_SLAYER_KEY
HUD_NOTIFY_SLAYER_GATE
HUD_NOTIFY_SLAYER_GATE_E3
HUD_NOTIFY_SLAYER_ENCOUNTER
HUD_NOTIFY_SLAYER_ENCOUNTER_NO_POINTS
HUD_NOTIFY_MISSION_CHALLENGE_INTRO
HUD_NOTIFY_MISSION_CHALLENGE_UPDATE
HUD_NOTIFY_MISSION_CHALLENGE_COMPLETE
HUD_NOTIFY_WEAPON_MASTERY_UPDATE
HUD_NOTIFY_WEAPON_MASTERY_COMPLETE
HUD_NOTIFY_WEAPON_BROKEN
HUD_NOTIFY_DOOM_EVENT_BOSS_COMPLETE
HUD_NOTIFY_DOOM_EVENT_MISSION_COMPLETE
HUD_NOTIFY_DOOM_EVENT_MASTER_LEVEL_COMPLETE
HUD_NOTIFY_DOOM_EVENT_INVASION_COMPLETE
HUD_NOTIFY_DOOM_EVENT_PVP_MATCH_COMPLETE
HUD_NOTIFY_MILESTONE_COMPLETED
HUD_NOTIFY_MILESTONE_COMPLETED_SILENT
HUD_NOTIFY_LEVEL_UP
HUD_NOTIFY_SEASON_LEVEL_UP
HUD_NOTIFY_LATER_IN_THE_MISISON_E3
HUD_NOTIFY_BUFF_POD_NEARBY
HUD_NOTIFY_UPGRADE_REMINDER_PRAETOR
HUD_NOTIFY_DOOM_EVENT_SKYBOX_UNLOCK
HUD_NOTIFY_UPGRADE_PERK
HUD_NOTIFY_ARGENT_BONUS
HUD_NOTIFY_MOD_POINT_ACQUIRED
HUD_NOTIFY_MULTIPLE_MOD_POINT_ACQUIRED
HUD_NOTIFY_AUTOMAP_REVEALED
HUD_NOTIFY_GOLD_BOSS_START
HUD_NOTIFY_GOLD_BOSS_DEFEATED
HUD_NOTIFY_EXTRA_LIFE_ENCOUNTER_FOUND
HUD_NOTIFY_EXTRA_LIFE_ENCOUNTER_FAILED
HUD_NOTIFY_EXTRA_LIFE_ENCOUNTER_COMPLETE
HUD_NOTIFY_SECRET_ENCOUNTER_DLC_COMPLETE
HUD_NOTIFY_SECRET_ENCOUNTER_DLC_COMPLETE_SKIN_PROGRESS
HUD_NOTIFY_SECRET_ENCOUNTER_DLC_COMPLETE_SKIN_UNLOCK
HUD_NOTIFY_RUNE_CRYSTALS_ACQUIRED
HUD_NOTIFY_MASTER_LEVEL_START
HUD_NOTIFY_SUPPORT_RUNE_ACQUIRED
HUD_NOTIFY_SCREECHER_KILLED
HUD_NOTIFY_PLAYER_CURSED
HUD_NOTIFY_HORDE_ROUND_START
HUD_NOTIFY_HORDE_ROUND_END
HUD_NOTIFY_HORDE_WAVE_START
HUD_NOTIFY_HORDE_WAVE_END
HUD_NOTIFY_HORDE_BOUNTY_START
HUD_NOTIFY_HORDE_BOUNTY_COMPLETE
HUD_NOTIFY_HORDE_BOUNTY_FAILED
HUD_NOTIFY_HORDE_STATE_SHARE_COMPLETE
HUD_NOTIFY_HORDE_STATE_SHARE_FAILED
HUD_NOTIFY_MAX
```

<p class="callout warning">Not all notification types are working.</p>

# idTarget_Remove

<p class="callout info">An entity that will remove the listed entities when activated.</p>

## Usage

```
entity {
	entityDef example_target_remove_eternal {
	class = "idTarget_Remove";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnPosition = {
			x = 0;
			y = 0;
			z = 0;
		}
		targets = { // list of entities to remove
			num = 1;
			item[0] = "example_func_dynamic";
        }
	}
}
}
```

# idTarget_Hide

<p class="callout info">An entity that will hide the listed entities when activated.</p>

<p class="callout warning">Note that not all entities can be hidden.</p>

## Usage

```
entity {
	entityDef example_target_hide_eternal {
	class = "idTarget_Hide";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnPosition = {
			x = 5;
			y = -105;
			z = -15;
		}
		targets = { // list of entities to hide
			num = 1;
			item[0] = "example_proxy";
		}
		reuseable = true; // if false, this target will be single use
	}
}
}
```

## See Also

- [idTarget\_Show](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idtarget-show)

# idTarget_Show

<p class="callout info">An entity that will show the listed entities when activated.</p>

## Usage

```
entity {
	entityDef example_target_show_eternal {
	class = "idTarget_Show";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnPosition = {
			x = 13;
			y = -76;
			z = -5;
		}
		targets = {
			num = 1;
			item[0] = "func_dynamic_vista_example";
		}
		reuseable = true; // if false, this target will be single use
	}
}
}
```

## See Also

- [idTarget\_Hide](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idtarget-hide)

# idTarget_Spawn

<p class="callout info">An entity to spawn other entities. Primarily used for idAI2 entities.</p>

It should be noted that most of these parameters can be excluded unless needed. An **idTarget\_Spawn** can be simplified down to this, as an example, if all the player wishes to do is be able to spawn in demons with the teleport **anim/fx** and no other frills.

<p class="callout warning">When copying vanilla spawn targets (rather than from this wiki) you may notice the entities to be spawned listed redundantly in under both "EntityDefs" and "Targets". The EntityDefs list is what you want. "Targets" does not do what you expect; it deletes listed entities on map load. This is not typically an issue because listed entities are attached to the inactive spawn\_target\_layer and therefore not spawned in the map initially, but in rare cases where a level would be set up otherwise, listing a target may cause issues.</p>

## Usage

```INI
entity {
	entityDef example_target_spawn_eternal {
	inherit = "target/spawn";
	class = "idTarget_Spawn";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnConditions = {
			maxCount = 0;
			reuseDelaySec = 0;
			doBoundsTest = false;
			boundsTestType = "BOUNDSTEST_NONE";
			fovCheck = 0;
			minDistance = 0;
			maxDistance = 0;
			neighborSpawnerDistance = -1;
			LOS_Test = "LOS_NONE";
			playerToTest = "PLAYER_SP";
			conditionProxy = "";
		}
		spawnEditableShared = {
			groupName = "";
			deathTrigger = "";
			coverRadius = 0;
			maxEnemyCoverDistance = 0;
		}
		entityDefs = {
			num = 0;
		}
		conductorEntityAIType = "SPAWN_AI_TYPE_ANY";
		initialEntityDefs = {
			num = 0;
		}
		spawnEditable = {
			spawnAt = "";
			copyTargets = false;
			additionalTargets = {
				num = 0;
			}
			overwriteTraversalFlags = true;
			traversalClassFlags = "CLASS_A";
			combatHintClass = "CLASS_ALL";
			spawnAnim = "";
			aiStateOverride = "AIOVERRIDE_TELEPORT";
			initialTargetOverride = "";
		}
		portal = "";
		targetSpawnParent = "example_spawn_parent";
		disablePooling = false;
		spawnPosition = {
			x = 209.669998;
			y = -10.990000;
			z = -23.95;
		}
	}
}
}
```

Similarly, a spawn target can be simplified to the following example.

```INI
entity {
	entityDef ai_target_spawn_mod_1 {
	inherit = "target/spawn";
	class = "idTarget_Spawn";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		entityDefs = {
			num = 1;
			item[0] = {
				name = "example_ai_gargoyle_1";
			}
		}
		targetSpawnParent = "mod_master_spawn_parent";
		spawnEditable = {
			overwriteTraversalFlags = true;
			traversalClassFlags = "CLASS_A";
			combatHintClass = "CLASS_ALL";
			aiStateOverride = "AIOVERRIDE_TELEPORT";
		}
		spawnPosition = {
			x = 209.669998;
			y = -10.990000;
			z = -23.95;
		}
	}
}
}
```

Sometimes you might want an AI to spawn with an animation rather than through the generic teleportation effect.

This target spawn makes a Mancubus spawn in with its jump animation - like it is jumping from below a ledge.

```
entity {
	entityDef example_mancubus_traversal_spawn {
	inherit = "target/spawn";
	class = "idTarget_Spawn";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnConditions = {
			maxCount = 0;
			reuseDelaySec = 0;
			doBoundsTest = false;
			boundsTestType = "BOUNDSTEST_NONE";
			fovCheck = 0;
			minDistance = 0;
			maxDistance = 0;
			neighborSpawnerDistance = -1;
			LOS_Test = "LOS_NONE";
			playerToTest = "PLAYER_SP";
			conditionProxy = "";
		}
		spawnEditableShared = {
			groupName = "";
			deathTrigger = "";
			coverRadius = 0;
			maxEnemyCoverDistance = 0;
		}
		entityDefs = {
		num = 1;
		item[0] = {
			name = "example_ai_heavy_mancubus_fire"; // Can only spawn Mancubi
		}
}
		conductorEntityAIType = "SPAWN_AI_TYPE_ANY";
		initialEntityDefs = {
			num = 0;
		}
		spawnEditable = {
			spawnAt = "";
			copyTargets = false;
			additionalTargets = {
				num = 0;
			}
			overwriteTraversalFlags = true;
			traversalClassFlags = "CLASS_A";
			combatHintClass = "CLASS_ALL";
			spawnAnim = "animweb/characters/monsters/mancubus_fire/traversal/jump_forward_500_up_500"; // Animation to use
			aiStateOverride = "AIOVERRIDE_PLAY_ENTRANCE_ANIMATION"; // Sets to play into animation instead of teleport
			initialTargetOverride = "";
		}
		portal = "";
		targetSpawnParent = "";
		disablePooling = false;
		spawnPosition = { // Be sure to set spawn position to where the AI's start position will be
			x = -69.55;
			y = 395.78;
			z = 102.83;
		}
		spawnOrientation = { // Be sure to set the spawn rotation
			mat = {
				mat[0] = {
					x = 0.99994820356;
					y = -0.0052357506938;
				}
				mat[1] = {
					x = 0.0052359499969;
					y = 0.99998629093;
				}
			}
		}
	}
}
}
```

<p class="callout warning">The **spawnAnim** parameter varies in syntax based on what demon AI is being spawned.</p>

# idTarget_Spawn_Parent

<p class="callout info">An entity that **idTargetSpawnGroup** entities use to define what AI can spawn in its spawn group.</p>

## Usage

```
entity {
	entityDef example_target_spawn_group_parent {
	inherit = "encounter/spawn_group/parent";
	class = "idTarget_Spawn_Parent";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		spawnConditions = {
			maxCount = 0;
			reuseDelaySec = 0;
			doBoundsTest = false;
			boundsTestType = "BOUNDSTEST_NONE";
			fovCheck = 0;
			minDistance = 0;
			maxDistance = 0;
			neighborSpawnerDistance = -1;
			LOS_Test = "LOS_NONE";
			playerToTest = "PLAYER_SP";
			conditionProxy = "";
		}
		spawnEditableShared = {
			groupName = "";
			deathTrigger = "";
			coverRadius = 0;
			maxEnemyCoverDistance = 0;
		}
		entityDefs = { // List of demons that can be spawned
		num = 3;
		item[0] = {
			name = "game_ai_fodder_imp";
		}
		item[1] = {
			name = "game_ai_fodder_gargoyle";
		}
		item[2] = {
			name = "game_ai_fodder_soldier_blaster";
		}
}
		conductorEntityAIType = "SPAWN_AI_TYPE_ANY";
		initialEntityDefs = {
			num = 0;
		}
		spawnPosition = { // Spawn position does not matter
			x = 1;
			y = 1;
			z = 1;
		}
		targets = { // List of demons that can be spawned
			num = 3;
			item[0] = "game_ai_fodder_imp";
			item[1] = "game_ai_fodder_gargoyle";
			item[2] = "game_ai_fodder_soldier_blaster";
		}
	}
}
}
```

If the [**idTarget\_Spawn** ](https://wiki.eternalmods.com/books/5-level-modding/page/idtarget-spawn)entities in the [**idTargetSpawnGroup** ](https://wiki.eternalmods.com/books/5-level-modding/page/idtargetspawngroup)contains their own entityDefs, then those will override the spawn parent.

<p class="callout warning">You would normally want all **idTarget\_Spawn** entities in the **idTargetSpawnGroup** to have no idAI2 entities attached to them.</p>

<p class="callout info">For the sake of organization, you might want to only use one **idTarget\_Spawn\_Parent** that contains every demon **idAI2** for the entire level.</p>

# idTargetSpawnGroup

<p class="callout info">An entity used to group multiple idTarget\_Spawn entities.</p>

Target Spawn Groups are used for define what specific spawn positions can be used for eventCalls that spawn multiple AI at a time, such as: [spawnAI](https://wiki.eternalmods.com/books/5-level-modding/page/spawnai), [maintainAICount](https://wiki.eternalmods.com/books/5-level-modding/page/maintainaicount), [staggeredAISpawn](https://wiki.eternalmods.com/books/5-level-modding/page/staggeredaispawn), etc.

## Usage

```
entity {
	entityDef example_target_spawn_group {
	inherit = "encounter/spawn_group/zone";
	class = "idTargetSpawnGroup";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Spawn position does not matter
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = NULL;
		}
		spawners = { // List of idTarget_Spawns that the spawn group uses
			num = 3;
			item[0] = "example_target_spawn_1";
			item[1] = "example_target_spawn_2";
			item[2] = "example_target_spawn_3";
		}
		targetSpawnParent = "example_target_spawn_group_parent"; // Defines what AI can spawn in the group
	}
}
}
```

<p class="callout warning">**targetSpawnParent** is optional but it is an entity used to define what AI the spawners can use.  
However, if the **idTarget\_Spawn** contains their own entityDefs, then those will override the spawn parent.</p>

## See Also

- [idTarget\_Spawn](https://wiki.eternalmods.com/books/5-level-modding/page/idtarget-spawn)
- [idTarget\_Spawn\_Parent](https://wiki.eternalmods.com/books/5-level-modding/page/idtarget-spawn-parent)

# idTarget_Teleport

<p class="callout info">An entity to teleport the player to the specified location when used.</p>

## Usage

```
entity {
	entityDef example_target_teleport_eternal {
	class = "idTarget_Teleport";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 88.999733;
			y = -1079.00024;
			z = -83.75;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707106709;
					y = -0.707106829;
				}
				mat[1] = {
					x = 0.707106829;
					y = 0.707106709;
				}
			}
		}
		targetActivator = true;
	}
}
}
```

# idTrigger_Teleporter_Fade

<p class="callout info">The **idTrigger\_Teleporter\_Fade** entity defines the location where the player can teleport from with the fade effect.</p>

```
entity {
	entityDef trigger_teleport_fade_1 {
	inherit = "trigger/teleport_fade";
	class = "idTrigger_Teleporter_Fade";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		killerNames = {
			num = 1;
			item[0] = "#str_decl_damage_the_void_GHOST81052"; // damage name
		}
		demonPlayerCanActivate = true; // should a Demon player activate
		clientCanActivate = true;
		chooseAASDestination = false;
		conservePlayerSpeed = false;
		fadeOut = {
			fadeMS = 250; // fade out duration
			fadeSound = "play_stinger_falling_damage";
		}
		fadeIn = {
			fadeMS = 250; // fade in duration
		}
		fadeInDelayMS = 750;
		controlDelayMS = 250;
		damageDecl = "damage/triggerhurt/triggerhurt25"; // damage dealt
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = "maps/game/sp/e1m1_intro/e1m1_intro/trigger_teleport_fade_1";
		}
		dormancy = {
			allowDistanceDormancy = false;
			allowPvsDormancy = false;
		}
		destination = "falling_info_teleport_destination_1"; // destination entityDef
	}
}
}

```

## See Also

- [idTrigger\_Teleporter &amp; idInfo\_TeleportDestination](https://wiki.eternalmods.com/books/5-level-modding/page/idtrigger-teleporter-idinfo-teleportdestination)

# idTarget_Timeline

<p class="callout info">An entity that plays multiple entities after a set amount of time between each event.</p>

### Usage

```
entity {
	layers {
		"game/pvp/slayer_team" // give the timeline a layer
	}
	instanceId = 4206901337; // look for the instance ID for some entities
	originalName = "target_timeline_portals";
	entityDef target_timeline_portals_4206901337 { // use the entityDef when targeting this entity
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = { // spawn position is not important
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = { // this timeline will trigger both events at the same time
			entityEvents = {
				num = 2;
				item[0] = {
					entity = "invasion_left_func_fx_slayer_portal_1_4206901337";
					events = {
						num = 2;
						item[0] = {
							eventCall = {
								eventDef = "hide"; // hide the left portal when the entity is used
								args = {
									num = 0;
								}
							}
						}
						item[1] = {
							eventTime = 5000;
							eventCall = {
								eventDef = "show"; // show the left portal after 5000 milliseconds
								args = {
									num = 0;
								}
							}
						}
					}
				}
				item[1] = {
					entity = "invasion_right_func_fx_slayer_portal_1_4206901337";
					events = {
						num = 2;
						item[0] = {
							eventCall = {
								eventDef = "hide"; // hide the right portal when the entity is used
								args = {
									num = 0;
								}
							}
						}
						item[1] = {
							eventTime = 5000;
							eventCall = {
								eventDef = "show"; // show the right portal after 5000 milliseconds
								args = {
									num = 0;
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true;
		shouldForceTimelineFinish = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
```

# idTarget_Timer

<p class="callout info">When activated, displays a countdown on the player's HUD.</p>

## idTarget\_Timer

```
entity {
	entityDef example_countdown {
	class = "idTarget_Timer";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		dormancy = {
			allowPvsDormancy = false;
		}
		time = 20;
	}
}
}
```

`time`: the only mandatory argument. Measured in seconds.

<p class="callout danger">Do not rely on the failTarget paramater to activate entities when the timer runs out. The targeted entity will not be activated if the player's HUD is disabled. Instead, use either a relay delay, or an encounter manager wait event call.  
</p>

`stopOnSecondActivate`:if true, then only the first activation will set a countdown. The second activation will immediately set the countdown to 0. Any subsequent activation of this timer will have no effect. Defaults to false.

# idTrigger

<p class="callout info">An entity that will trigger its listed targets when used.</p>

## Usage

```
entity {
	entityDef mod_trigger_1 {
	inherit = "trigger/trigger";
	class = "idTrigger";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_NEVER";
		spawnPosition = {
			x = 1;
			z = 1;
			y = 1;
		}
		renderModelInfo = {
			model = NULL;
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		clipModelInfo = {
			clipModelName = "";
			type = "CLIPMODEL_CYLINDER";
            size = {
                x = 1;
                y = 1;
                z = 1;
            }
		}
		targets = { // list of entities to be triggered
			num = 1;
			item[0] = "mod_target_1";
		}
		wait = 0; // Seconds to wait before this idTrigger can be retriggered.
		waitDelta = 0; // Additional seconds added to the wait value with each trigger. This is cumulative.
		waitMin = 0; // Minimum seconds the wait period can become if using waitDelta.
		waitMax = 0; // Maximum seconds the wait period can become if using waitDelta.
		delay = 0; // Delay, in seconds, between activating this idTrigger and when it activates its targets.
		triggerOnce = true; // If true, will only trigger its targets once.
		triggerFirst = true; // If true, this entity must be activate before it can be used.
		triggerOnEnter = true; // If true, it will only activate its targets when entering the trigger.
		triggerOnExit = false; // If true, it will only activate its targets when exiting the trigger.
		aiCanActivate = false; // If true, ai can activate this idTrigger.
		demonPlayerCanActivate = false; // If true, any demon players can activate.
		clientCanActivate = false; // If true, can be activated on client.
	}
}
}

```

The **spawnPosition** and **clipModelInfo** determine the physical location that the player has to walk into to activate the **idTrigger**. Alternatively, the **idTrigger** can also be activated by another entity or [eventCall](https://wiki.eternalmods.com/books/5-level-modding/chapter/event-calls).

# idTrigger_GorillaBar

<p class="callout info">An entity volume that allows Slayers to swing onto.</p>

### Metal A

```
entity {
	entityDef game_interact_vault_pipe_metal_a_1 {
	inherit = "interact/vault/pipe";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/tile/hell_earth/metal_monkey_bar";
			materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/test/monkey_bar_a.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

### Metal B

```
entity {
	entityDef game_interact_vault_pipe_metal_b_1 {
	inherit = "interact/vault/pipe";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/kit/uac/arena/monkey_bar_b.lwo";
			materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
			emissiveColor = {
				r = 0.215685993;
				g = 1;
				b = 0.281046003;
			}
			emissiveScale = 3;
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/test/monkey_bar_a.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

### Sentinel A

```
entity {
	entityDef game_interact_vault_pipe_sentinel_a_1 {
	inherit = "interact/vault/pipe";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/kit/gameplay/monkeyBar_sentinel_a.lwo";
			materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/gameplay/monkeyBar_sentinel_a.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

### Sentinel C

```
entity {
	entityDef game_interact_vault_pipe_sentinel_c_1 {
	inherit = "interact/vault/pipe";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/kit/gameplay/monkeybar_sentinel_c.lwo";
			materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/gameplay/monkeybar_sentinel_c.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

### Bone

```
entity {
	entityDef game_interact_vault_bone_1 {
	inherit = "interact/vault/bone";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/kit/gameplay/monkeybar_bone.lwo";
            materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/gameplay/monkeybar_bone.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

### Cultist

```
entity {
	entityDef game_interact_vault_bone_cultist_1 {
	inherit = "interact/vault/bone";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/kit/gameplay/monkeyBar_cultist_a.lwo";
			materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/gameplay/monkeyBar_cultist_a.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

### Maykr

```
entity {
	entityDef game_interact_vault_pipe_maykr_1 {
	inherit = "interact/vault/pipe";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/kit/maykr/interior/arena_navigation_a_swing.lwo";
			materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
			emissiveColor = {
				r = 0.215685993;
				g = 1;
				b = 0.281046003;
			}
			emissiveScale = 6;
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/maykr/interior/arena_navigation_a_swing.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

### PVP Lazer

```
entity {
	entityDef game_interact_vault_pipe_pvp_lazer_1 {
	inherit = "interact/vault/pipe";
	class = "idTrigger_GorillaBar";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		renderModelInfo = {
			model = "art/kit/gameplay/monkeyBar_pvpLazer_a.lwo";
			materialRemap = {
				num = 0;
			}
			scale = {
				x = 1;
				y = 1;
			}
			emissiveColor = {
				r = 0.0588235036;
				g = 0.294117987;
                b = 1;
			}
			emissiveScale = 4;
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.707107067;
					y = 0.707106471;
				}
				mat[1] = {
					x = -0.707106471;
					y = 0.707107067;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/gameplay/monkeyBar_pvpLazer_a.lwo";
		}
		forceUsingLeftAxisAsForward = false;
		soundOcclusionBypass = false;
	}
}
}
```

<p class="callout info">Some map entities use a materialRemap to remove the render model and instead apply it to a separate [idDynamicEntity](https://wiki.eternalmods.com/books/5-level-modding/page/iddynamicentity).</p>

<p class="callout warning">Some monkeybar render model assets are not present in certain levels.</p>

# idTrigger_BouncePad & idInfo_BounceDestination

<p class="callout info">Entities that propel a player to a target destination.</p>

A bounce pad consists of either three or four entities:

- A trigger that actually launches the player.
- A destination for the trigger to target.
- [A particle emitter.](https://wiki.eternalmods.com/books/5-level-modding/page/idparticleemitter)
- Dynamic entities to render the pad on the ground. Some pads might be made of multiple models spread across multiple dynamic entities, other pads instead are rendered by the map geometry itself and have no dynamic entities at all, and therefore cannot entirely be visually removed.

<p class="callout warning">Each map has specific models available for rendering a jump pad.</p>

### Hell Pad

```
entity {
	entityDef blood_swamps_trigger_bouncepad {
	inherit = "trigger/bounce_pad";
	class = "idTrigger_BouncePad";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		launchFX = "fx/bounce_pad/basic";
		spawnPosition = {
			x = -48.06;
			y = 307.64;
			z = 7.36;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			size = {
				x = 3;
				y = 3;
				z = 3;
			}
			numSides = 10;
			clipModelName = NULL;
		}
		destination = "blood_swamps_bounce_destination_3";
		launchSpeed = 27; //if the destination is too far away from the trigger, try increasing this.
		useLowArcInsteadOfHigh = true;
		triggerFirst = false;
	}
}
}
entity {
	entityDef blood_swamps_bounce_destination {
	inherit = "info/bounce_destination";
	class = "idInfo_BounceDestination";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = -44.92;
			y = 302.67;
			z = 14.35;
		}
	}
}
}
entity {
	entityDef blood_swamps_bouncepad_platform {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = -48.06;
			y = 307.64;
			z = 7.06;
		}
		renderModelInfo = {
			model = "art/kit/hell/medallion_pad_a.lwo$uvlayout_lightmap=1";
			scale = {
				x = 0.5;
				y = 0.5;
				z = 0.5;
			}
		}
		clipModelInfo = {
			contentsFilter = {
				playerClip = true;
			}
			clipModelName = "art/kit/hell/medallion_pad_a.lwo$uvlayout_lightmap=1";
		}
	}
}
}
entity {
	entityDef blood_swamps_bouncepad_emitter {
	inherit = "func/emitter";
	class = "idParticleEmitter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		dormancy = {
			delay = 5;
			distance = 78.029007;
		}
		fadeIn = 0;
		fadeOut = 0;
		spawnPosition = {
			x = -48.06;
			y = 307.64;
			z = 7.36;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.52760612965;
					y = -0.82817548513;
					z = -0.18909542263;
				}
				mat[1] = {
					x = 0.84339135885;
					y = 0.53729975224;
					z = 0;
				}
				mat[2] = {
					x = 0.10160092264;
					y = -0.15948145092;
					z = 0.98195868731;
				}
			}
		}
		renderModelInfo = {
			color = {
				r = 0.301961005;
				g = 0.650979996;
			}
			emissiveColor = {
				r = 0.301961005;
				g = 0.650979996;
			}
		}
		particleSystem = "gameplay/bounce_pad_hell_01";
	}
}
}
```

### Sentinel Pad

```
entity {
	entityDef world_spear_example_trigger_bounce_pad {
	inherit = "trigger/bounce_pad";
	class = "idTrigger_BouncePad";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		demonPlayerCanActivate = true;
		flags = {
			canBecomeDormant = true;
		}
		launchFX = "fx/bounce_pad/basic";
		spawnPosition = {
			x = 6.29999733;
			y = 179.149979;
			z = 11.1000032;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = "maps/game/dlc2/e5m1_spear/e5m1_spear/village_trigger_bounce_pad_17";
		}
		destination = "village_info_bounce_destination_17";
		launchSpeed = 18;
	}
}
}
entity {
	entityDef world_spear_example_func_emitter {
	inherit = "func/emitter";
	class = "idParticleEmitter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		dormancy = {
			delay = 5;
			distance = 78.029007;
		}
		fadeIn = 0;
		fadeOut = 0;
		spawnPosition = {
			x = 6.28446245;
			y = 179.249954;
			z = 9.95248413;
		}
		renderModelInfo = {
			color = {
				r = 0.301961005;
				g = 0.650979996;
			}
			emissiveColor = {
				r = 0.301961005;
				g = 0.650979996;
			}
		}
		particleSystem = "gameplay/bounce_pad_sentinel";
	}
}
}
entity {
	entityDef world_spear_example_info_bounce_destination {
	inherit = "info/bounce_destination";
	class = "idInfo_BounceDestination";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // these should be different from that of all the other entities in this example
			x = 17.3500271;
			y = 179.149948;
			z = 13.7500429;
		}
	}
}
}
entity {
	entityDef world_spear_example_hell_chunk_2_func_dynamic_906_799096957 {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = -18.8634968;
			y = 310.511993;
			z = -18.1249714;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[1] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[2] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
			}
		}
		renderModelInfo = {
			model = "art/kit/sentinel/sentinelSmallKit/sentinelSmallKit_jumpPad_b_1p5x1p5.lwo";
			emissiveColor = {
				r = 0;
				g = 0.647059023;
			}
			emissiveScale = 0.5;
		}
		clipModelInfo = {
			type = "CLIPMODEL_NONE";
			clipModelName = "art/maps/user/souders/mars_core/uac_jump_pad_bs.lwo";
		}
	}
}
}
entity {
	entityDef world_spear_example_chunk_1_func_dynamic {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = -18.8633633;
			y = 310.511993;
			z = -18.1230907;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[1] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[2] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
			}
		}
		renderModelInfo = {
			model = "art/kit/sentinel/sentinelSmallKit/sentinelSmallKit_jumpPad_b_glow_1p5x1p5.lwo";
			emissiveColor = {
				r = 0;
				g = 0.780391991;
			}
			emissiveScale = 1.5;
		}
		clipModelInfo = {
			type = "CLIPMODEL_NONE";
			clipModelName = "art/maps/user/souders/mars_core/uac_jump_pad_bs.lwo";
		}
	}
}
}
entity {
	entityDef world_spear_example_chunk_2_func_dynamic {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = -18.8635921;
			y = 310.511993;
			z = -18.1262989;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[1] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[2] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
			}
		}
		renderModelInfo = {
			model = "art/kit/sentinel/sentinelSmallKit/sentinelSmallKit_jumpPad_b_glow2_1p5x1p5.lwo";
			emissiveColor = {
				r = 0;
				g = 0.498039067;
			}
			emissiveScale = 1;
		}
		clipModelInfo = {
			type = "CLIPMODEL_NONE";
			clipModelName = "art/maps/user/souders/mars_core/uac_jump_pad_bs.lwo";
		}
	}
}
}
entity {
	entityDef world_spear_example_chunk_3_func_dynamic{
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = -18.8634968;
			y = 310.511993;
			z = -18.1249714;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[1] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[2] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
			}
		}
		renderModelInfo = {
			model = "art/kit/sentinel/sentinelSmallKit/sentinelSmallKit_jumpPad_b_glow3_1p5x1p5.lwo";
			emissiveColor = {
				r = 0;
				g = 0.882353008;
			}
			emissiveScale = 7;
		}
		clipModelInfo = {
			type = "CLIPMODEL_NONE";
			clipModelName = "art/maps/user/souders/mars_core/uac_jump_pad_bs.lwo";
		}
	}
}
}
```

### Celestial Pad

A jump pad on the Urdak-themed BattleMode map, Celestial. In this case, multiple particle emitters are used, one visible to only the slayer, the other to only the demon team indicating that demon players cannot activate this. The cooldown of this jump pad is imposed by a logic entity, which is beyond the scope of this page.

```
entity {
	entityDef game_func_dynamic_3 {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 6.0999999;
			y = -14;
			z = -3.60000014;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = -0.999998212;
					y = -0.00189458777;
				}
				mat[1] = {
					x = 0.00189458777;
					y = -0.999998212;
				}
			}
		}
		renderModelInfo = {
			model = "art/kit/maykr/exterior/facade_pad_a_low.lwo";
			geoDecalMaterial = "art/tile/maykr/floats";
			geoDecalTint = {
				g = 0.756862938;
				b = 0.270588011;
			}
			scale = {
				x = 0.5;
				y = 0.5;
				z = 0.5;
			}
			colorScale = 6;
			emissiveColor = {
				r = 0.376471013;
				b = 0.878431022;
			}
			emissiveScale = 8;
		}
		clipModelInfo = {
			type = "CLIPMODEL_NONE";
			clipModelName = "art/kit/maykr/exterior/facade_pad_a_low.lwo";
		}
	}
}
}
entity {
	layers {
		"game/pvp/slayer_team"
	}
	entityDef game_gameplay_bounce_pad_uac_3 {
	inherit = "func/emitter";
	class = "idParticleEmitter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		dormancy = {
			delay = 5;
			distance = 78.029007;
		}
		fadeIn = 0;
		fadeOut = 0;
		spawnPosition = {
			x = 6.0999999;
			y = -13.6999979;
			z = -3.49999976;
		}
		spawnOrientation = {
			mat = {
				mat[1] = {
					y = 0.258819342;
					z = 0.965925753;
				}
				mat[2] = {
					y = -0.965925753;
					z = 0.258819342;
				}
			}
		}
		renderModelInfo = {
			color = {
				r = 0.376471013;
				b = 0.878431022;
			}
			emissiveColor = {
				r = 0.0784313753;
				g = 0.694117665;
			}
			emissiveScale = 3;
		}
		particleSystem = "gameplay/bounce_pad_uac";
	}
}
}
entity {
	layers {
		"game/pvp/demon_team"
	}
	entityDef game_gameplay_bounce_pad_uac_10 {
	inherit = "func/emitter";
	class = "idParticleEmitter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		dormancy = {
			delay = 5;
			distance = 78.029007;
		}
		fadeIn = 0;
		fadeOut = 0;
		spawnPosition = {
			x = 6.10000038;
			y = -13.6999998;
			z = -3.49999976;
		}
		spawnOrientation = {
			mat = {
				mat[1] = {
					y = 0.258819044;
					z = 0.965925813;
				}
				mat[2] = {
					y = -0.965925813;
					z = 0.258819044;
				}
			}
		}
		particleSystem = "gameplay/bounce_pad_uac_pvp_demon";
	}
}
}
entity {
	entityDef game_trigger_bounce_pad_3 {
	inherit = "trigger/bounce_pad";
	class = "idTrigger_BouncePad";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			canBecomeDormant = true;
		}
		launchFX = "fx/bounce_pad/basic";
		spawnPosition = {
			x = 6.0999999;
			y = -15.6999998;
			z = -3.20000005;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = "maps/game/pvp/pvp_bronco/pvp_bronco/game_trigger_bounce_pad_3";
		}
		triggerForAllClients = true;
		destination = "game_info_bounce_destination_2";
		failedTrajectoryBehavior = "FTB_TOWARDS_TARGET";
		launchSpeed = 25;
	}
}
}
entity {
	entityDef game_info_bounce_destination_2 {
	inherit = "info/bounce_destination";
	class = "idInfo_BounceDestination";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 5.99995661;
			y = -42.9999695;
			z = -2.79999995;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[1] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
				mat[2] = {
					x = 0.0;
					y = 0.0;
					z = 0.0;
				}
			}
		}
	}
}
}
```

# idTrigger_Teleporter & idInfo_TeleportDestination

<p class="callout info">The **idTrigger\_Teleporter** entity defines the location where the player can teleport from.</p>

<p class="callout info">The **idInfo\_TeleportDestination** entity defines the location and orientation where the **idTrigger\_Teleporter** takes the player.</p>

### idTrigger\_Teleporter

```
entity {
	entityDef invasion_tunnels_portal_from_1 {
	inherit = "trigger/teleporter";
	class = "idTrigger_Teleporter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		clientCanActivate = true;
		fxExtraCondition = "FX_EXTRA_COND_MAX";
		sounds = {
			activated = "play_arena_teleporter_use";
		}
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			size = { // find a fitting size based on the teleporter FX
				x = 1;
				y = 3;
				z = 2;
			}
			clipModelName = NULL;
		}
		dormancy = {
			playerDistance = 6;
			playerRearwardDistance = 6;
		}
		flags = {
			hide = false; // choose whether to initially hide the entity or not
		}
		playerCanActivate = true; // should a Slayer player activate
		demonPlayerCanActivate = false; // should a Demon player activate
		destination = "info_teleport_destination_1"; // destination entityDef
	}
}
}
```

### idInfo\_TeleportDestination

```
entity {
	entityDef info_teleport_destination_1 { // the idTrigger_Teleporter entity must contain the entityDef name as the destination.
	inherit = "info/teleport_destination";
	class = "idInfo_TeleportDestination";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
				}
				mat[1] = {
					x = 0;
					y = 1;
				}
			}
		}
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
```

# idTrigger_TakeDamage & idTarget_Melee

<p class="callout info">An either shootable or punchable trigger activated when it takes damage.  
</p>

<p class="callout warning">Assets for both of these types of entities will not be present in all levels. You may need to use assetsinfo to import a level that does, if you wish to use them in levels that originally did not have one.</p>

### Generic crosshair-shaped shootable trigger.

```
entity {
	entityDef example_shootable {
	inherit = "func/shootable";
	class = "idTrigger_TakeDamage";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		renderModelInfo = {
			model = "art/kit/gameplay/breakable_glow_b.lwo";
			scale = {
				x = 0.528155386;
				y = 0.528155386;
				z = 0.528155386;
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 3.5;
				y = 2;
				z = 3.5;
			}
			offset = {
				z = -0.899999976;
			}
		}
		wait = 0;
		triggerOnce = true;
		triggerForAllClients = true;
		playerCanActivate = false;
		deadAiCanActivate = false;
		allowZeroDamage = true;
		soundActivated = "play_shootable_activate";
		soundReady = "play_shootable_reset";
		fxDecl = "gameplay/shootable";
		weaponDamageType = "PLAYER_WEAPON_SHOTGUN_ PLAYER_WEAPON_SHOTGUN_FULL_AUTO_ PLAYER_WEAPON_SHOTGUN_FULL_AUTO_MASTERY_ PLAYER_WEAPON_SHOTGUN_STICKY_BOMB_ PLAYER_WEAPON_DOUBLE_BARRELED_SHOTGUN_ PLAYER_WEAPON_PLASMA_ PLAYER_WEAPON_PLASMA_HEATWAVE_ PLAYER_WEAPON_PLASMA_SUPERCHARGE_ PLAYER_WEAPON_PLASMA_ICE_BOMB_ PLAYER_WEAPON_HAR_ PLAYER_WEAPON_HAR_SCOPE_ PLAYER_WEAPON_HAR_MICROMISSLE_ PLAYER_WEAPON_ROCKETLAUNCHER_ PLAYER_WEAPON_ROCKETLAUNCHER_DETONATE_ PLAYER_WEAPON_ROCKETLAUNCHER_LOCKON_ PLAYER_WEAPON_BALLISTA_ PLAYER_WEAPON_BALLISTA_ARBALEST_ PLAYER_WEAPON_BALLISTA_DESTROYER_ PLAYER_WEAPON_CHAINGUN_ PLAYER_WEAPON_CHAINGUN_TURRET_ PLAYER_WEAPON_CHAINGUN_GATLING_ PLAYER_WEAPON_MEAT_HOOK_NAPALM_ PLAYER_WEAPON_BFG_ PLAYER_WEAPON_FRAG_ PLAYER_WEAPON_FRAG_GRENADE_ PLAYER_WEAPON_FRAG_GRENADE_CLUSTER_ PLAYER_WEAPON_FLAME_BELCH_ PLAYER_WEAPON_FLAME_BELCH_NAPALM_ PLAYER_WEAPON_PISTOL_ PLAYER_WEAPON_PISTOL_HAND_CANNON_ PLAYER_WEAPON_UNMAYKR_ PLAYER_WEAPON_MICROWAVE_MOD_";
		spawnPosition = {
			x = 69.040596;
			y = 231.581207;
			z = -79.0406036;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = 0;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 0;
				}
			}
		}
		targets = {
			num = 1;
			item[0] = "some_movable_gate";
		}
		dormancy = {
			allowDormancy = false;
			allowPvsDormancy = false;
		}
		keepAfterTriggerOnce = true;
	}
}
}
```

### Cultist-themed shootable.

```
entity {
	entityDef example_cultist_base_shootable {
	inherit = "func/shootable";
	class = "idTrigger_TakeDamage";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		renderModelInfo = {
			model = "art/kit/cultist/prop/shootable_a.lwo";
			color = {
				r = 0.282353014;
				b = 0;
			}
			colorScale = 3;
			emissiveColor = {
				r = 0.282353014;
				b = 0;
			}
			emissiveScale = 2;
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 2.75;
				y = 1;
				z = 2.75;
			}
			offset = {
				z = -1.35000002;
			}
		}
		wait = 4;
		triggerOnce = true;
		triggerForAllClients = true;
		playerCanActivate = false;
		deadAiCanActivate = false;
		allowZeroDamage = true;
		soundActivated = "play_shootable_activate";
		soundReady = "play_shootable_reset";
		fxDecl = "gameplay/shootable";
		weaponDamageType = "PLAYER_WEAPON_SHOTGUN_ PLAYER_WEAPON_SHOTGUN_FULL_AUTO_ PLAYER_WEAPON_SHOTGUN_FULL_AUTO_MASTERY_ PLAYER_WEAPON_SHOTGUN_STICKY_BOMB_ PLAYER_WEAPON_DOUBLE_BARRELED_SHOTGUN_ PLAYER_WEAPON_PLASMA_ PLAYER_WEAPON_PLASMA_HEATWAVE_ PLAYER_WEAPON_PLASMA_SUPERCHARGE_ PLAYER_WEAPON_PLASMA_ICE_BOMB_ PLAYER_WEAPON_HAR_ PLAYER_WEAPON_HAR_SCOPE_ PLAYER_WEAPON_HAR_MICROMISSLE_ PLAYER_WEAPON_ROCKETLAUNCHER_ PLAYER_WEAPON_ROCKETLAUNCHER_DETONATE_ PLAYER_WEAPON_ROCKETLAUNCHER_LOCKON_ PLAYER_WEAPON_BALLISTA_ PLAYER_WEAPON_BALLISTA_ARBALEST_ PLAYER_WEAPON_BALLISTA_DESTROYER_ PLAYER_WEAPON_CHAINGUN_ PLAYER_WEAPON_CHAINGUN_TURRET_ PLAYER_WEAPON_CHAINGUN_GATLING_ PLAYER_WEAPON_MEAT_HOOK_NAPALM_ PLAYER_WEAPON_BFG_ PLAYER_WEAPON_FRAG_ PLAYER_WEAPON_FRAG_GRENADE_ PLAYER_WEAPON_FRAG_GRENADE_CLUSTER_ PLAYER_WEAPON_FLAME_BELCH_ PLAYER_WEAPON_FLAME_BELCH_NAPALM_ PLAYER_WEAPON_PISTOL_ PLAYER_WEAPON_PISTOL_HAND_CANNON_ PLAYER_WEAPON_UNMAYKR_ PLAYER_WEAPON_MICROWAVE_MOD_";
		spawnPosition = {
			y = 1;
			y = 146.950027;
			z = 6.25000095;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = 0;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 0;
				}
			}
		}
		targets = {
			num = 1;
			item[0] = "example_relay";
		}
		keepAfterTriggerOnce = true;
	}
}
}
```

## Cultist punchable

```
entity {
	entityDef example_target_melee {
	inherit = "target/melee";
	class = "idTarget_Melee";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		takesDamageFromDamageTypes = "DAMAGETYPE_DASH";
		targetingDecl = "target_melee";
		spawnPosition = {
			x = 1;
		}
		renderModelInfo = {
			model = "art/kit/cultist/prop/punch_symbol.lwo";
			scale = {
				x = 0.984000;
				y = 0.984000;
				z = 0.984000;
			}
			emissiveScale = 6;
			customLodDistance1 = 50;
			customLodDistance2 = 100;
			customLodDistance3 = 125;
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			contentsFilter = {
				playerClip = false;
			}
			size = {
				x = 2.20000005;
				y = 0.300000012;
				z = 2.20000005;
			}
			offset = {
				y = -0.300000012;
				z = -1.20000005;
			}
			clipModelName = "art/kit/gameplay/breakable_glow_a.lwo";
		}
		bindInfo = {
			bindParent = "game_punch_block_1847259846";
			bindOriented = true;
		}
		dormancy = {
			allowPvsDormancy = false;
		}
		removeOnDamage = false;
		fxDecl = "gameplay/pushable";
	}
}
}

```

# idTrigger_Push

<p class="callout info">An entity that moves players inside of it.</p>

```

entity {
    entityDef game_trigger_push_1 {
    class = "idTrigger_Push";
    expandInheritance = false;
    poolCount = 0;
    poolGranularity = 2;
    networkReplicated = false;
    disableAIPooling = false;
    edit = {
        removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
        triggerOnce = false;
        pushForce = 8;
        clearExistingVelocity = true;
        constantVelocity = true;
        isActive = true;
        pushDirection = {
            x = 1;
            y = 0;
            z = 0;
        }
        renderModelInfo = {
            model = NULL;
        }
        clipModelInfo = {
            clipModelName = NULL;
            type = "CLIPMODEL_BOX";
            size = { // how large of an area the effect encompasses.
                x = 1;
                y = 1;
                z = 1;
            }
        }
        spawnPosition = {
            x = 88;
            y = 60;
            z = 18;
        }
        wait = 1;
        playerCanActivate = true; // whether or not to push a slayer.
        demonPlayerCanActivate = true;
        deadAiCanActivate = false;
    }
}
}
```

For a demonstration, a vanilla example can be seen by [loading into a battlemode map](https://wiki.eternalmods.com/books/3-command-console/page/load-battlemode-maps "Load Battlemode maps") as a demon and walking into a portal.

# idTargetableProxyHandler & idTarget_SmartAIProxy

<p class="callout info">The **idTargetableProxyHandler** entity defines the render model and proxy list for Meathook Nodes.</p>

<p class="callout info">The **idTarget\_SmartAIProxy** entity defines the grapple position for Meathook Nodes.</p>

<p class="callout warning">Requires assets from either a TAG2 map, besides Dark Lord (**e5m1\_spear**, **e5m2\_earth**, **e5m3\_hell**), or one of the last two Horde Mode maps (**e6m2\_earth\_horde**, **e6m3\_mcity\_horde**)  
</p>

### idTargetableProxyHandler

```
entity {
	entityDef meathook_node_handler_1 {
	inherit = "target/proxy_handler";
	class = "idTargetableProxyHandler";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		cooldownDuration = 5000; // defines the cooldown; scrubs set this to 0
		connectSound = "play_meat_hook_lock_in";
		ambientLoopSound = "play_meathook_sphere_amb_loop";
		oneSidedActiveModel = "art/kit/gameplay/meathook_traversal_a.lwo";
		oneSidedInactiveModel = "art/kit/gameplay/meathook_traversal_b.lwo";
		allSidedActiveModel = "art/kit/gameplay/meathook_traversal_c.lwo";
		allSidedInactiveModel = "art/kit/gameplay/meathook_traversal_d.lwo";
		oneSidedActiveFXModel = "art/kit/gameplay/meathook_traversal_a_rings.lwo";
		oneSidedInactiveFXModel = "art/kit/gameplay/meathook_traversal_b_rings.lwo";
		allSidedActiveFXModel = "art/kit/gameplay/meathook_traversal_c_rings.lwo";
		allSidedInactiveFXModel = "art/kit/gameplay/meathook_traversal_d_rings.lwo";
		renderModelInfo = {
			model = "art/kit/gameplay/meatHook_traversal_placeholder.lwo";
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		clipModelInfo = {
			clipModelName = "maps/prefabs/gameplay/meathook_target/target_proxy_handler_2";
		}
		proxyList = {
			num = 1;
			item[0] = {
				proxyEntity = "meathook_node_1"; // the idTarget_SmartAIProxy entity
				proxyTagName = "meathook_node_handler_1"; // this entity
			}
		}
		isOmnidirectional = true; // setting this to true makes the node appear on both sides
		spawnPosition = { // be sure to change the spawn position
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 1;
					y = 0;
					z = 0;
				}
			}
		}
	}
}
}
```

### idTarget\_SmartAIProxy

```
entity {
	entityDef meathook_node_1 {
	inherit = "target/ai_proxy_meathook";
	class = "idTarget_SmartAIProxy";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		targetingDecl = "target_aiproxy_meathook";
		distanceOverride = 25; // how far the Meathook connection is
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		spawnPosition = { // make this identical to the idTargetableProxyHandler entity
			x = 1;
			y = 1;
			z = 1;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 1;
					y = 0;
					z = 0;
				}
			}
		}
	}
}
}
```

# idVolume_PlayerEnvOverride

<p class="callout info">An entity to overwrite the **envSettings** decl set by **idWorldspawn** when within the defined volume.</p>

## Usage

```
entity {
	entityDef volume_env_override_1 {
	inherit = "volume/env_override";
	class = "idVolume_PlayerEnvOverride";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		exitAfterTeleport = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = "";
			type = "CLIPMODEL_CYLINDER";
            size = {
                x = 1;
                y = 1;
                z = 1;
            }
		}
		fadeInTime = 250;
		fadeOutTime = 250;
		startEnabled = false;
		allowToggleOnActivate = true;
		declEnv = "e3m1_slayer/e3m1_slayer_default_spectacle_water";
	}
}
}
```

# idTarget_Codex

<p class="callout info">An entity to activate codex entries.</p>

## Usage

```
entity {
	entityDef example_codex_entity {
	class = "idTarget_Codex";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Spawn position does not really matter
			x = 1;
			y = 1;
			z = 1;
		}
		codexEntries = { // You can activate multiple codex entries here.
			num = 1;
			item[0] = "codex/hell/demon_imp"; // Codex to activate.
		}
	}
}
}
```

# Event Calls

A description of various eventCalls that can be used when building a custom encounter.

# activateTarget

<p class="callout info">An eventCall to activate another entity from an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "activateTarget";
		args = {
			num = 2;
			item[0] = {
				entity = ""; // target
			}
			item[1] = {
				string = ""; // designComment
			}
		}
	}
}
```

- `target` is the entity that is being activated.
- `designComment` is an optional parameter for the user, and does not show up in game.

## Example Usage

```
entity { // You Can't Just Shoot a Hole into the Surface of Mars
	entityDef mod_soundentity_samuel_vo_shoot_mars {
	inherit = "sound/soundentity";
	class = "idSoundEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		temporarySoundEvent = true;
		spawnPosition = {
			x = 4.20000553;
			y = 0.449982464;
			z = 12.1500015;
		}
		soundOcclusionBypass = true;
		startEvents = {
			num = 1;
			item[0] = "play_vo_samuel_hubsamuel_hookup_you_cant_just_shoot__ghost52033";
		}
	}
}
}
```

---

```
item[0] = {
	eventCall = {
		eventDef = "waitAIRemaining";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
			}
			item[1] = {
				int = 0; // desired_remaing_ai_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "activateTarget";
		args = {
			num = 2;
			item[0] = {
				entity = "mod_soundentity_samuel_vo_shoot_mars"; // target
			}
			item[1] = {
				string = "Play Hayden's audio for the Mars Hole line"; // designComment
			}
		}
	}
}
```

First we place an `idSoundEntity` with the name `mod_soundentity_samuel_vo_shoot_mars` in the .entities, and then within the encounter manager, we can use `activateTarget` on `mod_soundentity_samuel_vo_shoot_mars` after our [`waitAIRemaining`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/waitairemaining "waitAIRemaining"), so that the "You can't just shoot a hole in the surface of Mars" line is triggered once no ai remain.

# clearCombatRoles

<p class="callout info">An eventCall to clear any combat roles set by a preceding [`setCombatRoles`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/setcombatroles "setCombatRoles").</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "clearCombatRoles";
		args = {
			num = 2;
			item[0] = {
				eEncounterSpawnType_t = ""; // spawnType
			}
			item[1] = {
				string = ""; // group_label
			}
		}
	}
}
```

- `spawnType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") whose role should be cleared.
- `group_label` is the label for the ai whose role should be cleared. This parameter is optional, and can be left blank.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnSingleAI";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
			}
			item[1] = {
				entity = "ai_target_spawn_454";
			}
			item[2] = {
				string = "defender";
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "setCombatRoles";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType
			}
			item[1] = {
				string = "defender"; // group_label
			}
			item[2] = {
				encounterGroupRole_t = "ROLE_DEFEND"; // group_role
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "waitAIHealthLevel";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
			}
			item[1] = {
				float = 0.5; // target_group_health
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
item[3] = {
	eventCall = {
		eventDef = "clearCombatRoles";
		args = {
			num = 2;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS"; // spawnType
			}
			item[1] = {
				string = "defender"; // group_label
			}
		}
	}
}
```

In this example, we spawn a Mancubus which is set to `ROLE_DEFEND`. Once it reaches 50% HP, we use `clearCombatRoles` to clear the defend role.

### See Also

- [setCombatRoles](https://wiki.eternalmods.com/books/creating-custom-encounters/page/setcombatroles)

# clearFactionOverrides

<p class="callout info">An eventCall to clear any faction overrides set by a preceding [`setFactionRelation`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/setfactionrelation "setFactionRelation") in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "clearFactionOverrides";
		args = {
			num = 0;
		}
	}
}
```

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "setFactionRelation";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON"; // instigatorSpawnType
			}
			item[1] = {
				string = ""; // groupLabel
			}
			item[2] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // targetSpawnType
			}
			item[3] = {
				socialEmotion_t = "EMOTION_DESTROY_AT_ALL_COSTS"; // relation
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "setFactionRelation";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // instigatorSpawnType
			}
			item[1] = {
				string = ""; // groupLabel
			}
			item[2] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON"; // targetSpawnType
			}
			item[3] = {
				socialEmotion_t = "EMOTION_DESTROY_AT_ALL_COSTS"; // relation
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "waitKillCount";
		args = {
			num = 3;
			item[0] = {
				eEncounterEventFlags_t = "ENCOUNTER_SPAWN_ANY";
			}
			item[1] = {
				int = 1;
			}
			item[2] = {
				string = "";
			}
		}
	}
}
item[3] = {
	eventCall = {
		eventDef = "clearFactionOverrides";
		args = {
			num = 0;
		}
	}
}
```

In this example [`setFactionRelation`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/setfactionrelation "setFactionRelation") is used to create infighting between Barons and Cyber-Mancubi. Once the player has killed 1 of any ai type, `clearFactionOverrides` is used to restore normal behaviour, having them attack the player instead.

## See Also

- [setFactionRelation](https://wiki.eternalmods.com/books/entities-custom-encounters/page/setfactionrelation)

# damageAI

<p class="callout info">An eventCall to apply a damage type to the specified ai in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "damageAI";
		args = {
			num = 3;
			item[0] = {
				decl = {
					damage = ""; // damageType
				}
			}
			item[1] = {
				eEncounterSpawnType_t = ""; // aiType
			}
			item[2] = {
				string = ""; // groupLabel
			}
		}
	}
}
```

- `damageType` is the path to the decl for the damage type to be used.
- `aiType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that you want the damage to be applied to.
- `group_label` is the label assigned to the ai that will be damaged by this eventCall. This parameter is optional, and can be left blank.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "damageAI";
		args = {
			num = 3;
			item[0] = {
				decl = {
					damage = "damage/triggerhurt/triggerhurt1000_instagib"; // damageType
				}
			}
			item[1] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
			}
			item[2] = {
				string = "fodder"; // groupLabel
			}
		}
	}
}
```

In this example, `triggerhurt1000_instagib` is applied to any ai type with the `fodder` label, killing them instantly.

# designerComment

<p class="callout info">An eventCall for leaving a comment in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "designerComment";
		args = {
			num = 2;
			item[0] = {
				string = ""; // designerComment
			}
			item[1] = {
				bool = true; // printToConsole
			}
		}
	}
}
```

- `designerComment` is the comment you wish to add.
- `printToConsole` determines whether said comment is displayed in the console.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "designerComment";
		args = {
			num = 2;
			item[0] = {
				string = "\nExample text between line breaks\n"; // designerComment
			}
			item[1] = {
				bool = true; // printToConsole
			}
		}
	}
}
```

# forceAIToFlee

<p class="callout info">An eventCall to that forces spawned ai in an idEncounterManager to flee.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "forceAIToFlee";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = ""; // spawnType
			}
			item[1] = {
				string = ""; // group_label
			}
			item[2] = {
				float = 0; // radius
			}
			item[3] = {
				bool = true; // immediateDespawn
			}
		}
	}
}
```

- `spawnType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that you want to flee.
- `group_label` is the label for the ai to flee
- `radius`
- `immediateDespawn` is if the ai will immediately despawn (with the despawn animation)

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "forceAIToFlee";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType
			}
			item[1] = {
				string = ""; // group_label
			}
			item[2] = {
				float = 0; // radius
			}
			item[3] = {
				bool = true; // immediateDespawn
			}
		}
	}
}
```

# forceChargeOnAllAI

<p class="callout info">An eventCall to make all spawned ai in an idEncounterManager charge the player.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "forceChargeOnAllAI";
		args = {
			num = 0;
		}
	}
}
```

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitAIRemaining";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
			}
			item[1] = {
				int = 0; // desired_remaing_ai_count
			}
			item[2] = {
				string = "priority"; // group_label
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "waitAIRemaining";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
			}
			item[1] = {
				int = 3; // desired_remaing_ai_count
			}
			item[2] = {
				string = "fodder"; // group_label
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "forceChargeOnAllAI";
		args = {
			num = 0;
		}
	}
}
```

Here, we wait until all ai with the `priority` label are killed, then we wait until only 3 fodder remain, and we use `forceChargeOnAllAI`, so that the player does not have to go around hunting stray fodder to finish the encounter.

# maintainAICount

<p class="callout info">An eventCall to maintain a certain quantity of respawning idAI2 in an idEncounterManager.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "maintainAICount";
        args = {
            num = 8;
            item[0] = {
                eEncounterSpawnType_t = ""; // spawnType
            }
            item[1] = {
                int = 5; // desired_count
            }
            item[2] = {
                int = 10; // max_spawn_count
            }
            item[3] = {
                float = 5; // min_spawn_delay
            }
            item[4] = {
                int = 1; // min_ai_for_respawn
            }
            item[5] = {
                entity = ""; // spawnGroup
            }
            item[6] = {
                string = ""; // group_label
            }
            item[7] = {
                float = 10; // max_spawn_delay
            }
        }
    }
}
```

- `spawnType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list. `ENCOUNTER_SPAWN_ANY` can also be used.
- `desired_count` is how many ai this eventCall should spawn up to. To avoid overlapping spawns, `desired_count` should be &lt;= the number of [`idTarget_Spawns`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idtarget-spawn "idTarget_Spawn") listed under your `idTargetSpawnGroup`.
- `max_spawn_count` is the maximum number of ai that can be spawned by this eventCall in total. This can be set to `-1` for infinite respawns.
- `min_spawn_delay` is the minimum delay between each spawn, in seconds. This value also affects how soon before this eventCall spawns its first ai.
- `min_ai_for_respawn` triggers the ai respawns when they fall below or equal to the value it's set to. `min_ai_for_respawn` should also be &lt; `desired_count`. If it is greater than `desired_count`, the quantity of demons maintained will not properly reflect `desired_count`, possibly exceeding it.
- `spawnGroup` is the `idTargetSpawnGroup` you want to use.
- `group_label` is what label you want to give to the ai spawned by this eventCall. This parameter is optional, and can be left blank.
- `max_spawn_delay` is the maximum delay between each spawn, in seconds.

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "maintainAICount";
        args = {
            num = 8;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ZOMBIE"; // spawnType
            }
            item[1] = {
                int = 10; // desired_count
            }
            item[2] = {
                int = 20; // max_spawn_count
            }
            item[3] = {
                float = 3; // min_spawn_delay
            }
            item[4] = {
                int = 5; // min_ai_for_respawn
            }
            item[5] = {
                entity = "ai_target_spawn_volume_76"; // spawnGroup
            }
            item[6] = {
                string = ""; // group_label
            }
            item[7] = {
                float = 5; // max_spawn_delay
            }
        }
    }
}
```

In this example, 10 Zombies will be spawned, with a 3-5s delay between each (re)spawn. When only 5 Zombies remain, they will begin respawning until there are 10 Zombies again. Once 20 Zombies have been spawned in total, this eventCall is complete.

## Notes

This eventcall appears to have functionality to adjust its kill requirements if not enough enemies are available, to prevent the encounter from locking up, due to otherwise unattainable kill requirements.

If the quantity of currently alive required enemies are greater or equal to the required kills, then the eventcall functions as normal. However, if the quantity of currently alive required enemies are less than the required kills, then the amount of enemies you need to kill is lowered to match the quantity of currently alive required enemies.

This anti-softlock functionality fails if a `maintainAICount` is followed by a `waitKillCount` sometime later in the same encounter manager, while the `maintainAICount` is still active. If there are not enough enemies are available in this scenario, then the `waitKillCount` will use the completion of the `maintainAICount` as one of it's requirements. Simply killing the maintained demons until its `max_spawn_count` is depleted will avoid soft locking in this situation. Do note that if `max_spawn_count` is set to `-1`, then the soft lock cannot be avoided.

This functionality has only been tested for in Doom Eternal.

## See Also

- [waitMaintainComplete](https://wiki.eternalmods.com/books/creating-custom-encounters/page/waitmaintaincomplete)
- [stopMaintainingAICount](https://wiki.eternalmods.com/books/creating-custom-encounters/page/stopmaintainingaicount)

# makeAIAwareOfPlayer

<p class="callout info">An eventCall to make any ai entities spawned in an idEncounterManager, aware of the player.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "makeAIAwareOfPlayer";
		args = {
			num = 4;
			item[0] = {
				bool = true; // allActive
			}
			item[1] = {
				bool = false; // onSpawn
			}
			item[2] = {
				string = ""; // groupLabel
			}
			item[3] = {
				bool = false; // restorePerception
			}
		}
	}
}
```

# migrateAIFromExternalScript

<p class="callout info">An eventCall to migrate ai entities from another idEncounterManager, into the current encounter manager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "migrateAIFromExternalScript";
		args = {
			num = 4;
			item[0] = {
				entity = ""; // encounterScript
			}
			item[1] = {
				eEncounterSpawnType_t = ""; // aiType
			}
			item[2] = {
				string = ""; // groupLabel
			}
			item[3] = {
				bool = false; // sharedBetweenScripts
			}
		}
	}
}
```

- `encounterScript` is the name of the external idEncounterManager to migrate ai from.
- `aiType` are the ai types from the external encounter manager to be migrated.
- `groupLabel` is the label given to the migrated ai.
- `sharedBetweenScripts` is if the migrated ai are shared between both encounter managers.

# proceedToNextScript

<p class="callout info">An eventCall to proceed to the next script in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "proceedToNextScript";
		args = {
			num = 2;
			item[0] = {
				bool = true; // bypassNextWaitForCommit
			}
			item[1] = {
				bool = true; // carryOverExistingUserFlags
			}
		}
	}
}
```

This eventCall should always be paired with [`setNextScriptIndex`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/setnextscriptindex "setNextScriptIndex").

## See Also

- [setNextScriptIndex](https://wiki.eternalmods.com/books/entities-custom-encounters/page/setnextscriptindex)

# raiseEventFlagOnExternalScript

<p class="callout info">An eventcall to trigger a flag on an idEncounterManager outside of the one that this eventcall is used in.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "raiseEventFlagOnExternalScript";
		args = {
			num = 3;
			item[0] = {
				entity = "game_ai_encounter_script_encounter_script_pre_combat_imp_room"; // encounterScript
			}
			item[1] = {
				eEncounterEventFlags_t = "ENCOUNTER_EVENT_FLAG_USER_EVENT"; // eventFlag
			}
			item[2] = {
				string = "blue_door_start"; // userFlag
			}
		}
	}
}
```

- `encounterScript` is the encounter manager that the user flag is for
- `eventFlag` is the `eEncounterEventFlags_t` (type) for the flag
- `userFlag` is the parameter of the name in the `idEncounterTrigger_RaiseUserFlag` being triggered

Note that using [`activateTarget`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/activatetarget "activateTarget") directly on the `idEncounterTrigger_RaiseUserFlag` in question can also accomplish the same effect.

# removeAI

<p class="callout info">An eventCall to remove spawned ai entities from an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "removeAI";
		args = {
			num = 2;
			item[0] = {
				eEncounterSpawnType_t = ""; // spawnType
			}
			item[1] = {
				string = ""; // group_label
			}
		}
	}
}
```

- `spawnType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that you want to be removed.
- `group_label` is what label for the ai to be removed by this eventCall. This parameter is optional, and can be left blank.

AI entities removed with this command will be instantly removed, without any death or despawn animation. It is best used for ai types that are not affected by [`damageAI`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/damageai "damageAI") or [`forceAIToFlee`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/forceaitoflee "forceAIToFlee").

# setCombatRoles

<p class="callout info">An eventCall to assign roles to idAI2 in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "setCombatRoles";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = ""; // spawnType
			}
			item[1] = {
				string = ""; // group_label
			}
			item[2] = {
				encounterGroupRole_t = ""; // group_role
			}
		}
	}
}
```

- `spawnType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that you want to given a role.
- `group_label` is the label for the ai be given a role by this eventCall. This parameter is optional, and can be left blank.
- `group_role` is the [`encounterGroupRole_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/encountergrouprole-t "encounterGroupRole_t") (combat role) that you wish to give to the specified ai.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnSingleAI";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
			}
			item[1] = {
				entity = "ai_target_spawn_454";
			}
			item[2] = {
				string = "defender";
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "setCombatRoles";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType
			}
			item[1] = {
				string = "defender"; // group_label
			}
			item[2] = {
				encounterGroupRole_t = "ROLE_DEFEND"; // group_role
			}
		}
	}
}
```

In this example, a Mancubus is spawned with the label `defender`, and then `setCombatRoles` is used to set any ai type with the `defender` label to `ROLE_DEFEND`.

## See Also

- [clearCombatRoles](https://wiki.eternalmods.com/books/creating-custom-encounters/page/clearcombatroles)

# setFactionRelation

<p class="callout info">An eventCall to force an emotion between an instigating and target faction in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "setFactionRelation";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = ""; // instigatorSpawnType
			}
			item[1] = {
				string = ""; // groupLabel
			}
			item[2] = {
				eEncounterSpawnType_t = ""; // targetSpawnType
			}
			item[3] = {
				socialEmotion_t = ""; // relation
			}
		}
	}
}
```

- `instigatorSpawnType` is the ai type for the instigator.
- `targetSpawnType` is the ai type for the target.
- `relation` is the [`socialEmotion_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/socialemotion-t) (emotion) that the instigator feels towards the target.

<p class="callout info">The set emotion is only for the instigator towards the target. The target does not automatically reciprocate the same set emotion.</p>

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "setFactionRelation";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON"; // instigatorSpawnType
			}
			item[1] = {
				string = ""; // groupLabel
			}
			item[2] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // targetSpawnType
			}
			item[3] = {
				socialEmotion_t = "EMOTION_DESTROY_AT_ALL_COSTS"; // relation
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "setFactionRelation";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // instigatorSpawnType
			}
			item[1] = {
				string = ""; // groupLabel
			}
			item[2] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON"; // targetSpawnType
			}
			item[3] = {
				socialEmotion_t = "EMOTION_DESTROY_AT_ALL_COSTS"; // relation
			}
		}
	}
}
```

In this example, Barons are set to `EMOTION_DESTROY_AT_ALL_COSTS` against Imps/Soldiers, and vice versa. This results in forced infighting between Barons and Imps/Soldiers.

## See Also

- [clearFactionOverrides](https://wiki.eternalmods.com/books/entities-custom-encounters/page/clearfactionoverrides)

# setMusicState

<p class="callout info">An eventCall to change the state of the specified [`idMusicEntity`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idmusicentity "idMusicEntity") in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "setMusicState";
		args = {
			num = 3;
			item[0] = {
				entity = ""; // target
			}
			item[1] = {
				decl = {
					soundstate = ""; // stateDecl
				}
			}
			item[2] = {
				string = ""; // designComment
			}
		}
	}
}
```

- `target` is the [`idMusicEntity`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idmusicentity "idMusicEntity") to change the state of.
- `stateDecl` is the path to the decl for the `idSoundState` you want to change it to.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "setMusicState";
		args = {
			num = 3;
			item[0] = {
				entity = "sound_sound_musicentity_1"; // target
			}
			item[1] = {
				decl = {
					soundstate = "music_ghost_states/main_heavy"; // stateDecl
				}
			}
			item[2] = {
				string = "Change music state to heavy combat music"; // designComment
			}
		}
	}
}
```

## See Also

- [idMusicEntity](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idmusicentity "idMusicEntity")

# setNextScriptIndex

<p class="callout info">An eventCall to set the index of the next script in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "setNextScriptIndex";
		args = {
			num = 1;
			item[0] = { // nextScriptIndex
				int = 1;
			}
		}
	}
}

```

- `nextScriptIndex` is the index of next script

## Example Usage

```
entity { // Custom Encounter #1
	entityDef mod_encounter_manager_custom_1 {
	inherit = "encounter/manager";
	class = "idEncounterManager";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		enableAIHighlightOnFinish = true;
		disabledAITypeForHighlight = "AI_MONSTER_SPECTRE AI_MONSTER_BUFF_POD AI_MONSTER_TENTACLE";
		playerMetricDef = "encounter/player_metrics";
		chargeCombatGrouping = "encounter/combat_role/charge_command";
		aiTypeDefAssignments = "actorpopulation/default/default_no_bosses";
		spawnPosition = {
			x = 0;
			y = 0;
			z = 0;
		}
		soundOcclusionBypass = true;
		combatRatingScale = "COMBAT_RATING_SCALE_IGNORE";
		encounterComponent = {
			entityEvents = {
				num = 2;
				item[0] = { // Part 0
					entity = "mod_encounter_manager_custom_1";
					events = {
						num = 5;
						item[0] = {
							eventCall = {
								eventDef = "setMusicState";
								args = {
									num = 3;
									item[0] = {
										entity = "sound_sound_musicentity_1";
									}
									item[1] = {
										decl = {
											soundstate = "music_ghost_states/main_heavy";
										}
									}
									item[2] = {
										string = "";
									}
								}
							}
						}
						item[1] = {
							eventCall = {
								eventDef = "spawnSingleAI";
								args = {
									num = 3;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON";
									}
									item[1] = {
										entity = "ai_target_spawn_87";
									}
									item[2] = {
										string = "";
									}
								}
							}
						}
						item[2] = {
							eventCall = {
								eventDef = "waitAIRemaining";
								args = {
									num = 3;
									item[0] = {
										eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
									}
									item[1] = {
										int = 0; // desired_remaing_ai_count
									}
									item[2] = {
										string = ""; // group_label
									}
								}
							}
						}
						item[3] = {
							eventCall = {
								eventDef = "setNextScriptIndex";
								args = {
									num = 1;
									item[0] = { // index of next script
										int = 1;
									}
								}
							}
						}
						item[4] = {
							eventCall = {
								eventDef = "proceedToNextScript";
								args = {
									num = 2;
									item[0] = {
										bool = true; // bypassNextWaitForCommit
									}
									item[1] = {
										bool = true; // carryOverExistingUserFlags
									}
								}
							}
						}
					}
				}
				item[1] = { // Part 1
					entity = "mod_encounter_manager_custom_1";
					events = {
						num = 2;
						item[0] = {
							eventCall = {
								eventDef = "setMusicState";
								args = {
									num = 3;
									item[0] = {
										entity = "sound_sound_musicentity_1";
									}
									item[1] = {
										decl = {
											soundstate = "music_ghost_states/main_ambient";
										}
									}
									item[2] = {
										string = "";
									}
								}
							}
						}
						item[1] = {
							eventCall = {
								eventDef = "activateTarget";
								args = {
									num = 2;
									item[0] = {
										entity = "game_target_count_cp11"; // target
									}
									item[1] = {
										string = ""; // designComment
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
}
```

In this example we use `setNextScriptIndex` after all there are no ai remaning, followed by [`proceedToNextScript`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/proceedtonextscript "proceedToNextScript") to advance to the next script. Note that the encounter manager has to be split into multiple scripts (line 26 and 110) in order for `setNextScriptIndex` to work properly. The next script index does not have to be in sequential order either, as in an encounter manager with 4 scripts, it is possible to advance from script 0 to script 3, skipping over scripts 1 and 2.

## See Also

- [proceedToNextScript](https://wiki.eternalmods.com/books/entities-custom-encounters/page/proceedtonextscript)

# setNextScriptIndexRandom

<p class="callout info">An eventCall to set a random index of the next script in an idEncounterManager.</p>

### Usage

```
item[0] = {
	eventCall = {
		eventDef = "setNextScriptIndexRandom";
		args = {
			num = 2;
			item[0] = {
				int = 1; // from event 0
			}
			item[1] = {
				int = 5; // to event 5
			}
		}
	}
}
```

# spawnAI

<p class="callout info">An eventCall to spawn multiple idAI2 entities, simultaneously, in an idEncounterManager.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnAI";
        args = {
            num = 4;
            item[0] = {
                eEncounterSpawnType_t = ""; // spawnType
            }
            item[1] = {
                int = 6; // spawn_count
            }
            item[2] = {
                entity = ""; // spawnGroup
            }
            item[3] = {
                string = ""; // group_label
            }
        }
    }
}
```

- `spawnType` is the ai type that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list.
- `spawnCount` is the number of ai you want to be spawned. To avoid overlapping spawns, `spawnCount` should be &lt;= the number of [`idTarget_Spawn`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idtarget-spawn "idTarget_Spawn") entities listed under your `idTargetSpawnGroup`.
- `group_label` is the label you want to give this spawned ai. This parameter is optional and can be left blank.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnAI";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType
			}
			item[1] = {
				int = 6; // spawn_count
			}
			item[2] = {
				entity = "mod_spawngroup_1"; // spawnGroup
			}
			item[3] = {
				string = "fodder"; // group_label
			}
		}
	}
}
```

# spawnArchvile

<p class="callout info">An eventCall to spawn an Archvile.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnArchvile";
        args = {
            num = 4;
            item[0] = {
                entity = ""; // spawnTarget
            }
            item[1] = {
                entity = ""; // archvileTemplate
            }
            item[2] = {
                string = ""; // archvile_label
            }
            item[3] = {
                string = ""; // group_label
            }
        }
    }
}
```

- `spawnTarget` is the spawn target or spawn group to spawn the Archvile with.
- `archvileTemplate` is the `<a href="https://wiki.eternalmods.com/books/entities-custom-encounters/page/idarchviletemplate">idArchvileTemplate</a>` you want to use.
- `archvile_label` is the label given to the Archvile that is spawned. This parameter is optional and can be left blank.
- `group_label` is the label given to demons summoned by the Archvile. This parameter is optional and can be left blank.

Note that if an Archvile is spawned without an idArchvileTemplate, it will default to being able summon all (base game?) ai types, with the exemption of another Archvile.

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnArchvile";
        args = {
            num = 4;
            item[0] = {
                entity = "ai_target_spawn_111"; // spawnTarget
            }
            item[1] = {
                entity = "mod_template_2"; // archvileTemplate
            }
            item[2] = {
                string = "super heavy"; // archvile_label
            }
            item[3] = {
                string = "summons"; // group_label
            }
        }
    }
}
```

## See Also

- [idArchvileTemplate](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idarchviletemplate)

# spawnBuffPod

<p class="callout info">An eventCall to spawn a buff totem.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnBuffPod";
        args = {
            num = 3;
            item[0] = {
                entity = ""; // spawnTarget
            }
            item[1] = {
                string = ""; // buffpod_label
            }
            item[2] = {
                string = ""; // buffed_ai_label
            }
        }
    }
}
```

- `spawnTarget` is the spawn target to spawn the totem at.
- `buffpod_label` is the label for the totem itself.
- `buffed_ai_label` is the label for the ai to buff. If this is left blank, all ai will be buffed.

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnSingleAI";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
            }
            item[1] = {
                entity = "ai_target_spawn_46"; // spawnTarget
            }
            item[2] = {
                string = ""; // group_label
            }
        }
    }
}
item[1] = {
    eventCall = {
        eventDef = "spawnSingleAI";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
            }
            item[1] = {
                entity = "ai_target_spawn_47"; // spawnTarget
            }
            item[2] = {
                string = "buff me pls"; // group_label
            }
        }
    }
}
item[2] = {
    eventCall = {
        eventDef = "spawnBuffPod";
        args = {
            num = 3;
            item[0] = {
                entity = "ai_target_spawn_451"; // spawnTarget
            }
            item[1] = {
                string = ""; // buffpod_label
            }
            item[2] = {
                string = "buff me pls"; // buffed_ai_label
            }
        }
    }
}
```

In this example, the totem will only buff the Imp with a `group_label` of `"buff me pls"`, because that matches the `buffed_ai_label` the totem is looking for.

# spawnPossessedAI

<p class="callout info">An eventCall to spawn an ai that is already possessed by a spirit in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnPossessedAI";
		args = {
			num = 7;
			item[0] = {
				eEncounterSpawnType_t = ""; // ai_spawnType
			}
			item[1] = {
				entity = ""; // ai_spawnTarget
			}
			item[2] = {
				string = ""; // ai_groupLabel
			}
			item[3] = {
				entity = ""; // spirit_spawnTarget
			}
			item[4] = {
				eEncounterSpawnType_t = ""; // spirit_allowedAITypes
			}
			item[5] = {
				string = ""; // spirit_allowedGroupLabel
			}
			item[6] = {
				bool = true; // aiTypeExplicitFiltering
			}
		}
	}
}
```

- `ai_spawnType` is the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") for the ai to be spawned.
- `ai_spawnTarget` is the spawn target to be used for the ai to be spawned.
- `ai_groupLabel` is the label to be given to the spawned ai.
- `spirit_spawnTarget` is the spawn target to be used for the spirit.
- `spirit_allowedAITypes` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that the spirit is allowed to possess.
- `spirit_allowedGroupLabel` is the label that the spirit is allowed to possess.
- `aiTypeExplicitFiltering` is whether the spirit will possess ai based on the specified restrictions.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnSingleAI";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_PINKY";
			}
			item[1] = {
				entity = "ai_target_spawn_13";
			}
			item[2] = {
				string = "heavy";
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "spawnPossessedAI";
		args = {
			num = 7;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_REVENANT"; // ai_spawnType
			}
			item[1] = {
				entity = "ai_target_spawn_21"; // ai_spawnTarget
			}
			item[2] = {
				string = "beamer"; // ai_groupLabel
			}
			item[3] = {
				entity = "ai_target_spawn_17"; // spirit_spawnTarget
			}
			item[4] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spirit_allowedAITypes
			}
			item[5] = {
				string = "beamer"; // spirit_allowedGroupLabel
			}
			item[6] = {
				bool = true; // aiTypeExplicitFiltering
			}
		}
	}
}
```

In this example, we spawn a Pinky with the `heavy` label. Then we use `spawnPossessedAI` to spawn a Revenant with the `beamer` label, and the spirit with the ability to possess any ai type with the `beamer` label. This way, once the possessed Revenant is dead, there are no other ai that use the `beamer` label, so the spirit will be unable to possess anyone else, and will despawn.

## See Also

- [spawnSpirit](https://wiki.eternalmods.com/books/entities-custom-encounters/page/spawnspirit)

# spawnSingleAI

<p class="callout info">An eventCall to spawn a single idAI2 entity in an idEncounterManager.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnSingleAI";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = ""; // spawnType
            }
            item[1] = {
                entity = ""; // spawnTarget
            }
            item[2] = {
                string = ""; // group_label
            }
        }
    }
}
```

- `spawnType` is what ai type is spawned. Multiple types can be listed, but only a single ai entity will be spawned. Its type will be randomly chosen from this list.
- `spawnTarget` is the [`idTarget_Spawn`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idtarget-spawn "idTarget_Spawn") entity you want to use.
- `group_label` is the label you want to give this spawned ai. This parameter is optional and can be left blank.

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnSingleAI";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
            }
            item[1] = {
                entity = "ai_target_spawn_47"; // spawnTarget
            }
            item[2] = {
                string = "fodder"; // group_label
            }
        }
    }
}
```

# spawnSpirit

<p class="callout info">An eventCall to spawn a spirit in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnSpirit";
		args = {
			num = 4;
			item[0] = {
				entity = ""; // spawnTarget
			}
			item[1] = {
				eEncounterSpawnType_t = ""; // allowedAITypes
			}
			item[2] = {
				string = ""; // allowed_group_label
			}
			item[3] = {
				bool = true; // aiTypeExplicitFiltering
			}
		}
	}
}
```

- `spawnTarget` is the spawn target that the spirit is to be spawned with.
- `allowedAITypes` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that the spirit is allowed to possess.
- `allowed_group_label` is the label that the spirit is allowed to possess.
- `aiTypeExplicitFiltering` is whether the spirit will only possess the exact specified ai types/group label.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnSingleAI";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON";
			}
			item[1] = {
				entity = "ai_target_spawn_17";
			}
			item[2] = {
				string = "spider";
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "spawnSingleAI";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON";
			}
			item[1] = {
				entity = "ai_target_spawn_21";
			}
			item[2] = {
				string = "possess me";
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "spawnSpirit";
		args = {
			num = 4;
			item[0] = {
				entity = "ai_target_spawn_26"; // spawnTarget
			}
			item[1] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON"; // allowedAITypes
			}
			item[2] = {
				string = "possess me"; // allowed_group_label
			}
			item[3] = {
				bool = true; // aiTypeExplicitFiltering
			}
		}
	}
}
```

In this example, two Arachnotrons are spawned, one with a `spider` label, and the other with the `possess me` label. `spawnSpirit` is then used for `ENCOUNTER_SPAWN_ARACHNOTRON` with the possess me label, that way only the latter Arachnotron will be possessed.

## See Also

- [spawnPossessedAI](https://wiki.eternalmods.com/books/entities-custom-encounters/page/spawnpossessedai)

# staggeredAISpawn

<p class="callout info">An eventCall to spawn multiple idAI2 entities, with a delay between each spawn, in an idEncounterManager.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "staggeredAISpawn";
        args = {
            num = 6;
            item[0] = {
                eEncounterSpawnType_t = ""; // spawnType
            }
            item[1] = {
                int = 5; // spawn_count
            }
            item[2] = {
                entity = ""; // spawnGroup
            }
            item[3] = {
                string = ""; // group_label
            }
            item[4] = {
                float = 1; // minSpawnStagger
            }
            item[5] = {
                float = 5; // maxSpawnStagger
            }
        }
    }
}
```

- `spawnType` is the ai type that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list.
- `spawnCount` is the number of ai you want to be spawned. To avoid overlapping spawns, spawnCount should be &lt;= the number of [`idTarget_Spawns`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/idtarget-spawn "idTarget_Spawn") listed under your `idTargetSpawnGroup`.
- `spawnGroup` is the `idTargetSpawnGroup` you want to use.
- `group_label` is what label you want to give to the ai spawned by this eventCall. This parameter is optional, and can be left blank.
- `minSpawnStagger` is the minimum delay between each spawn, in seconds. This value also affects how soon the first spawn in this eventCall occurs.
- `maxSpawnStagger` is the maximum delay between spawns, in seconds.

<p class="callout warning">`minSpawnStagger` must be &lt;= `maxSpawnStagger`</p>

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "staggeredAISpawn";
        args = {
            num = 6;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ZOMBIE_TIER_1"; // spawnType
            }
            item[1] = {
                int = 5; // spawn_count
            }
            item[2] = {
                entity = "game_target_spawn_group_13"; // spawnGroup
            }
            item[3] = {
                string = ""; // group_label
            }
            item[4] = {
                float = 7.5; // minSpawnStagger
            }
            item[5] = {
                float = 10; // maxSpawnStagger
            }
        }
    }
}
```

In this example, 5 Zombies will be spawned, with a 7.5 - 10s delay between each one.

### See Also

- [waitStaggeredSpawnComplete](https://wiki.eternalmods.com/books/creating-custom-encounters/page/waitstaggeredspawncomplete)

# stopMaintainingAICount

<p class="callout info">An eventCall to end a [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount") in an idEncounterManager.</p>

## Usage

<p class="callout warning">This eventCall should only be used after a [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount").</p>

```
item[0] = {
    eventCall = {
        eventDef = "stopMaintainingAICount";
        args = {
            num = 2;
            item[0] = {
                eEncounterSpawnType_t = ""; // spawnType
            }
            item[1] = {
                string = ""; // group_label
            }
        }
    }
}
```

- `spawnType` is the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") used in the preceding [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount"). `ENCOUNTER_SPAWN_ANY` may also be used instead.
- `group_label` is the label used in the preceding [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount"). This parameter is optional, and may be left blank.

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "maintainAICount";
        args = {
            num = 8;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
            }
            item[1] = {
                int = 5; // desired_count
            }
            item[2] = {
                int = -1; // max_spawn_count
            }
            item[3] = {
                float = 1; // min_spawn_delay
            }
            item[4] = {
                int = 3; // min_ai_for_respawn
            }
            item[5] = {
                entity = "mod_spawngroup_1"; // spawnGroup
            }
            item[6] = {
                string = "fodder"; // group_label
            }
            item[7] = {
                float = 2; // max_spawn_delay
            }
        }
    }
}
item[1] = {
    eventCall = {
        eventDef = "waitKillCount";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
            }
            item[1] = {
                int = 10;
            }
            item[2] = {
                string = "fodder";
            }
        }
    }
}
item[2] = {
    eventCall = {
        eventDef = "stopMaintainingAICount";
        args = {
            num = 2;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
            }
            item[1] = {
                string = "fodder";
            }
        }
    }
}
```

In this example, the [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount") will spawn 5 infinitely respawning Imps. However, once the player has killed 10 Imps, the [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount") will be stopped. Any Imps that are present when `stopMaintainingAICount` was called, will remain.

### See Also

- [maintainAICount](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount)
- [waitMaintainComplete](https://wiki.eternalmods.com/books/creating-custom-encounters/page/waitmaintaincomplete)

# wait

<p class="callout info">An eventCall that tells the idEncounterManager to wait a specified amount of time before executing the next eventCall.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "wait";
        args = {
            num = 1;
            item[0] = {
                float = 0.5; // seconds
            }
        }
    }
}
```


This eventCall can be used before and/or after most other eventCalls. The unit of time used is in seconds.

# waitAIHealthLevel

<p class="callout info">An eventCall that tells the idEncounterManager to wait until the specified ai type reaches a certain HP level, before executing the next eventCalls.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "waitAIHealthLevel";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_KNIGHT"; // spawnType
            }
            item[1] = {
                float = 0.5; // target_group_health
            }
            item[2] = {
                string = ""; // group_label
            }
        }
    }
}
```

- `aiType` is the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") whose HP level should be checked.
- `target_group_health` is the HP level, in decimal percentage, that you want to reach before proceeding.
- `group_label` is the label for the specified ai type(s). This parameter is optional, can be left blank if inapplicable.

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "spawnSingleAI";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // spawnType
            }
            item[1] = {
                entity = "game_target_spawn_1312"; // spawnTarget
            }
            item[2] = {
                string = "check health"; // group_label
            } 
        }
    }
}
item[1] = {
    eventCall = {
        eventDef = "waitAIHealthLevel";
        args = {
            num = 3;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // spawnType
            }
            item[1] = {
				float = 0.6; // target_group_health
            }
            item[2] = {
                string = "check health"; // group_label
            } 
        }
    }
}
item[2] = {
    eventCall = {
        eventDef = "spawnAI";
        args = {
            num = 4;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CACODEMON"; // spawnType
            }
            item[1] = {
				int = 2; // spawn_count
            }
            item[2] = {
                entity = "mod_spawngroup_flying_7"; // spawnGroup
            }
            item[3] = {
                string = "heavy"; // group_label
            }
        }
    }
}
```

In this example, we spawn a Cyber-Mancubus with the label `check_health`. Then we call `waitAIHealthLevel` with said `spawnType` and `group_label`, with `target_group_health` set to `0.6`, so that when the Cyber-Mancubus is &lt;= 60% of its HP, the encounter will proceed.

# waitAIRemaining

<p class="callout info">An eventCall to wait until a certain quantity of specified ai types remain in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitAIRemaining";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = ""; // aiType
			}
			item[1] = {
				int = 0; // desired_remaing_ai_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
```

- `aiType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that you want to wait on.
- The encounter will wait until the quantity of specified ai types present in the encounter are less than or equal to the value of `desired_remaing_ai_count`
- `group_label` is the label that you want to wait on. This parameter is optional, and can be left blank.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "spawnAI";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_SHOTGUN_SOLDIER"; // spawnType
			}
			item[1] = {
				int = 4; // spawn_count
			}
			item[2] = {
				entity = "mod_spawngroup_15"; // spawnGroup
			}
			item[3] = {
				string = ""; // group_label
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "spawnAI";
		args = {
			num = 4;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER ENCOUNTER_SPAWN_BEAM_SOLDIER"; // spawnType
			}
			item[1] = {
				int = 4; // spawn_count
			}
			item[2] = {
				entity = "mod_spawngroup_21"; // spawnGroup
			}
			item[3] = {
				string = ""; // group_label
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "waitAIRemaining";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
			}
			item[1] = {
				int = 0; // desired_remaing_ai_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
```

In this example, 4 Imps/Shotgunners are spawned, and 4 Soldiers/Hell Razers. By using `waitAIRemaining` set to `ENCOUNTER_SPAWN_ANY` with a `desired_remaing_ai_count` of 0, this ensures that all enemies will need to be killed first.

# waitForEventFlag

<p class="callout info">An eventCall that waits until a trigger is activated, or a "flag" is raised.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitForEventFlag";
		args = {
			num = 4;
			item[0] = {
				eEncounterEventFlags_t = "ENCOUNTER_EVENT_FLAG_USER_EVENT";
			}
			item[1] = {
				string = "User_Flag"; // Flag Name
			}
			item[2] = {
				bool = false; // set to true if looking for flag before the encounter has reached this point
			}
			item[3] = {
				bool = false;
			}
		}
	}
}
```

Flag Triggers can activate when entering a certain section of the map or when [activateTarget](https://wiki.eternalmods.com/books/5-level-modding/page/activatetarget) for the entity is used.  
This is useful if you want to activate Energy Barriers to lock you in an arena, or if you need to enter a section of the arena for the encounter to progress.

[idEncounterTrigger\_RaiseUserFlag](https://wiki.eternalmods.com/books/5-level-modding/page/idencountertrigger-raiseuserflag) is the entity that this eventCall looks for when it is activated.

<p class="callout warning">The Encounter Manager must contain the **idEncounterTrigger\_RaiseUserFlag** entity for it to recognize the flag name.</p>

# waitKillCount

<p class="callout info">An eventCall that tells the idEncounterManager to wait until a certain quantity of the specified ai type are killed.</p>

## Usage

```
item[0] = {
    eventCall = {
        eventDef = "waitKillCount";
        args = {
            num = 3;
            item[0] = {
                eEncounterEventFlags_t = ""; // aiType
            }
            item[1] = {
                int = 1; // desired_kill_count
            }
            item[2] = {
				string = ""; // group_label
			}
        }
    }
}
```

- `aiType` is the ai type(s) that you want to wait on.
- `desired_kill_count` is how many of the specified ai type(s) you want to be killed before proceeding.
- `group_label` is the label for the specified ai type(s). This parameter is optional, can be left blank if inapplicable.

## Example Usage

```
item[0] = {
    eventCall = {
        eventDef = "maintainAICount";
        args = {
            num = 8;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType
            }
            item[1] = {
                int = 5; // desired_count
            }
            item[2] = {
                int = -1; // max_spawn_count
            }
            item[3] = {
                float = 1; // min_spawn_delay
            }
            item[4] = {
                int = 3; // min_ai_for_respawn
            }
            item[5] = {
                entity = "mod_spawngroup_1"; // spawnGroup
            }
            item[6] = {
                string = "fodder"; // group_label
            }
            item[7] = {
                float = 2; // max_spawn_delay
            }
        }
    }
}
item[1] = {
    eventCall = {
        eventDef = "waitKillCount";
        args = {
            num = 3;
            item[0] = {
                eEncounterEventFlags_t = "ENCOUNTER_SPAWN_ANY"; // aiType
            }
            item[1] = {
                int = 10; // desired_kill_count
            }
            item[2] = {
				string = "fodder"; // group_label
			}
        }
    }
}
item[2] = {
    eventCall = {
        eventDef = "stopMaintainingAICount";
        args = {
            num = 2;
            item[0] = {
                eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
            }
            item[1] = {
				string = "fodder"; // group_label
			}
        }
    }
}
```

In this example, the [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount") will spawn 5 infinitely respawning Imps or Soldiers. However, once the player has killed 10 fodder, the [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount "maintainAICount") will be stopped.

# waitMaintainComplete

<p class="callout info">An eventCall to wait until a preceding [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount) finishes.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitMaintainComplete";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = ""; // aiType
			}
			item[1] = {
				int = 0; // remaining_spawn_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
```

- `aiType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t) that you want to be wait on. `ENCOUNTER_SPAWN_ANY` can also be used.
- `remaining_spawn_countdesired_count` is how many remaining spawns this eventCall should wait on.
- `group_label` is the same as the label given to the preceding [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount). This parameter is optional, and can be left blank.

<p class="callout warning">This eventcall only works if `max_spawn_count` is set to a finite amount, ex. not `-1`.</p>

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "maintainAICount";
		args = {
			num = 8;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON";
			}
			item[1] = {
				int = 1; // desired_count
			}
			item[2] = {
				int = 3; // max_spawn_count
			}
			item[3] = {
				float = 5; // min_spawn_delay
			}
			item[4] = {
				int = 0; // min_ai_for_respawn
			}
			item[5] = {
				entity = "mod_spawngroup_encounter7B"; // spawnGroup
			}
			item[6] = {
				string = "priority"; // group_label
			}
			item[7] = {
				float = 5; // max_spawn_delay
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "waitMaintainComplete";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON"; // aiType
			}
			item[1] = {
				int = 0; // remaining_spawn_count
			}
			item[2] = {
				string = "priority"; // group_label
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "spawnSingleAI";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_PAIN_ELEMENTAL";
			}
			item[1] = {
				entity = "master_level_target_spawn_13";
			}
			item[2] = {
				string = "priority";
			}
		}
	}
}
```

We start with a [`maintainAICount`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount) that spawns 1 Baron at a time, with up to 3 spawns, each spaced 5s apart. Then we can use `waitMaintainComplete` with `ENCOUNTER_SPAWN_BARON` and `remaining_spawn_count` set to `0`, so that when all 3 Barons have spawned (ie. 0 spawns remaining), the encounter manager can proceed to the next eventCall and spawn the Pain Elemental.

## See Also

- [maintainAICount](https://wiki.eternalmods.com/books/entities-custom-encounters/page/maintainaicount)
- [stopMaintainingAICount](https://wiki.eternalmods.com/books/creating-custom-encounters/page/stopmaintainingaicount)

# waitMulitpleConditions

<p class="callout info">An eventCall for using multiple wait eventCalls in an idEncounterManager.</p>

<p class="callout warning">This eventCall is spelled incorrectly in the engine ("Mulitple"), and must be used this way.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitMulitpleConditions";
		args = {
			num = 2;
			item[0] = {
				int = 2; // condition_count
			}
			item[1] = {
				encounterLogicOperator_t = ""; // logic_operator
			}
		}
	}
}
```

- `condition_count` is the amount of wait conditions
- `logic_operator` is the logic operator used for the wait conditions. The only operators are `ENCOUNTER_LOGICAL_OP_OR` (any wait condition is fulfilled) and `ENCOUNTER_LOGICAL_OP_AND` (all wait conditions are fulfilled).

## Example Usage #1

```
item[0] = {
	eventCall = {
		eventDef = "waitMulitpleConditions";
		args = {
			num = 2;
			item[0] = {
				int = 2; // condition_count
			}
			item[1] = {
				encounterLogicOperator_t = "ENCOUNTER_LOGICAL_OP_OR"; // logic_operator
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "wait";
		args = {
			num = 1;
			item[0] = {
				float = 10;
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "waitKillCount";
		args = {
			num = 3;
			item[0] = {
				eEncounterEventFlags_t = "ENCOUNTER_SPAWN_ANY";
			}
			item[1] = {
				int = 2;
			}
			item[2] = {
				string = "";
			}
		}
	}
}
```

In this example we have two conditions, set to `OR`. This way, when either 10s pass or any 2 ai types are killed, the encounter proceeds.

## Example Usage #2

```
item[0] = {
	eventCall = {
		eventDef = "waitMulitpleConditions";
		args = {
			num = 2;
			item[0] = {
				int = 3; // condition_count
			}
			item[1] = {
				encounterLogicOperator_t = "ENCOUNTER_LOGICAL_OP_AND"; // logic_operator
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "waitAIRemaining";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON";
			}
			item[1] = {
				int = 0; // desired_remaing_ai_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "waitAIRemaining";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
			}
			item[1] = {
				int = 0; // desired_remaing_ai_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
item[3] = {
	eventCall = {
		eventDef = "wait";
		args = {
			num = 1;
			item[0] = {
				float = 5;
			}
		}
	}
}
```

In this example, we have three conditions, set to `AND`. This way, there needs to be no Barons and Mancubi, and 5s must have passed as well, in order for the encounter to proceed.

# waitRandomKillCount

<p class="callout info">An eventCall to wait until a random quantity of specified ai types are killed in an idEncounterManager.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitRandomKillCount";
		args = {
			num = 4;
			item[0] = {
				eEncounterEventFlags_t = ""; // aiType
			}
			item[1] = {
				int = 1; // kill_count_min
			}
			item[2] = {
				int = 1; // kill_count_max
			}
			item[3] = {
				string = ""; // group_label
			}
		}
	}
}
```

- `aiType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") that will be tracked for the kill count.
- `kill_count_min` is the minimum value for the random kill count.
- `kill_count_max` is the maximum value for the random kill count.

A value will be randomly picked from between `kill_count_min` and `kill_count_max` (inclusive?). Once that kill count is achieved, the wait condition will be fulfilled.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitRandomKillCount";
		args = {
			num = 4;
			item[0] = {
				eEncounterEventFlags_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // aiType
			}
			item[1] = {
				int = 15; // kill_count_min
			}
			item[2] = {
				int = 20; // kill_count_max
			}
			item[3] = {
				string = "fodder"; // group_label
			}
		}
	}
}
```

In this example, once between 15 and 20 Imps/Soldiers are killed, the encounter will proceed.

# waitStaggeredSpawnComplete

<p class="callout info">An eventCall to wait until the preceding [`staggeredAISpawn`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/staggeredaispawn "staggeredAISpawn") finishes.</p>

## Usage

```
item[0] = {
	eventCall = {
		eventDef = "waitStaggeredSpawnComplete";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = ""; // aiType
			}
			item[1] = {
				int = 0; // remaining_spawn_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
```

- `aiType` are the [`eEncounterSpawnType_t`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/eencounterspawntype-t "eEncounterSpawnType_t") from the preceding [`staggeredAISpawn`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/staggeredaispawn "staggeredAISpawn") that you want to wait on. `ENCOUNTER_SPAWN_ANY` can also be used.
- `remaining_spawn_count` is how many remaining spawns this eventCall should wait on.

## Example Usage

```
item[0] = {
	eventCall = {
		eventDef = "staggeredAISpawn";
		args = {
			num = 6;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
			}
			item[1] = {
				int = 3; // spawn_count
			}
			item[2] = {
				entity = "mod_spawngroup_encounter2"; // spawnGroup
			}
			item[3] = {
				string = "fodder"; // group_label
			}
			item[4] = {
				float = 1; // minSpawnStagger
			}
			item[5] = {
				float = 2; // maxSpawnStagger
			}
		}
	}
}
item[1] = {
	eventCall = {
		eventDef = "staggeredAISpawn";
		args = {
			num = 6;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType
			}
			item[1] = {
				int = 3; // spawn_count
			}
			item[2] = {
				entity = "mod_spawngroup_encounter2B"; // spawnGroup
			}
			item[3] = {
				string = "fodder"; // group_label
			}
			item[4] = {
				float = 1; // minSpawnStagger
			}
			item[5] = {
				float = 2; // maxSpawnStagger
			}
		}
	}
}
item[2] = {
	eventCall = {
		eventDef = "waitStaggeredSpawnComplete";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
			}
			item[1] = {
				int = 0; // remaining_spawn_count
			}
			item[2] = {
				string = ""; // group_label
			}
		}
	}
}
item[3] = {
	eventCall = {
		eventDef = "spawnSingleAI";
		args = {
			num = 3;
			item[0] = {
				eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_KNIGHT";
			}
			item[1] = {
				entity = ai_target_spawn_23";
			}
			item[2] = {
				string = "priority";
			}
		}
	}
}
```

In this example, we have a [`staggeredAISpawn`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/staggeredaispawn "staggeredAISpawn") for 3 Imps, with a 1-2s delay between spawns, and ditto for Soldiers. We can then follow it up with `waitStaggeredSpawnComplete`, with `ENCOUNTER_SPAWN_ANY` and `remaining_spawn_count set` to `0`, so that all [`staggeredAISpawn`](https://wiki.eternalmods.com/books/entities-custom-encounters/page/staggeredaispawn "staggeredAISpawn") eventcalls for any ai type will need to finish spawning (ie. 0 remaining spawns), before the encounter can proceed and spawn a Hell Knight.

### See Also

- [staggeredAISpawn](https://wiki.eternalmods.com/books/creating-custom-encounters/page/staggeredaispawn)

# Type Lists



# aiStateOverride_t

<p class="callout info">These types can also be dumped with `sh_type`/`mh_type aiStateOverride_t`</p>

## Types

##### 2016

`AIOVERRIDE_DEFAULT`  
`AIOVERRIDE_FORCE_AWARENESS_OF_PLAYER`  
`AIOVERRIDE_FORCE_AWARENESS_OF_ENTITY`  
`AIOVERRIDE_FORCE_SEARCH_TO_PLAYER`  
`AIOVERRIDE_FORCE_SEARCH_TO_ENTITY`  
`AIOVERRIDE_CHARGE_MELEE_PLAYER`  
`AIOVERRIDE_PLAY_ENTRANCE_ANIMATION`  
`AIOVERRIDE_FORCE_MOVE_TO_TRAVERSAL`  
`AIOVERRIDE_FORCE_TELEPORT_TO_TRAVERSAL`  
`AIOVERRIDE_TELEPORT`  
`AIOVERRIDE_TELEPORT_FORCE_SPAWN_ANGLE`  
`AIOVERRIDE_SPAWN_ANIM_IDLE`  
`AIOVERRIDE_SPAWNED_BY_SYNC_ENTITY`  
`AIOVERRIDE_WANDER`  
`AIOVERRIDE_ENTRANCE_ANIM_NO_ENEMIES`  
`AIOVERRIDE_TELEPORT_NO_ENEMIES`  
`AIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_ENTRANCE`  
`AIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_SPLINE`

##### Eternal

`AIOVERRIDE_DEFAULT`  
`AIOVERRIDE_FORCE_AWARENESS_OF_PLAYER`  
`AIOVERRIDE_FORCE_AWARENESS_OF_ENTITY`  
`AIOVERRIDE_FORCE_SEARCH_TO_PLAYER`  
`AIOVERRIDE_FORCE_SEARCH_TO_ENTITY`  
`AIOVERRIDE_CHARGE_MELEE_PLAYER`  
`AIOVERRIDE_PLAY_ENTRANCE_ANIMATION`  
`AIOVERRIDE_PLAY_ENTRANCE_ANIMATION_WITH_CORRECTION`  
`AIOVERRIDE_FORCE_MOVE_TO_ENTITY`  
`AIOVERRIDE_FORCE_MOVE_TO_TRAVERSAL`  
`AIOVERRIDE_FORCE_TELEPORT_TO_TRAVERSAL`  
`AIOVERRIDE_TELEPORT`  
`AIOVERRIDE_TELEPORT_FORCE_SPAWN_ANGLE`  
`AIOVERRIDE_SPAWN_ANIM_IDLE`  
`AIOVERRIDE_SPAWNED_BY_SYNC_ENTITY`  
`AIOVERRIDE_WANDER`  
`AIOVERRIDE_ENTRANCE_ANIM_NO_ENEMIES`  
`AIOVERRIDE_TELEPORT_NO_ENEMIES`  
`AIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_ENTRANCE`  
`AIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_SPLINE`

## Explanations/Usage

##### AIOVERRIDE\_DEFAULT

##### AIOVERRIDE\_FORCE\_AWARENESS\_OF\_PLAYER

The ai will spawn aware of the player's position.

##### AIOVERRIDE\_FORCE\_AWARENESS\_OF\_ENTITY

##### AIOVERRIDE\_FORCE\_SEARCH\_TO\_PLAYER

##### AIOVERRIDE\_FORCE\_SEARCH\_TO\_ENTITY

##### AIOVERRIDE\_CHARGE\_MELEE\_PLAYER

##### AIOVERRIDE\_PLAY\_ENTRANCE\_ANIMATION

The ai will spawn with the specified entrance animation.

[![AIOVERRIDE_PLAY_ENTRANCE_ANIMATION.png](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/scaled-1680-/aioverride-play-entrance-animation.png)](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/aioverride-play-entrance-animation.png)

##### AIOVERRIDE\_PLAY\_ENTRANCE\_ANIMATION\_WITH\_CORRECTION

Same usage as `AIOVERRIDE_PLAY_ENTRANCE_ANIMATION`, but will adjust the animation in the case that the animation travels further than the actual distance covered, to prevent partial clipping into the ground.

##### AIOVERRIDE\_FORCE\_MOVE\_TO\_ENTITY

##### AIOVERRIDE\_FORCE\_MOVE\_TO\_TRAVERSAL

##### AIOVERRIDE\_FORCE\_TELEPORT\_TO\_TRAVERSAL

##### AIOVERRIDE\_TELEPORT

The ai will spawn with its teleport FX, always facing the player.

##### AIOVERRIDE\_TELEPORT\_FORCE\_SPAWN\_ANGLE

Same as `AIOVERRIDE_TELEPORT`, but facing the direction specified in the spawn target's `spawnOrientation`.

##### AIOVERRIDE\_SPAWN\_ANIM\_IDLE

The ai will spawn with the specified idle animation.

[![AIOVERRIDE_SPAWN_ANIM_IDLE.png](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/scaled-1680-/aioverride-spawn-anim-idle.png)](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/aioverride-spawn-anim-idle.png)

##### AIOVERRIDE\_SPAWNED\_BY\_SYNC\_ENTITY

##### AIOVERRIDE\_WANDER

The spawned ai will wander around (provided they are not set to any target, to infight, or are aware of the player).

##### AIOVERRIDE\_ENTRANCE\_ANIM\_NO\_ENEMIES

##### AIOVERRIDE\_TELEPORT\_NO\_ENEMIES

##### AIOVERRIDE\_FORCE\_TELEPORT\_TO\_FLIGHT\_ENTRANCE

Same usage as `AIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_SPLINE` (?)

##### AIOVERRIDE\_FORCE\_TELEPORT\_TO\_FLIGHT\_SPLINE

The ai will spawn with its teleport FX and move to the `idInfoFlightVolumeEntrance` set in its spawn target's `initialTargetOverride`

[![AIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_SPLINE.png](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/scaled-1680-/aioverride-force-teleport-to-flight-spline.png)](https://wiki.eternalmods.com/uploads/images/gallery/2021-09/aioverride-force-teleport-to-flight-spline.png)

# eEncounterSpawnType_t

<p class="callout info">These types can also be dumped with `sh_type`/`mh_type eEncounterSpawnType_t`</p>

## Types

##### 2016

`ENCOUNTER_SPAWN_ZOMBIE`  
`ENCOUNTER_SPAWN_WELDER_ZOMBIE`  
`ENCOUNTER_SPAWN_IMP`  
`ENCOUNTER_SPAWN_IMP_ALBINO` - Unused/Cut AI type  
`ENCOUNTER_SPAWN_HELL_SOLDIER`  
`ENCOUNTER_SPAWN_SHOTGUN_SOLDIER`  
`ENCOUNTER_SPAWN_BEAM_SOLDIER` - Hell Razer  
`ENCOUNTER_SPAWN_LOST_SOUL`  
`ENCOUNTER_SPAWN_HELL_KNIGHT`  
`ENCOUNTER_SPAWN_CACODEMON`  
`ENCOUNTER_SPAWN_ARCHVILE` - Summoner  
`ENCOUNTER_SPAWN_REVENANT`  
`ENCOUNTER_SPAWN_PINKY`  
`ENCOUNTER_SPAWN_SPECTRE`  
`ENCOUNTER_SPAWN_MANCUBUS`  
`ENCOUNTER_SPAWN_CYBER_MANCUBUS `  
`ENCOUNTER_SPAWN_BARON`  
`ENCOUNTER_SPAWN_CYBERDEMON`  
`ENCOUNTER_SPAWN_ANY`

##### Eternal

`ENCOUNTER_SPAWN_ZOMBIE_TIER_1` - Regular Zombie  
`ENCOUNTER_SPAWN_ZOMBIE_T1_SCREECHER`  
`ENCOUNTER_SPAWN_ZOMBIE_TIER_3` - Mecha Zombie  
`ENCOUNTER_SPAWN_ZOMBIE_MAYKR` - Maykr Drone  
`ENCOUNTER_SPAWN_IMP`  
`ENCOUNTER_SPAWN_STONE_IMP`  
`ENCOUNTER_SPAWN_GARGOYLE`  
`ENCOUNTER_SPAWN_PROWLER`  
`ENCOUNTER_SPAWN_CURSED_PROWLER`  
`ENCOUNTER_SPAWN_HELL_SOLDIER`  
`ENCOUNTER_SPAWN_SHOTGUN_SOLDIER`  
`ENCOUNTER_SPAWN_CHAINGUN_SOLDIER`  
`ENCOUNTER_SPAWN_CARCASS`  
`ENCOUNTER_SPAWN_LOST_SOUL`  
`ENCOUNTER_SPAWN_HELL_KNIGHT`  
`ENCOUNTER_SPAWN_DREAD_KNIGHT`  
`ENCOUNTER_SPAWN_PINKY`  
`ENCOUNTER_SPAWN_SPECTRE`  
`ENCOUNTER_SPAWN_CACODEMON`  
`ENCOUNTER_SPAWN_PAIN_ELEMENTAL`  
`ENCOUNTER_SPAWN_MANCUBUS`  
`ENCOUNTER_SPAWN_CYBER_MANCUBUS`  
`ENCOUNTER_SPAWN_ARACHNOTRON`  
`ENCOUNTER_SPAWN_REVENANT`  
`ENCOUNTER_SPAWN_BLOOD_ANGEL` - Blood Maykr  
`ENCOUNTER_SPAWN_WHIPLASH` - Spectre Whiplashes are spawned using the same type  
`ENCOUNTER_SPAWN_DOOM_HUNTER`  
`ENCOUNTER_SPAWN_MARAUDER`  
`ENCOUNTER_SPAWN_BARON`  
`ENCOUNTER_SPAWN_ARMORED_BARON`  
`ENCOUNTER_SPAWN_ARCHVILE`  
`ENCOUNTER_SPAWN_TYRANT`  
`ENCOUNTER_SPAWN_GLADIATOR`  
`ENCOUNTER_SPAWN_ICON_OF_SIN`  
`ENCOUNTER_SPAWN_MAYKR_ANGEL` - Khan Maykr  
`ENCOUNTER_SPAWN_SAMUEL_BOSS`  
`ENCOUNTER_SPAWN_CUEBALL`  
`ENCOUNTER_SPAWN_BUFF_POD` - Buff Totem  
`ENCOUNTER_SPAWN_SUPER_TENTACLE`  
`ENCOUNTER_SPAWN_TENTACLE`  
`ENCOUNTER_SPAWN_SPIRIT`  
`ENCOUNTER_SPAWN_TURRET`  
`ENCOUNTER_SPAWN_DEMONIC_TROOPER`  
`ENCOUNTER_SPAWN_GENERIC`  
`ENCOUNTER_SPAWN_ANY`

# encounterGroupRole_t

<p class="callout info">These types can also be dumped with `sh_type`/`mh_type encounterGroupRole_t`</p>

## Types

##### 2016

`ROLE_DEFEND`  
`ROLE_ASSAULT`  
`ROLE_FLANK`  
`ROLE_FLANK_CHARGE`  
`ROLE_FORMATION`  
`ROLE_THROW`  
`ROLE_CHARGE`

##### Eternal

`ROLE_DEFEND`  
`ROLE_ASSAULT`  
`ROLE_FLANK`  
`ROLE_FLANK_CHARGE`  
`ROLE_FORMATION`  
`ROLE_THROW`  
`ROLE_CHARGE`  
`ROLE_TURRET`  
`ROLE_DEFEND_ZONE`

## Explanations

- ROLE\_DEFEND: The ai attack the player while attempting to remain at its current location.
- ROLE\_ASSAULT: The ai will attack the player (?)
- ROLE\_FLANK: The ai will flank the player.
- ROLE\_FLANK\_CHARGE: The ai will continuously charge towards/follow the player, while maintaining a certain distance (usually outside of melee range).
- ROLE\_FORMATION: ?
- ROLE\_THROW: The ai will use ranged throw attacks (?) Not applicable to all ai types.
- ROLE\_CHARGE: The ai will continuously charge towards/follow the player, often getting into melee range.
- ROLE\_TURRET: The ai will remain completely stationary, and only used ranged attacks. Not applicable to all ai types.
- ROLE\_DEFEND\_ZONE: ?

# socialEmotion_t

<p class="callout info">These types can also be dumped with `sh_type`/`mh_type socialEmotion_t`</p>

## Types

##### 2016

`EMOTION_TERRIFIED`  
`EMOTION_FEAR`  
`EMOTION_WARY`  
`EMOTION_DESTROY_AT_ALL_COSTS`  
`EMOTION_DESTROY`  
`EMOTION_HATE`  
`EMOTION_ANGER`  
`EMOTION_DISLIKE`  
`EMOTION_ANNOYED`  
`EMOTION_NEUTRAL`  
`EMOTION_FRIENDLY`  
`EMOTION_SQUADMATE`  
`EMOTION_PARTNER`

##### Eternal

`EMOTION_TERRIFIED`  
`EMOTION_FEAR`  
`EMOTION_WARY`  
`EMOTION_DESTROY_AT_ALL_COSTS`  
`EMOTION_DESTROY_PRIORITY`  
`EMOTION_DESTROY`  
`EMOTION_HATE`  
`EMOTION_ANGER`  
`EMOTION_DISLIKE`  
`EMOTION_ANNOYED`  
`EMOTION_NEUTRAL`  
`EMOTION_FRIENDLY`  
`EMOTION_SQUADMATE`  
`EMOTION_PARTNER`

# Slayer Inventory

Modify the player's initial inventory.

# DevInvLoadout Fundamentals

The devinvloadout decls dictate the slayer's starting inventory when the player loads a map, but does not load an existing save file. Scenarios where this occurs include:

- Creating a new save file.
- Joining an online match.
- playing through the tutorial.

<p class="callout info">Master level Classic Starts are an exception to the above rule, and uses both the save file and devinvloadout. This way the player's preferred runes are equipped. Master levels do not use devinvloadout outside of this mode, loading the player's inventory from the save file instead.</p>

You can find these files in generated/decls/devinvloadout/devinvloadout/ in level specific resources archives. The devmenuoption decl file you wish to use is specified in the game world, located at the top of the entities file.

### Usage

This list shows how a devinvloadout file is organized. Copying from one of the vanilla examples at the bottom of the page is recommended.

```
{
	edit = {
		startingInventory = { // weapons, upgrades, and other items like the dash ability go here.
			num = 127;
			item[65] = {
				item = "weapon/player/double_barrel";
				equip = true;
			}
		}
		currencyToGive = {
			num = 4;
			item[0] = {
				count = 0;
			}
			item[1] = {
				currencyType = "CURRENCY_PRAETOR_UPGRADE";
				count = 0;
			}
			item[2] = {
				currencyType = "CURRENCY_WEAPON_MASTERY";
				count = 0;
			}
			item[3] = {
				currencyType = "CURRENCY_SENTINEL_BATTERY";
				count = 0;
			}
		}
		statsToGive = {
			num = 3;
			item[0] = "STAT_SUIT_PAGE_UNLOCKED";
			item[1] = "STAT_RUNE_PAGE_UNLOCKED";
			item[2] = "STAT_CHALLENGE_PAGE_UNLOCKED";
		}
		codexEntriesToGive = {
			num = 86;
			item[84] = "codex/slayer/arsenal_super_shotgun";
		}
		clearAllBeforeApply = true;
	}
}
```

Many devinvloadout decls also inherit from a previous level's decl, automatically including all items from that level, however you will probably find it easier to remove this and work from a more complete template instead.

### Common items of interest

Here are some items you might or might not want the player to have.

**<span style="text-decoration: underline;">crucible:  
</span>**

```
item = "weapon/player/crucible";
```

**<span style="text-decoration: underline;">Fully upgraded Sentinel Hammer:  
</span>**

```
			item[130] = {
				item = "weapon/player/hammer";
				equip = true;
			}
			item[131] = {
				perk = "perk/player/weapons/hammer/ammo_drops_upgraded";
				equip = true;
			}
			item[132] = {
				perk = "perk/player/weapons/hammer/armor_and_health_drops_upgraded";
				equip = true;
			}
			item[133] = {
				perk = "perk/player/weapons/hammer/hammer_pain_falter_time_longer";
				equip = true;
			}
```

**<span style="text-decoration: underline;">Horde Mode Hammer:  
</span>**

```
item = "weapon/player/hammer_horde";
```

**<span style="text-decoration: underline;">Runes  
</span>** The first three base runes and first support rune to be listed will be automatically activated on a new save without the need to open the dossier and select them.

```
			item[118] = {
				perk = "perk/player/runes/double_jump_air_control";
				isRune = true;
			}
			item[119] = {
				perk = "perk/player/runes/decrease_equipment_recharge";
				isRune = true;
			}
			item[120] = {
				perk = "perk/player/runes/glory_kill_speed";
				isRune = true;
			}
			item[121] = {
				perk = "perk/player/runes/speed_boost_on_glory_kill";
				isRune = true;
			}
			item[122] = {
				perk = "perk/player/runes/modify_enemy_stagger_duration";
				isRune = true;
			}
			item[123] = {
				perk = "perk/player/runes/activate_focus_on_death_blow";
				isRune = true;
			}
			item[124] = {
				perk = "perk/player/runes/target_strike";
				isRune = true;
			}
			item[125] = {
				perk = "perk/player/runes/glory_kill_dash";
				isRune = true;
			}
			item[126] = {
				perk = "perk/player/runes/blood_punch_loot_on_damage";
				isRune = true;
			}
			item[127] = {
				perk = "perk/player/runes/dlc/weakpoint_concussive_blast";
				isRune = true;
			}
			item[128] = {
				perk = "perk/player/runes/dlc/extra_life_refund";
				isRune = true;
			}
			item[129] = {
				perk = "perk/player/runes/dlc/blood_punch_low_health_bonus_damage";
				isRune = true;
			}
```

**<span style="text-decoration: underline;">Sentinel Crystals  
</span>**

Sentinel crystals are given by lines that look like `perk = "perk/player/argent/ammo_capacity_0"`. If you only want the player to have some crystals, consider placing them in the map to let the player choose them. Otherwise, you can simply give the player all 12 of them, or choose them based on the combinations listed below.

Quickdraw Belch: `armor_capacity_0 and health_capacity_0`Loot Magnet: `ammo_capacity_2 and armor_capacity_1`Napalm Launch: `ammo_capacity_0 and health_capacity_1`Health for Blood: `armor_capacity_2 and health_capacity_3 `Belch Armor Boost: `ammo_capacity_1 and health_capacity_2`Armor for Blood: `ammo_capacity_3 and armor_capacity_3`

### devinvloadout examples

Here is an unmodified copy of dlc/e4m1.decl, which defines the inventory for UAC Atlantica:

```
{
	edit = {
		startingInventory = {
			num = 127;
			item[0] = {
				item = "jumpboots/base";
				equip = true;
			}
			item[1] = {
				item = "abilities/environmentsuit";
			}
			item[2] = {
				item = "abilities/grapplegloves";
			}
			item[3] = {
				item = "weapon/player/fists";
			}
			item[4] = {
				perk = "perk/player/blood_punch/base";
				equip = true;
			}
			item[5] = {
				perk = "perk/player/blood_punch/area_of_effect";
				equip = true;
			}
			item[6] = {
				perk = "perk/player/blood_punch/ai_charge_rate";
				equip = true;
			}
			item[7] = {
				perk = "perk/player/blood_punch/max_charges";
				equip = true;
			}
			item[8] = {
				item = "ability_dash";
			}
			item[9] = {
				item = "ammo/sharedammopool/fuel";
				count = 99;
				applyAfterLoadout = true;
			}
			item[10] = {
				item = "ammo/sharedammopool/shells";
				count = 999;
				applyAfterLoadout = true;
			}
			item[11] = {
				item = "ammo/sharedammopool/bullets";
				count = 999;
				applyAfterLoadout = true;
			}
			item[12] = {
				item = "ammo/sharedammopool/cells";
				count = 999;
				applyAfterLoadout = true;
			}
			item[13] = {
				item = "ammo/sharedammopool/rockets";
				count = 999;
				applyAfterLoadout = true;
			}
			item[14] = {
				item = "ammo/sharedammopool/bfg";
				count = 60;
				equip = true;
				applyAfterLoadout = true;
			}
			item[15] = {
				perk = "perk/player/argent/ammo_capacity_0";
				applyAfterLoadout = true;
			}
			item[16] = {
				perk = "perk/player/argent/ammo_capacity_1";
				applyAfterLoadout = true;
			}
			item[17] = {
				perk = "perk/player/argent/ammo_capacity_2";
				applyAfterLoadout = true;
			}
			item[18] = {
				perk = "perk/player/argent/ammo_capacity_3";
				applyAfterLoadout = true;
			}
			item[19] = {
				item = "equipmentlauncher/equipmentlauncherleft";
			}
			item[20] = {
				item = "throwable/player/frag_grenade";
				forceStat = true;
				equip = true;
			}
			item[21] = {
				item = "weapon/player/equipment_flame_belch";
				equip = true;
			}
			item[22] = {
				item = "weapon/player/equipment_flame_belch_right";
			}
			item[23] = {
				item = "throwable/player/ice_bomb";
				forceStat = true;
			}
			item[24] = {
				item = "weapon/player/chainsaw";
			}
			item[25] = {
				item = "weapon/player/shotgun";
				equip = true;
			}
			item[26] = {
				perk = "perk/player/weapons/shotgun/pop_rocket";
				equip = true;
			}
			item[27] = {
				perk = "perk/player/weapons/shotgun/pop_rocket_weakpoint_hit";
				equip = true;
			}
			item[28] = {
				perk = "perk/player/weapons/shotgun/pop_rocket_faster_recharge";
				equip = true;
			}
			item[29] = {
				perk = "perk/player/weapons/shotgun/pop_rocket_larger_explosion";
				equip = true;
			}
			item[30] = {
				perk = "perk/player/weapons/shotgun/pop_rocket_more_bombs";
				equip = true;
			}
			item[31] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto";
			}
			item[32] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_faster_recovery";
				equip = true;
			}
			item[33] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_faster_charge";
				equip = true;
			}
			item[34] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_increased_movement_speed";
				equip = true;
			}
			item[35] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_ammo_giveback";
				equip = true;
			}
			item[36] = {
				item = "weapon/player/heavy_cannon";
			}
			item[37] = {
				perk = "perk/player/weapons/heavy_cannon/bolt_action";
			}
			item[38] = {
				perk = "perk/player/weapons/heavy_cannon/bolt_action_faster_movement";
			}
			item[39] = {
				perk = "perk/player/weapons/heavy_cannon/bolt_action_faster_reload";
			}
			item[40] = {
				perk = "perk/player/weapons/heavy_cannon/bolt_action_mastery_upgrades";
			}
			item[41] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate";
				equip = true;
			}
			item[42] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate_faster_charge";
				equip = true;
			}
			item[43] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate_primary_charge";
				equip = true;
			}
			item[44] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate_faster_recharge";
				equip = true;
			}
			item[45] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate_mastery";
				equip = true;
			}
			item[46] = {
				item = "weapon/player/plasma_rifle";
			}
			item[47] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_aoe";
			}
			item[48] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_aoe_no_primary_delay";
				equip = true;
			}
			item[49] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_aoe_faster_charge";
				equip = true;
			}
			item[50] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_aoe_mastery";
				equip = true;
			}
			item[51] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_microwave";
				equip = true;
			}
			item[52] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_microwave_faster_charge";
				equip = true;
			}
			item[53] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_microwave_max_range";
				equip = true;
			}
			item[54] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_microwave_mastery";
				equip = true;
			}
			item[55] = {
				item = "weapon/player/rocket_launcher";
			}
			item[56] = {
				perk = "perk/player/weapons/rocket_launcher/detonate";
				equip = true;
			}
			item[57] = {
				perk = "perk/player/weapons/rocket_launcher/detonate_proximity_flare";
				equip = true;
			}
			item[58] = {
				perk = "perk/player/weapons/rocket_launcher/detonate_concussive";
				equip = true;
			}
			item[59] = {
				perk = "perk/player/weapons/rocket_launcher/detonate_explosive_array_horizontal";
				equip = true;
			}
			item[60] = {
				perk = "perk/player/weapons/rocket_launcher/detonate_mastery";
				equip = true;
			}
			item[61] = {
				perk = "perk/player/weapons/rocket_launcher/lock_on";
			}
			item[62] = {
				perk = "perk/player/weapons/rocket_launcher/lockon_faster_recovery";
				equip = true;
			}
			item[63] = {
				perk = "perk/player/weapons/rocket_launcher/lockon_decrease_lock_time";
				equip = true;
			}
			item[64] = {
				perk = "perk/player/weapons/rocket_launcher/lockon_mastery";
				equip = true;
			}
			item[65] = {
				item = "weapon/player/double_barrel";
			}
			item[66] = {
				perk = "perk/player/weapons/double_barrel/meat_hook_faster_reload";
				equip = true;
			}
			item[67] = {
				perk = "perk/player/weapons/double_barrel/default_faster_reload";
				equip = true;
			}
			item[68] = {
				perk = "perk/player/weapons/double_barrel/meat_hook_mastery";
				equip = true;
			}
			item[69] = {
				item = "weapon/player/gauss_rifle";
			}
			item[70] = {
				perk = "perk/player/weapons/gauss_cannon/ballista";
				equip = true;
			}
			item[71] = {
				perk = "perk/player/weapons/gauss_cannon/ballista_movement";
				equip = true;
			}
			item[72] = {
				perk = "perk/player/weapons/gauss_cannon/ballista_larger_explosion";
				equip = true;
			}
			item[73] = {
				perk = "perk/player/weapons/gauss_cannon/ballista_mastery";
				equip = true;
			}
			item[74] = {
				perk = "perk/player/weapons/gauss_cannon/destroyer";
			}
			item[75] = {
				perk = "perk/player/weapons/gauss_cannon/destroyer_charge_levels_aoe";
				equip = true;
			}
			item[76] = {
				perk = "perk/player/weapons/gauss_cannon/destroyer_faster_charge_and_recovery";
				equip = true;
			}
			item[77] = {
				perk = "perk/player/weapons/gauss_cannon/destroyer_charge_levels";
				equip = true;
			}
			item[78] = {
				item = "weapon/player/chaingun";
			}
			item[79] = {
				perk = "perk/player/weapons/chaingun/turret";
				equip = true;
			}
			item[80] = {
				perk = "perk/player/weapons/chaingun/turret_faster_equip";
				equip = true;
			}
			item[81] = {
				perk = "perk/player/weapons/chaingun/turret_faster_movement";
				equip = true;
			}
			item[82] = {
				perk = "perk/player/weapons/chaingun/turret_mastery";
				equip = true;
			}
			item[83] = {
				perk = "perk/player/weapons/chaingun/energy_shell";
			}
			item[84] = {
				perk = "perk/player/weapons/chaingun/energy_shell_faster_recharge";
				equip = true;
			}
			item[85] = {
				perk = "perk/player/weapons/chaingun/energy_shell_dash_smash";
				equip = true;
			}
			item[86] = {
				perk = "perk/player/weapons/chaingun/energy_shell_mastery";
				equip = true;
			}
			item[87] = {
				item = "weapon/player/bfg";
			}
			item[88] = {
				item = "weapon/player/unmaykr";
			}
			item[89] = {
				perk = "perk/player/argent/armor_capacity_0";
			}
			item[90] = {
				perk = "perk/player/argent/armor_capacity_1";
			}
			item[91] = {
				perk = "perk/player/argent/armor_capacity_2";
			}
			item[92] = {
				perk = "perk/player/argent/armor_capacity_3";
			}
			item[93] = {
				perk = "perk/player/argent/health_capacity_0";
			}
			item[94] = {
				perk = "perk/player/argent/health_capacity_1";
			}
			item[95] = {
				perk = "perk/player/argent/health_capacity_2";
			}
			item[96] = {
				perk = "perk/player/argent/health_capacity_3";
			}
			item[97] = {
				perk = "perk/player/suit/powerup/powerup_duration";
				equip = true;
			}
			item[98] = {
				perk = "perk/player/suit/self_preservation/reduce_hazard_damage";
				equip = true;
			}
			item[99] = {
				perk = "perk/player/suit/self_preservation/reduce_self_weapon_damage";
				equip = true;
			}
			item[100] = {
				perk = "perk/player/suit/extermination/barrels_respawn";
				equip = true;
			}
			item[101] = {
				perk = "perk/player/suit/extermination/barrels_drop_ammo";
				equip = true;
			}
			item[102] = {
				perk = "perk/player/equipment/frag_reduce_cooldown";
				equip = true;
			}
			item[103] = {
				perk = "perk/player/equipment/frag_concussive_blast";
				equip = true;
			}
			item[104] = {
				perk = "perk/player/equipment/frag_cluster_bombs";
				equip = true;
			}
			item[105] = {
				perk = "perk/player/equipment/frag_max_capacity";
				equip = true;
			}
			item[106] = {
				perk = "perk/player/equipment/ice_reduce_cooldown";
				equip = true;
			}
			item[107] = {
				perk = "perk/player/equipment/ice_extend_duration";
				equip = true;
			}
			item[108] = {
				perk = "perk/player/equipment/ice_health_drops";
				equip = true;
			}
			item[109] = {
				perk = "perk/player/equipment/ice_melee_shatter";
				equip = true;
			}
			item[110] = {
				perk = "perk/player/suit/fundamentals/ledge_grab_speed";
				equip = true;
			}
			item[111] = {
				perk = "perk/player/suit/fundamentals/weapon_change_speed";
				equip = true;
			}
			item[112] = {
				perk = "perk/player/suit/dash/dash_regen_delay";
				equip = true;
			}
			item[113] = {
				perk = "perk/player/suit/dash/dash_gk_restore_dash";
				equip = true;
			}
			item[114] = {
				perk = "perk/player/suit/exploration/automap_shows_map_station";
				equip = true;
			}
			item[115] = {
				perk = "perk/player/suit/exploration/automap_shows_progression_items";
				equip = true;
			}
			item[116] = {
				perk = "perk/player/suit/exploration/automap_increased_fog_radius";
				equip = true;
			}
			item[117] = {
				perk = "perk/player/suit/exploration/dossier_shows_progression_items";
				equip = true;
			}
			item[118] = {
				perk = "perk/player/runes/glory_kill_speed";
				isRune = true;
			}
			item[119] = {
				perk = "perk/player/runes/glory_kill_dash";
				isRune = true;
			}
			item[120] = {
				perk = "perk/player/runes/speed_boost_on_glory_kill";
				isRune = true;
			}
			item[121] = {
				perk = "perk/player/runes/double_jump_air_control";
				isRune = true;
			}
			item[122] = {
				perk = "perk/player/runes/modify_enemy_stagger_duration";
				isRune = true;
			}
			item[123] = {
				perk = "perk/player/runes/activate_focus_on_death_blow";
				isRune = true;
			}
			item[124] = {
				perk = "perk/player/runes/target_strike";
				isRune = true;
			}
			item[125] = {
				perk = "perk/player/runes/decrease_equipment_recharge";
				isRune = true;
			}
			item[126] = {
				perk = "perk/player/runes/blood_punch_loot_on_damage";
				isRune = true;
			}
		}
		currencyToGive = {
			num = 4;
			item[0] = {
				count = 0;
			}
			item[1] = {
				currencyType = "CURRENCY_PRAETOR_UPGRADE";
				count = 0;
			}
			item[2] = {
				currencyType = "CURRENCY_WEAPON_MASTERY";
				count = 0;
			}
			item[3] = {
				currencyType = "CURRENCY_SENTINEL_BATTERY";
				count = 0;
			}
		}
		statsToGive = {
			num = 3;
			item[0] = "STAT_SUIT_PAGE_UNLOCKED";
			item[1] = "STAT_RUNE_PAGE_UNLOCKED";
			item[2] = "STAT_CHALLENGE_PAGE_UNLOCKED";
		}
		codexEntriesToGive = {
			num = 86;
			item[0] = "codex/tutorials/empowered_demon";
			item[1] = "codex/tutorials/secret";
			item[2] = "codex/tutorials/dlc_mission_select";
			item[3] = "codex/tutorials/dlc_cheat_codes";
			item[4] = "codex/tutorials/unmaykr";
			item[5] = "codex/tutorials/glory_kill";
			item[6] = "codex/tutorials/double_jump";
			item[7] = "codex/tutorials/chainsaw";
			item[8] = "codex/tutorials/objective_marker";
			item[9] = "codex/tutorials/dlc_mods";
			item[10] = "codex/tutorials/weapon_wheel";
			item[11] = "codex/tutorials/weak_point_arachnotron";
			item[12] = "codex/tutorials/weak_point_cacodemon";
			item[13] = "codex/tutorials/weak_point_revenant";
			item[14] = "codex/tutorials/weak_point_mancubus";
			item[15] = "codex/tutorials/plasma_vs_shields";
			item[16] = "codex/tutorials/cueball";
			item[17] = "codex/tutorials/weak_point_pinky";
			item[18] = "codex/tutorials/weak_point_doomhunter";
			item[19] = "codex/tutorials/weak_point_cyber_mancubus";
			item[20] = "codex/tutorials/weak_point_marauder";
			item[21] = "codex/tutorials/weak_point_maykr_zombie";
			item[22] = "codex/tutorials/archvile";
			item[23] = "codex/tutorials/automap_station";
			item[24] = "codex/tutorials/extra_lives";
			item[25] = "codex/tutorials/powerups";
			item[26] = "codex/tutorials/wall_climb";
			item[27] = "codex/tutorials/fast_travel";
			item[28] = "codex/tutorials/equipment_frag";
			item[29] = "codex/tutorials/equipment_flame";
			item[30] = "codex/tutorials/equipment_ice";
			item[31] = "codex/tutorials/dlc_blood_punch";
			item[32] = "codex/tutorials/rune";
			item[33] = "codex/tutorials/dash";
			item[34] = "codex/tutorials/dash_refill";
			item[35] = "codex/tutorials/super_shotgun";
			item[36] = "codex/tutorials/buffpod";
			item[37] = "codex/tutorials/rad_suit";
			item[38] = "codex/tutorials/bfg";
			item[39] = "codex/tutorials/rune";
			item[40] = "codex/hell/demon_header";
			item[41] = "codex/hell/demon_class_fodder";
			item[43] = "codex/hell/demon_zombie_earth";
			item[44] = "codex/hell/demon_imp";
			item[45] = "codex/hell/demon_soldier_blaster";
			item[46] = "codex/hell/demon_gargoyle";
			item[47] = "codex/hell/demon_lostsoul";
			item[48] = "codex/hell/demon_class_heavy";
			item[49] = "codex/hell/demon_arachnotron";
			item[50] = "codex/hell/demon_cacodemon";
			item[51] = "codex/hell/demon_carcass";
			item[52] = "codex/hell/demon_mancubus_cyber";
			item[53] = "codex/hell/demon_dreadknight";
			item[54] = "codex/hell/demon_hellknight";
			item[55] = "codex/hell/demon_mancubus_fire";
			item[56] = "codex/hell/demon_painelemental";
			item[57] = "codex/hell/demon_pinky";
			item[58] = "codex/hell/demon_prowler";
			item[59] = "codex/hell/demon_revenant";
			item[60] = "codex/hell/demon_pinky_spectre";
			item[61] = "codex/hell/demon_whiplash";
			item[62] = "codex/maykr/maykr_drones";
			item[63] = "codex/hell/demon_class_superheavy";
			item[64] = "codex/hell/demon_archvile";
			item[65] = "codex/hell/demon_baronofhell";
			item[66] = "codex/hell/demon_doom_hunter";
			item[67] = "codex/hell/demon_marauder";
			item[68] = "codex/hell/demon_tyrant";
			item[69] = "codex/hell/demon_class_ambient";
			item[70] = "codex/hell/demon_buffpod";
			item[71] = "codex/hell/demon_cueball";
			item[72] = "codex/hell/demon_tentacle";
			item[73] = "codex/slayer/arsenal_header";
			item[74] = "codex/slayer/arsenal_doomblade";
			item[75] = "codex/slayer/arsenal_ballista";
			item[76] = "codex/slayer/arsenal_bfg";
			item[77] = "codex/slayer/arsenal_chaingun";
			item[78] = "codex/slayer/arsenal_chainsaw";
			item[79] = "codex/slayer/arsenal_combat_shotgun";
			item[80] = "codex/slayer/arsenal_equipment_launcher";
			item[81] = "codex/slayer/arsenal_heavy_cannon";
			item[82] = "codex/slayer/arsenal_plasmarifle";
			item[83] = "codex/slayer/arsenal_rocketlauncher";
			item[84] = "codex/slayer/arsenal_super_shotgun";
			item[85] = "codex/slayer/arsenal_unmaykr";
		}
		clearAllBeforeApply = true;
	}
}

```

<span style="text-decoration: underline;">**Inheritance Example**</span>

dlc/e4m2\_swamp.decl, shown below, imports all inventory items from e4m1\_rig.decl. In addition to the items given on UAC Atlantica, Blood Swamps starts the player off with all support runes unlocked.

<p class="callout info">devinvloadout decls are stored in level-specific archives that are only loaded when that map is played, so modified copies of e4m1\_rig.decl will only affect DLC levels it is installed to via Eternal Mod Injector, unless you use assetsinfo to import those resources into a level that otherwise would not have that file.  
</p>

```
{
	inherit = "devinvloadout/dlc/e4m1_rig";
	edit = {
		startingInventory = {
			num = 130;
			item[127] = {
				perk = "perk/player/runes/dlc/blood_punch_low_health_bonus_damage";
				isRune = true;
			}
			item[128] = {
				perk = "perk/player/runes/dlc/extra_life_refund";
				isRune = true;
			}
			item[129] = {
				perk = "perk/player/runes/dlc/weakpoint_concussive_blast";
				isRune = true;
			}
		}
	}
}
```

**<span style="text-decoration: underline;">Multiplayer  
</span>** pvp/complete.decl controls the slayer's inventory when joining an online match.

<p class="callout danger">Do not put the chaingun shield or ice bomb into any inventory that will be loaded in multiplayer, both of these are known to crash clients.</p>

<p class="callout warning">Also avoid using Chrono Strike and Saving Throw, these do not quite work as expected. if the mod is meant to be played with multiple slayers, also avoid equipment fiend and break blast; these tend to activate multiple times and are therefore far more effective than intended.</p>

```
{
	edit = {
		startingInventory = {
			num = 69;
			item[0] = {
				item = "abilities/grapplegloves";
			}
			item[1] = {
				item = "abilities/environmentsuit";
			}
			item[2] = {
				item = "jumpboots/base";
				equip = true;
			}
			item[3] = {
				item = "ability_dash_pvp";
				equip = true;
			}
			item[4] = {
				perk = "perk/player/suit/fundamentals/increase_pickup_radius";
				equip = true;
			}
			item[5] = {
				perk = "perk/pvp/slayer/speed_boost_on_sync_kill";
				equip = true;
			}
			item[6] = {
				perk = "perk/player/suit/fundamentals/ledge_grab_speed";
				equip = true;
			}
			item[7] = {
				perk = "perk/player/suit/fundamentals/weapon_change_speed";
				equip = true;
			}
			item[8] = {
				perk = "perk/player/suit/fundamentals/weapon_mod_speed";
				equip = true;
			}
			item[9] = {
				perk = "perk/player/equipment/flame_extend_duration";
				equip = true;
			}
			item[10] = {
				perk = "perk/pvp/slayer/eor_upgrade_frag_reduce_cooldown_level_1";
				equip = true;
			}
			item[11] = {
				perk = "perk/player/equipment/frag_concussive_blast";
				equip = true;
			}
			item[12] = {
				perk = "perk/player/blood_punch/ai_charge_rate";
				equip = true;
			}
			item[13] = {
				perk = "perk/player/argent/health_capacity_pvp";
				equip = true;
			}
			item[14] = {
				perk = "perk/player/argent/armor_capacity_pvp";
				equip = true;
			}
			item[15] = {
				item = "equipmentlauncher/equipmentlauncherleft";
				equip = true;
			}
			item[16] = {
				item = "throwable/player/frag_grenade";
				equip = true;
			}
			item[17] = {
				item = "weapon/player/fists";
			}
			item[18] = {
				item = "abilities/blood_punch";
				equip = true;
			}
			item[19] = {
				item = "weapon/player/shotgun";
				equip = true;
			}
			item[20] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto";
			}
			item[21] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_faster_recovery";
			}
			item[22] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_faster_charge";
			}
			item[23] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_increased_movement_speed";
			}
			item[24] = {
				perk = "perk/player/weapons/shotgun/secondary_full_auto_ammo_giveback";
			}
			item[25] = {
				perk = "perk/player/weapons/shotgun/pop_rocket";
				equip = true;
			}
			item[26] = {
				perk = "perk/player/weapons/shotgun/pop_rocket_faster_recharge";
				equip = true;
			}
			item[27] = {
				perk = "perk/player/weapons/shotgun/pop_rocket_larger_explosion";
				equip = true;
			}
			item[28] = {
				perk = "perk/player/weapons/shotgun/pop_rocket_more_bombs";
				equip = true;
			}
			item[29] = {
				item = "weapon/player/double_barrel";
			}
			item[30] = {
				perk = "perk/player/weapons/double_barrel/default_faster_reload";
				equip = true;
			}
			item[31] = {
				perk = "perk/player/weapons/double_barrel/meat_hook_faster_reload";
				equip = true;
			}
			item[32] = {
				perk = "perk/player/weapons/double_barrel/meat_hook_mastery";
				equip = true;
			}
			item[33] = {
				item = "weapon/player/plasma_rifle";
			}
			item[34] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_aoe";
				equip = true;
			}
			item[35] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_aoe_no_primary_delay";
				equip = true;
			}
			item[36] = {
				perk = "perk/player/weapons/plasma_rifle/secondary_aoe_faster_charge";
				equip = true;
			}
			item[37] = {
				item = "weapon/player/gauss_rifle";
			}
			item[38] = {
				perk = "perk/player/weapons/gauss_cannon/ballista";
				equip = true;
			}
			item[39] = {
				perk = "perk/player/weapons/gauss_cannon/ballista_movement";
				equip = true;
			}
			item[40] = {
				perk = "perk/player/weapons/gauss_cannon/ballista_larger_explosion";
				equip = true;
			}
			item[41] = {
				item = "weapon/player/heavy_cannon";
			}
			item[42] = {
				perk = "perk/player/weapons/heavy_cannon/bolt_action";
				equip = true;
			}
			item[43] = {
				perk = "perk/player/weapons/heavy_cannon/bolt_action_faster_movement";
				equip = true;
			}
			item[44] = {
				perk = "perk/player/weapons/heavy_cannon/bolt_action_mastery_upgrades";
				equip = true;
			}
			item[45] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate";
				equip = true;
			}
			item[46] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate_faster_recharge";
				equip = true;
			}
			item[47] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate_faster_charge";
				equip = true;
			}
			item[48] = {
				perk = "perk/player/weapons/heavy_cannon/burst_detonate_primary_charge";
				equip = true;
			}
			item[49] = {
				item = "weapon/player/chaingun";
			}
			item[50] = {
				perk = "perk/player/weapons/chaingun/turret";
				equip = true;
			}
			item[51] = {
				perk = "perk/player/weapons/chaingun/turret_faster_equip";
				equip = true;
			}
			item[52] = {
				perk = "perk/player/weapons/chaingun/turret_faster_movement";
				equip = true;
			}
			item[53] = {
				item = "weapon/player/rocket_launcher";
			}
			item[54] = {
				perk = "perk/player/weapons/rocket_launcher/detonate";
			}
			item[55] = {
				perk = "perk/player/weapons/rocket_launcher/detonate_proximity_flare";
				equip = true;
			}
			item[56] = {
				perk = "perk/player/weapons/rocket_launcher/lock_on";
				equip = true;
			}
			item[57] = {
				perk = "perk/player/weapons/rocket_launcher/lockon_faster_recovery";
				equip = true;
			}
			item[58] = {
				item = "weapon/player/chainsaw";
			}
			item[59] = {
				item = "ammo/sharedammopool/shells";
				count = 999;
				applyAfterLoadout = true;
			}
			item[60] = {
				item = "ammo/sharedammopool/cells";
				count = 999;
				applyAfterLoadout = true;
			}
			item[61] = {
				item = "ammo/sharedammopool/bullets";
				count = 999;
				applyAfterLoadout = true;
			}
			item[62] = {
				item = "ammo/sharedammopool/rockets";
				count = 999;
				applyAfterLoadout = true;
			}
			item[63] = {
				item = "ammo/sharedammopool/fuel";
			}
			item[64] = {
				overrides = {
					num = 1;
					item[0] = "pvp_bfg_extra_ammo";
				}
				item = "ammo/sharedammopool/bfg";
				count = 30;
			}
			item[65] = {
				item = "equipmentlauncher/equipmentlauncherright_restricted";
			}
			item[66] = {
				item = "weapon/player/equipment_flame_belch";
				equip = true;
			}
			item[67] = {
				perk = "perk/pvp/slayer/chainsaw_ammo_regen_default";
				equip = true;
			}
			item[68] = {
				perk = "perk/pvp/slayer/eor_upgrade_cut_up";
				equip = true;
			}
		}
	}
}
```