5. Level Modding

Information for creating custom levels and encounters. Documentation on event calls, entity types, etc.

Beginner's Guide

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

Beginner's Guide

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.

Beginner's Guide

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.

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.

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

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 replace 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!

Beginner's Guide

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.

3. NotePad++ to edit the .entities file with. You may also use EntityHero, 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.

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.

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. The latest version, v7.2, no longer gives you the infamous Revenant Jetpack crash, although I still use v6.69.

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

Beginner's Guide

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:

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.

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.

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

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 <--

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.

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.

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.

Beginner's Guide

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.

 

Beginner's Guide

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:

An .entities file purely consists of defined entities, or entitydefs. Entitydefs can be anything from triggers to encounter managers to pickups.

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.

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.

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

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.

Beginner's Guide

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.

Beginner's Guide

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

Tools

Information about the tools necessary for Level Modding.

Tools

Getting Started

Entities Files

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

Example:
e1m1_intro_patch1/maps/game/sp/e1m1_intro/e1m1_intro.entities
> This is the level file path for Hell on Earth.

Remember to check for the highest resource load priority for the level

M347h00k:

M347h00k (aka Meathook or MH) originally by Chrispy - Download
> M347h00k unlocks developer commands and allows you to edit your level in-game.
> 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

EntityHero by Scorp0rX0r - Download
> EntityHero is a tool to help newer modders into level modding. It helps with organizing entities and makes it easier to move around eventCalls.
> To install: Download the EntityHero.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.

Tools

Text Editor

Notepad++ is the Recommended Text Editor to Use


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

Decompressing Tools:

EntityHero by Scorp0rX0r - Download
File -> Export to text (make sure the file extension is still .entities)

SAMUEL Asset Extraction Tool by SamPT - Download
Currently exports textures, .decls, and .entities files.

idFileDecompressor by proteh - Download

Even though the .entities file is decompressed, make sure it still retains the .entities file extension.

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
Example:
overrides/maps/game/sp/e1m1_intro/e1m1_intro.entities
> This is the level file path for Hell on Earth.

You can place as many level files you like in the overrides folder

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.

Tools

EntityHero

EntityHero by Scorp0rX0r - Download

EntityHero is a tool to help newer modders into level modding. It helps with organizing entities and makes it easier to move around eventCalls.
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.


EntityHero does not require you to decompress .entities files.

You can open the compressed files within the application, but you should be in your chosen level and use
File -> Open from MH to open the M347h00k instance. Be sure so save your instance somewhere.
With EntityHero, you can press the button, "Reload level" and it will perform the command "mh_force_reload" for you.

To avoid issues, do most of the typing in a text editor (such as Notepad++). Copy an entity or eventCall and paste them into the text editor, make your changes, then copy that and paste it back into where it was.
When pasting eventCalls, ignore the "item[#] = {" bracket because it would sometimes throw an error.

Copying from EntityHero to Text Editor:

1. Copy the eventCall selected
image-1631056663562.png
2. Paste into text editor
image-1631056944137.png
3. Make your changes and only copy the following
image-1631056883313.png
4. Reinsert the eventCall into EntityHeroimage-1631057148235.png
5. If you are replacing an eventCall, delete the original one, but you can always add more eventCalls this way.

Issues with EntityHero:

EntityHero can be a bit weird and is prone to crashes. Be sure to frequently save to avoid loosing progress.

Newer versions of EntityHero tend to mitigate these issues so you may not experience any of these.

Entities

A description of various entities that shape the level.

Entities

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
Entities

idAI2

An entity for AI/NPCs, usually demons.

idAI2 can be individually placed throughout a map, or more preferably, spawned with an 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.

idAI2 entities can greatly vary based on the AI.

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;
		}
	}
}
}
Entities

idArchvileTemplate

An entity to control what ai types an Archvile can summon.

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

 

Entities

idDestructible

An entity that can be destroyed by certain actions.

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;
	}
}
}
Entities

idDynamicEntity

An entity that consists of various objects not connected to the level geometry.

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";
		}
	}
}
}

Simply activating the entity can toggle its hide flag.

See Also

activateTarget

idTarget_Count (Relays)

Entities

idEncounterManager

An entity that scripts the encounters. This is what is used to spawn in demons.

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 show what volume trigger would activate the encounter.

exitTriggers show what volume trigger would turn off the encounter.

userFlagTriggers 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";
		}
	}
}
}
Entities

idEncounterTrigger_Commit

An entity used to trigger an encounter manager

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

idEncounterTrigger_Exit

 

Entities

idEncounterTrigger_Exit

An entity used to end an encounter manager

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

idEncounterTrigger_Commit

Entities

idEncounterTrigger_RaiseUserFlag

An entity used to trigger (raise a flag) for encounters.

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 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.

If you only plan on triggering the User Flag through activateTarget, then clipModel dimensions would not be needed.

waitForEventFlag is the eventCall that this entity signals.

The Encounter Manager must contain the idEncounterTrigger_RaiseUserFlag entity for it to recognize the flag name.

Entities

idEntityFx

An entity that will play FX.

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;
			}
		}
	}
}
}
Entities

idEnvironmentalDamage_Hurt_Trigger

An entity that deals damage when entering its volume. Essentially the damaging part of a hazard.

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;
		}
	}
}
}

Hurt triggers are usually invisible so you should add a particle entity on it to convey its physical dimensions.

See Also

idParticleEmitter

Entities

idGameChallenge

An entity that determines the game mode for the level. Only one idGameChallenge entity can exist per entities file.

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;
		}
	}
}
}
Entities

idGuiEntity_Text

An entity that displays text in the world.

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
	}
}
}

String customization applies to both BLANG files and idGuiEntity_Text entities.

See Also

Entities

idInteractable

An entity that is interactable with a melee input.

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.

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 & 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;
				}
			}
		}
	}
}
}
Entities

idMover

An entity that can move around on pre-programmed paths, and also scripted to move around from timelines.

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.

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.
Entities

idMusicEntity

Music Entities are used to play music in the level.

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
	}
}
}

> This Music Entity will play ambient music from Hell on Earth.


Not all Music Entities are structured the exact same way.
The music for Super Gore Nest, Mars Core, and the Hub have their usage shown below:

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
	}
}
}

> 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 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.

Music States Per Level:

Hell on Earth:
Switch State: intro_music
Ghost States: main_ambient, main_light, main_heavy, additional_reveal, cine_1, cine_2, cine_3

Exultia/Taras Nabad:
Switch State: slayer_city_music
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, cine_4

Cultist Base:
Switch State: cultist_base_music
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2

Doom Hunter Base:
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

Super Gore Nest 1:
Switch State: supergorenest_music
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2
Secondary Switch: sgn_combat_suite_1

Super Gore Nest 2:
Switch State: supergorenest_music
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2
Secondary Switch: sgn_combat_suite_2

ARC Complex:
Switch State: samuelsbase_music
Ghost States: main_ambient, main_light, main_heavy

Phobos:
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

Mars Core:
Switch State: mars_core_music
Ghost States: main_ambient, main_light, main_heavy, cine_1, level_marscore_painelemental, stinger
Secondary Switch: space

Sentinel Prime:
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

Nekravol:
Switch State: metal_hell_music
Ghost States: main_ambient, main_light, main_heavy

Urdak:
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

Final Sin:
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

UAC Atlantica Facility:
Switch State: dlc1_oil_rig
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, cine_6, stinger

The Blood Swamps:
Switch State: dlc1_hell_swamp_music
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2, boss_phase1, boss_phase2

The Holt:
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

The World Spear:
Switch State: dlc_2_spear
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, additional_levelstart, stinger

Reclaimed Earth:
Switch State: dlc2_overgrown_earth_music
Ghost States: main_ambient, main_light, main_heavy

Immora/The Dark Lord:
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

Hub/BFG Division:
Switch State: hub_music
Ghost States: main_ambient, main_light, main_heavy, cine_1, cine_2
Secondary Switch: hub

Blood Harvester: (unused track)
Switch State: bloodharvester_music
Ghost States: main_ambient, main_light

BATTLEMODE Music: (pvp)
Switch State: pvp
Ghost States: main_ambient, pvp_lobby, pvp_lobby_end, pvp_lobby_player_ready, pvp_lose, pvp_win, pvp_sudden_death

Classic Music: (in Slayer Tutorial)
Switch State: tutorial_switch
Ghost States: main_ambient

Entities

idParticleEmitter

An entity that emits particles.

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

Entities

idPlayerStart

An entity that defines the spawn position for players.

Single Player

entity {
	entityDef initial_player_start_1 {
	inherit = "player/start";
	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 {
	inherit = "online/battle_arena/player_start";
	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 {
	inherit = "online/battle_arena/demon_start";
	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
	}
}
}
Entities

idProp2

An entity that will spawn a pickup or barrel.

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";
	}
}
}
Entities

idProp_Coop

An entity that can create a physical obstruction for all players.

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;
	}
}
}
Entities

idSoundEntity

Sound entities are used to broadcast sounds to a player.

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

Entities

idTarget_Command

An entity to trigger the specified console commands.

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;
		}
	}
}
}

 

Entities

idTarget_Count

An entity that is commonly used for relays.

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
	}
}
}

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.

Entities

idTarget_DevLoadoutSwap

An entity that replaces the Slayer's current loadout with something else.

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

Entities

idTarget_EnableTarget

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.

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.

Entities

idTarget_FirstThinkActivate

An entity that will execute on map load.

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";
		}
	}
}
}
Entities

idTarget_LayerStateChange

An entity that can save the player's progress as a checkpoint and-as its name implies-manipulate layers.

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.

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.

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

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.

All layers in the game can be used in all levels.

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.

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)

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";
	}
}
}
Entities

idTarget_Notification

An entity that creates a notification on player's screen when triggered.

Usage

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

Not all notification types are working.

Entities

idTarget_Remove

An entity that will remove the listed entities when activated.

Usage

entity {
	entityDef example_target_remove_eternal {
	inherit = "target/remove";
	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";
        }
	}
}
}

 

Entities

idTarget_Hide

An entity that will hide the listed entities when activated.

Note that not all entities can be hidden.

Usage

entity {
	entityDef example_target_hide_eternal {
    inherit = "target/hide";
	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

Entities

idTarget_Show

An entity that will show the listed entities when activated.

Usage

entity {
	entityDef example_target_show_eternal {
    inherit = "target/show";
	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

Entities

idTarget_Spawn

An entity to spawn other entities. Primarily used for idAI2 entities.

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.

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.

Usage

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.

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;
				}
			}
		}
	}
}
}

The spawnAnim parameter varies in syntax based on what demon AI is being spawned.

Entities

idTarget_Spawn_Parent

An entity that idTargetSpawnGroup entities use to define what AI can spawn in its spawn group.

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 entities in the idTargetSpawnGroup contains their own entityDefs, then those will override the spawn parent.

You would normally want all idTarget_Spawn entities in the idTargetSpawnGroup to have no idAI2 entities attached to them.

For the sake of organization, you might want to only use one idTarget_Spawn_Parent that contains every demon idAI2 for the entire level.

Entities

idTargetSpawnGroup

An entity used to group multiple idTarget_Spawn entities.

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, maintainAICount, 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
	}
}
}

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.

See Also

Entities

idTarget_Teleport

An entity to teleport the player to the specified location when used.

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;
	}
}
}
Entities

idTrigger_Teleporter_Fade

The idTrigger_Teleporter_Fade entity defines the location where the player can teleport from with the fade effect.

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

Entities

idTarget_Timeline

An entity that plays multiple entities after a set amount of time between each event.

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;
			}
		}
	}
}
}
Entities

idTarget_Timer

When activated, displays a countdown on the player's HUD.

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.

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.

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.


Entities

idTrigger

An entity that will trigger its listed targets when used.

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.

Entities

idTrigger_GorillaBar

An entity volume that allows Slayers to swing onto.

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;
	}
}
}

Some map entities use a materialRemap to remove the render model and instead apply it to a separate idDynamicEntity.

Some monkeybar render model assets are not present in certain levels.

Entities

idTrigger_BouncePad & idInfo_BounceDestination

Entities that propel a player to a target destination.

A bounce pad consists of either three or four entities:

Each map has specific models available for rendering a jump pad.

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;
				}
			}
		}
	}
}
}
Entities

idTrigger_Teleporter & idInfo_TeleportDestination

The idTrigger_Teleporter entity defines the location where the player can teleport from.

The idInfo_TeleportDestination entity defines the location and orientation where the idTrigger_Teleporter takes the player.

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;
			}
		}
	}
}
}
Entities

idTrigger_TakeDamage & idTarget_Melee

An either shootable or punchable trigger activated when it takes damage.

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.

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";
	}
}
}
Entities

idTrigger_Push

An entity that moves players inside of it.

 


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 as a demon and walking into a portal.

Entities

idTargetableProxyHandler & idTarget_SmartAIProxy

The idTargetableProxyHandler entity defines the render model and proxy list for Meathook Nodes.

The idTarget_SmartAIProxy entity defines the grapple position for Meathook Nodes.

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)

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;
				}
			}
		}
	}
}
}
Entities

idVolume_PlayerEnvOverride

An entity to overwrite the envSettings decl set by idWorldspawn when within the defined volume.

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";
	}
}
}

 

Entities

idTarget_Codex

An entity to activate codex entries.

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.

Event Calls

activateTarget

An eventCall to activate another entity from an idEncounterManager.

Usage

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

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, so that the "You can't just shoot a hole in the surface of Mars" line is triggered once no ai remain.

 

Event Calls

clearCombatRoles

An eventCall to clear any combat roles set by a preceding setCombatRoles.

Usage

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

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

 

Event Calls

clearFactionOverrides

An eventCall to clear any faction overrides set by a preceding setFactionRelation in an idEncounterManager.

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 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

Event Calls

damageAI

An eventCall to apply a damage type to the specified ai in an idEncounterManager.

Usage

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

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.

 

Event Calls

designerComment

An eventCall for leaving a comment in an idEncounterManager.

Usage

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

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
			}
		}
	}
}

 

Event Calls

forceAIToFlee

An eventCall to that forces spawned ai in an idEncounterManager to flee.

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
			}
		}
	}
}

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
			}
		}
	}
}

 

 

Event Calls

forceChargeOnAllAI

An eventCall to make all spawned ai in an idEncounterManager charge the player.

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.

Event Calls

maintainAICount

An eventCall to maintain a certain quantity of respawning idAI2 in an idEncounterManager.

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
            }
        }
    }
}

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

 

Event Calls

makeAIAwareOfPlayer

An eventCall to make any ai entities spawned in an idEncounterManager, aware of the player.

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
			}
		}
	}
}

 

Event Calls

migrateAIFromExternalScript

An eventCall to migrate ai entities from another idEncounterManager, into the current encounter manager.

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
			}
		}
	}
}
Event Calls

proceedToNextScript

An eventCall to proceed to the next script in an idEncounterManager.

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.

See Also

 

Event Calls

raiseEventFlagOnExternalScript

An eventcall to trigger a flag on an idEncounterManager outside of the one that this eventcall is used in.

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
			}
		}
	}
}

Note that using activateTarget directly on the idEncounterTrigger_RaiseUserFlag in question can also accomplish the same effect.

Event Calls

removeAI

An eventCall to remove spawned ai entities from an idEncounterManager.

Usage

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

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 or forceAIToFlee.

 

Event Calls

setCombatRoles

An eventCall to assign roles to idAI2 in an idEncounterManager.

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
			}
		}
	}
}

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

 

Event Calls

setFactionRelation

An eventCall to force an emotion between an instigating and target faction in an idEncounterManager.

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
			}
		}
	}
}

The set emotion is only for the instigator towards the target. The target does not automatically reciprocate the same set emotion.

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

 

Event Calls

setMusicState

An eventCall to change the state of the specified idMusicEntity in an idEncounterManager.

Usage

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

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

 

Event Calls

setNextScriptIndex

An eventCall to set the index of the next script in an idEncounterManager.

Usage

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

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 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

 

Event Calls

setNextScriptIndexRandom

An eventCall to set a random index of the next script in an idEncounterManager.

Usage

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

spawnAI

An eventCall to spawn multiple idAI2 entities, simultaneously, in an idEncounterManager.

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
            }
        }
    }
}

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
			}
		}
	}
}

 

Event Calls

spawnArchvile

An eventCall to spawn an Archvile.

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
            }
        }
    }
}

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

 

 

Event Calls

spawnBuffPod

An eventCall to spawn a buff totem.

Usage

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

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.

 

Event Calls

spawnPossessedAI

An eventCall to spawn an ai that is already possessed by a spirit in an idEncounterManager.

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
			}
		}
	}
}

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

 

Event Calls

spawnSingleAI

An eventCall to spawn a single idAI2 entity in an idEncounterManager.

Usage

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

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
            }
        }
    }
}

 

Event Calls

spawnSpirit

An eventCall to spawn a spirit in an idEncounterManager.

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
			}
		}
	}
}

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

Event Calls

spawnSummoner

An eventCall to spawn a Summoner with an idSummoningTemplate

Usage

item[0] = {
	eventCall = {
		eventDef = "spawnSummoner";
		args = {
			num = 4;
			item[0] = {
				entity = ""; // spawnTarget
			}
			item[1] = {
				entity = ""; // summonerTemplate
			}
			item[2] = {
				string = ""; // summoner_label
			}
			item[3] = {
				string = ""; // group_label
			}
		}
	}
}

 

Event Calls

staggeredAISpawn

An eventCall to spawn multiple idAI2 entities, with a delay between each spawn, in an idEncounterManager.

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
            }
        }
    }
}

minSpawnStagger must be <= maxSpawnStagger

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


Event Calls

stopMaintainingAICount

An eventCall to end a maintainAICount in an idEncounterManager.

Usage

This eventCall should only be used after a maintainAICount.

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

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 will spawn 5 infinitely respawning Imps. However, once the player has killed 10 Imps, the maintainAICount will be stopped. Any Imps that are present when stopMaintainingAICount was called, will remain.

See Also

 

Event Calls

wait

An eventCall that tells the idEncounterManager to wait a specified amount of time before executing the next eventCall.

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.

Event Calls

waitAIHealthLevel

An eventCall that tells the idEncounterManager to wait until the specified ai type reaches a certain HP level, before executing the next eventCalls.

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
            }
        }
    }
}

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 <= 60% of its HP, the encounter will proceed.

 

Event Calls

waitAIRemaining

An eventCall to wait until a certain quantity of specified ai types remain in an idEncounterManager.

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
			}
		}
	}
}

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.

 

Event Calls

waitForEventFlag

An eventCall that waits until a trigger is activated, or a "flag" is raised.

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 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 is the entity that this eventCall looks for when it is activated.

The Encounter Manager must contain the idEncounterTrigger_RaiseUserFlag entity for it to recognize the flag name.

Event Calls

waitKillCount

An eventCall that tells the idEncounterManager to wait until a certain quantity of the specified ai type are killed.

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
			}
        }
    }
}

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 will spawn 5 infinitely respawning Imps or Soldiers. However, once the player has killed 10 fodder, the maintainAICount will be stopped.

 

Event Calls

waitMaintainComplete

An eventCall to wait until a preceding maintainAICount finishes.

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
			}
		}
	}
}

This eventcall only works if max_spawn_count is set to a finite amount, ex. not -1.

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 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

 

Event Calls

waitMulitpleConditions

An eventCall for using multiple wait eventCalls in an idEncounterManager.

This eventCall is spelled incorrectly in the engine ("Mulitple"), and must be used this way.

Usage

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

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.

Event Calls

waitRandomKillCount

An eventCall to wait until a random quantity of specified ai types are killed in an idEncounterManager.

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
			}
		}
	}
}

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.

 

Event Calls

waitStaggeredSpawnComplete

An eventCall to wait until the preceding staggeredAISpawn finishes.

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
			}
		}
	}
}

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 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 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

 

Type Lists

Type Lists

aiStateOverride_t

These types can also be dumped with sh_type/mh_type aiStateOverride_t

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

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

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

Type Lists

eEncounterSpawnType_t

These types can also be dumped with sh_type/mh_type eEncounterSpawnType_t

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

Type Lists

encounterGroupRole_t

These types can also be dumped with sh_type/mh_type encounterGroupRole_t

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

Type Lists

socialEmotion_t

These types can also be dumped with sh_type/mh_type socialEmotion_t

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.

Slayer 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:

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.

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.

crucible:

item = "weapon/player/crucible";

Fully upgraded Sentinel Hammer:

			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;
			}

Horde Mode Hammer:

item = "weapon/player/hammer_horde";

Runes
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;
			}

Sentinel Crystals

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;
	}
}

Inheritance Example

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.

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.

{
	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;
			}
		}
	}
}

Multiplayer
pvp/complete.decl controls the slayer's inventory when joining an online match.

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.

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.


{
	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;
			}
		}
	}
}

Level Mods List

List of all level mods that have been created, for archival purposes and ease to download. (EDIT: DOOM ETERNAL GOT UPDATED ON 09/05/2023, see the "How to Fix Mods" section in Single Maps for more info)

Level Mods List

Single Maps

Mods consisting of one level. If anyone reading knows of other mods that aren't listed here, feel free to @ the writer on Discord. There are a few more missing from one modder but they're more complicated than normal to fix and he hasn't given permissions to have them fixed (yet).


The star symbols indicate the difficulty of the levels. Levels with no rating either haven't been played by the page author or he simply doesn't remember.

(*) indicates mods that don't work on the latest version of Doom Eternal in their current form and some extra steps will be needed in order to make them work. See the bottom of the page (As of the rev2.2 update this might extend to more mods).

(**) indicates Discord-only mods, you'll want to join the server to get them if you haven't already: https://discord.gg/4CsdQ6vpA7

(***) indicates mods that existed at one point but the files aren't available anymore.

Difficulty and lenght of the levels are subjective to the page author, depending on the player they might feel more or less difficult/long

Base Campaign

Hell on Earth

Official Master Level by id Software - ★☆☆☆☆ (~15 Minutes)

Conquered Earth by Nayrham - ★★★★☆

Tormented Earth by MicrowavedBunny

Consumed Earth by Bysior21

Back on Earth by Cuzzmotion

La Grande Sheitanerie by Payoyo


Exultia

Official Master Level by id Software - ★☆☆☆☆ (~20 Minutes)

Exuden by leix34 & SeaBazT - ★★★☆☆ (~40 Minutes)

Master Level by Beth

Not Exultia by offwine - ★★★★☆ (~50 Minutes)


Cultist Base

Slaughter Map by klinecars72 - ★★★☆☆ (~35 Minutes)

Master Level by offwine - ★★★★☆ (~70 Minutes)


Doom Hunter Base

Official Master Level by id Software - ★★☆☆☆ (~20 Minutes)

Master Level by Beth

Doom Hunter Based by Zandyball - ★★★☆☆ (~40 Minutes)

Doom Hunter Fortress by TIKKETMASTER - ⛧⛧⛧⛧⛧ (???)


Super Gore Nest

Slaughter Arena by Delta - ★★☆☆☆ (~15 Minutes)

Slaughter Map by nxmxlxss - ★★★★☆ (~25 Minutes)

Master Level by offwine - ★★★★★ (~70 Minutes)

The Battle Inside by CRISCANCER

Super More Nest by ModMadder

Demon Possession Challenge by ecksdii - ★☆☆☆☆ (~25 Minutes)


Arc Complex

Master Levels by Beth

CARCH Complex by Zandyball - ★☆☆☆☆/⛧⛧⛧⛧⛧ (???)


Mars Core

Master Level by FaDa - ★☆☆☆☆ (~25 Minutes)

Master Level by Beth - ★★☆☆☆ (~25 Minutes)

Master Level by offwine

Mars Den Core by leix34 and Payoyo - ★★★★☆ (~55 Minutes)

Mars Core Remix by Konvaz


Sentinel Prime

Official Master Level by id Software - ★☆☆☆☆ (~5 Minutes)

Master Level by offwine - ★★★☆☆ (~30 Minutes)


Taras Nabad

Slaughter Map by Proteh - ★★☆☆☆ (~10 Minutes)

Master Level by Beth

Master Level by offwine - ★★★★★ (~120 Minutes)

Master Level by Saleem - ★★★★☆ (~60 Minutes)

Master Level Rework by Payoyo - ★★★☆☆ (~40 Minutes)

Master Level Tweak by fhqwhgads7

Slaughter Map by klinecars72 - ★★☆☆☆ (~30 Minutes)

(***) Master Level by Korra


Nekravol

Master Level by Beth - ★☆☆☆☆ (~20 Minutes)


Nekravol II

Master Level by Beth

Leaky Nekravol by Zandyball - ★★★☆☆ (~20 Minutes)


Urdak

(*)(**) Corrupted Khan Maykr by omi - ★★★★★ (~10 Minutes)

Master Level by Beth - ★★☆☆☆ (~20 Minutes)

Slaughter Level by Alpha - ★★★☆☆ (~25 Minutes)


Final Sin

Master Level by offwine - ★★★☆☆ (~35 Minutes)



The Ancient Gods Part 1

UAC Atlantica Facility

Master Level by Delta - ★★★★★ (~130 Minutes)

Master Level by Konvaz - ★★★☆☆ (~45 Minutes)

CBT Atlantica Facility by idk929 - ⛧⛧⛧⛧⛧ (~90 Minutes)

Skill Issue Encounter by MicrowavedBunny - ⛧⛧⛧⛧⛧ (???)

Slaughter Map by nxmxlxss - ★★★★★ (~45 Minutes)

UAC Artantica by Cuzzmotion


The Blood Swamps

Master Level by Saleem - ★★★★★ (~75 Minutes)

Master Level by Konvaz - ★★★☆☆ (~50 Minutes)

(*) Idoratrize Blood Swamps by Athollu - ⛧⛧⛧⛧⛧ (~20 Minutes)

Slaughter Map by nxmxlxss


The Holt

Descent into Chaos by TacoWenzdayz - ★★★★★ (~50 Minutes)

Master Level by Saleem - ★★★★☆ (~65 Minutes)

Master Level by offwine - ★★★★★ (~130 Minutes)

Slaughter Holt by Athollu - ★★★★☆ (~25 Minutes)

(***) Master Level by Draganescu



The Ancient Gods Part 2

The World Spear

Master Level by Delta - ★★★★★ (~80 Minutes)

Recharged World Spear by Jewstin - ★★☆☆☆ (~25 Minutes)

Slaughter Map by nxlxmxss

Demon Possession Challenge by Alby


Reclaimed Earth

(*) Master Level by Rainlight - ★★★☆☆ (~40 Minutes)

Master Level by proteh - ★★★☆☆ (~35 Minutes)

ReclaimDen by Payoyo - ★★★☆☆ (~40 Minutes)

Unreclaimed Earth by idk929 - ⛧⛧⛧⛧⛧⛧ (~90 Minutes)


Immora

Master Level by Cuzzmotion

Master Level by Konvaz


The Dark Lord

Master Level by Konvaz - ★★☆☆☆ (~15 Minutes)



Battlemode

Corrosion by Konvaz - ★★☆☆☆ (~20 Minutes)

Stronghold by Konvaz - ★★★☆☆ (~45 Minutes)

Torment by Konvaz - ★★★★☆ (~80 Minutes)

Extraction by Konvaz

Daisy's Lament by MicrowavedBunny



Randomizers

Cultist Base by offwine

Mars Core by Beth

Sentinel Prime by offwine

Taras Nabad by Payoyo

Nekravol by Beth

Urdak by Beth

UAC Atlantica by Konvaz

The Blood Swamps by Konvaz

Immora by Cuzzmotion

Misc

The Tutorial Master Level by MrEggawott

The Best Master Level of All Time by Konvaz



How to Fix Mods

Making a level work for the latest version of Doom Eternal is more often than not way simpler than one might think, all that's needed is renaming one of the folders in the correct way.

Open the zip file you downloaded, and change the final number of the "patch" folder into the ones below:

General: Due to the 09/05/2023 Update, pretty much every mod with a gameresources_patch1 folder needs it to be renamed gameresources_patch3

Urdak: e3m3_maykr_patch3 (from e3m3_maykr_patch1)

The Blood Swamps: e4m2_swamp_patch2

Reclaimed Earth: e5m2_earth_patch2

Level Mods List

Campaigns

Mostly mods consisting of multiple levels. If anyone reading knows of other mods that aren't listed here, feel free to @ the writer on Discord.


The star symbols indicate the difficulty of the campaigns. No rating means either the page author hasn't played them or they're simply hard to classify.

Difficulty of the campaigns is subjective to the page author, depending on the player they might feel more or less difficult

Base Campaign

Kaiser Campaign by Kaiser_will - ★★★★★

Master Campaign by Delta - ★★★★★

The Second Invasion by ProdeusDoom - ★★★★☆

Slaughter Campaign by nxmxlxss

Horde Mode by proteh - ★★★★☆

Boss Rush by Konvaz & Velser - ★☆☆☆☆



The Ancient Gods Part 1

Master Campaign by Delta - ★★★★☆

Horde Mode - Trial of the Dark Lord by proteh - ★★★★★

Classic Mode by Konvaz - ★★☆☆☆

Boss Rush by Konvaz & Velser - ★★☆☆☆



The Ancient Gods Part 2

Master Campaign by Delta - ★★★★☆

TAG2 Plus by fhqwhgads7 - ★★☆☆☆

TAG2 Rework by Konvaz - ★★☆☆☆

Classic Mode by Konvaz - ★★☆☆☆

Slayerpalast by various people



Battlemode

Infinite Arena Mode by Zandyball

Battlemode Slaughter Tour by Zandyball - ★★★★☆

 

 

Eternal

The Ancient Gods Scorched Earth by Will Ryan



Multiplayer

Co-op Mode by Velser & Konvaz

Deathmatch by Velser - Alby - FlavorfulGecko

Invasion Mode by Velser



Randomizers

Mega Random Slaughter Map by Konvaz

Mutator Campaign by Velser

Horde Mode Randomizer by Konvaz

TAG2 Rework by Konvaz