5. Level Modding
Information for creating custom levels and encounters. Documentation on event calls, entity types, etc.
- Beginner's Guide
- Section 1: Before you begin modding
- Section 1: What is a level mod?
- Section 1: Required tools part 1
- Section 1: Required tools part 2
- Section 2: Let's begin modding
- Section 2: idAI2s and spawns
- Section 2: Editing an encounter: Replacing
- Section 2: Editing an encounter: Adding
- Tools
- Entities
- Entities List (Doom Eternal)
- idAI2
- idArchvileTemplate
- idDestructible
- idDynamicEntity
- idEncounterManager
- idEncounterTrigger_Commit
- idEncounterTrigger_Exit
- idEncounterTrigger_RaiseUserFlag
- idEntityFx
- idEnvironmentalDamage_Hurt_Trigger
- idGameChallenge
- idGuiEntity_Text
- idInteractable
- idMover
- idMusicEntity
- idParticleEmitter
- idPlayerStart
- idProp2
- idProp_Coop
- idSoundEntity
- idTarget_Command
- idTarget_Count
- idTarget_DevLoadoutSwap
- idTarget_EnableTarget
- idTarget_FirstThinkActivate
- idTarget_LayerStateChange
- idTarget_Notification
- idTarget_Remove
- idTarget_Hide
- idTarget_Show
- idTarget_Spawn
- idTarget_Spawn_Parent
- idTargetSpawnGroup
- idTarget_Teleport
- idTrigger_Teleporter_Fade
- idTarget_Timeline
- idTarget_Timer
- idTrigger
- idTrigger_GorillaBar
- idTrigger_BouncePad & idInfo_BounceDestination
- idTrigger_Teleporter & idInfo_TeleportDestination
- idTrigger_TakeDamage & idTarget_Melee
- idTrigger_Push
- idTargetableProxyHandler & idTarget_SmartAIProxy
- idVolume_PlayerEnvOverride
- idTarget_Codex
- Event Calls
- activateTarget
- clearCombatRoles
- clearFactionOverrides
- damageAI
- designerComment
- forceAIToFlee
- forceChargeOnAllAI
- maintainAICount
- makeAIAwareOfPlayer
- migrateAIFromExternalScript
- proceedToNextScript
- raiseEventFlagOnExternalScript
- removeAI
- setCombatRoles
- setFactionRelation
- setMusicState
- setNextScriptIndex
- setNextScriptIndexRandom
- spawnAI
- spawnArchvile
- spawnBuffPod
- spawnPossessedAI
- spawnSingleAI
- spawnSpirit
- staggeredAISpawn
- stopMaintainingAICount
- wait
- waitAIHealthLevel
- waitAIRemaining
- waitForEventFlag
- waitKillCount
- waitMaintainComplete
- waitMulitpleConditions
- waitRandomKillCount
- waitStaggeredSpawnComplete
- Type Lists
- Slayer Inventory
Beginner's Guide
This guide will cover the basics required to get started with level modding.
Section 1: Before you begin modding
Section 1 will cover everything you need to know before you can begin editing or making your own enemy encounters.
There will be non-essential steps that you don't technically need to do, but it will streamline the modding process and be good in the long run. Watch out for those.
Section 1: What is a level mod?
In order to untangle the mess that is teaching the pre-requisite knowledge of being able to create level mods on your own, it is best to lay down the process step by step.
This is something I've noticed this wiki does not do. It may have a lot of useful documentation such as eventcalls and miscellaneous entities such as damage triggers, particle effects, etc., but it does not put together a concise tutorial on how to use them properly.
This guide sets out to correct this.
First, a brief write-up of what exactly level mods are and how they work.
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
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!
Section 1: Required tools part 1
Now that we know that the file we actually edit to create a level mod is the .entities file, we will need a way to edit it.
And not just edit it, but find a way to edit it on the fly so we don't need to re-compress and re-inject the file after each and every change.
It is important to note a few, crucial details, each of which will have a corresponding tool or helpful asset to help with that.
1. As you have seen in the last page, the .resources files aren't exactly openable. We will need to extract the .entities file from them to edit it.
2. If you were to open the .resources files of a map, including its _patch versions, you may notice multiple ones have their own .entities file. What gives?!
3. This .entities file is actually just text and can be opened with any text editor. Unlike id Software who uses their own software called idStudio to edit levels in a 3D environment, we are left with 2d text. An .entities file purely consists of defined entities, or entitydefs. Entitydefs can be anything from triggers to encounter managers to pickups.
Example 1: An entity that is defined to be a spawn point for a marauder.
entity {
entityDef encounter_5_marauder1 {
inherit = "target/spawn";
class = "idTarget_Spawn";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
[ The stuff that usually goes here ]
}
}
}
Example 2: An entity that is defined to be shotgun ammo.
entity {
entityDef pickups_pickup_ammo_shells_26 {
inherit = "pickup/ammo/shells";
class = "idProp2";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
[ The stuff that usually goes here]
}
}
}
4. If you ever tried to open the .entities file within an existing level mod, you may notice that it's made up of nonsense weird characters. This is because the file is compressed. Decompressed files are the plainly text versions you see, but are too large to replace an existing .entities file, which is why they are compressed before being put into a level mod.
5. Assuming you want to spawn in an enemy on a brand new spawn point, you do not have any readily available way to have your current coordinate match the file's formatting.
Example 1: A basic spawnposition and spawnorientation. Does this look like you can manually type it out by hand, every single time?
spawnOrientation = {
mat = {
mat[0] = {
x = 0.707107;
y = -0.707107;
z = 0.000000;
}
mat[1] = {
x = 0.707107;
y = 0.707107;
z=0.000000;
}
mat[2] = {
x = -0.000000;
y = 0.000000;
z = 1.000000;
}
}
}
spawnPosition = {
x = -99.080002;
y = -278.399994;
z = 22.00265;
}
If these details made no sense to you, don't worry. I will provide each tool and let you know how they work in setting up your foundation to edit a level with.
They are:
1. SAMUEL to extract the .entities file from the .resources files.
Download link for SAMUEL: GitHub
2. A list of a map's current highest priority so you know which .resources file to extract from and subsequently edit. The game uses the .entities file from the map's highest priority patch. If you choose the wrong one and have your mod replace the .entities file in the wrong patch, it won't work.
3. NotePad++ to edit the .entities file with. You may also use EntitySlayer, a program that is specifically designed to work with these files, but this guide will not use it as I have no experience with it.
Download link for NotePad++: Official website
Download link for EntitySlayer: GitHub
4. idFileDeCompressor. You will not need to use this tool to decompress extracted .entities files as SAMUEL neatly gives them to you already readable and editable, but you will need it to re-compress them when packing them in the final .zip file in order to let level mods use it without giving you a memory error. EntitySlayer also has an option to compress files without the need of a dedicated compressor tool.
Download link for idFileDeCompressor: GitHub
5. meathook.dll. This tool is so useful for level modding that without it, I would say at least 99% of all master level mods would not exist today because they would've taken too long to make, ludicrously long. Meathook allows for on the fly editing and without it level modders would've been stuck re-compressing and re-injecting their edited .entities file over and over.
Download link for v7.2: Direct download
Next up, we will go over how to use these tools to set up your foundation for making a level mod.
Section 1: Required tools part 2
Now that you have the needed tools, let's go over how to use them to set up your level mod. Don't worry, you'll be editing encounters in a step or two.
First, do the following:
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.
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.
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:
- Learning about idAI2(s), idTarget_Spawn(s), idTargetSpawnGroup(s), and idTarget_Spawn_Parent.
- Using this knowledge to replace an existing demon in an existing encounter, then to...
- Create and spawn a new demon in an existing encounter, then to...
- Create an entirely new encounter.
Afterwards, we will move on to section 3, which will consist of just about everything else you can do in an encounter such as changing the music state, making and spawning our own orange barriers, event flags, and activating hazards.
Section 4 will cover all the miscellaneous stuff such as importing DLC ai and resources.
Section 2: idAI2s and spawns
Before we edit an encounter, we need to know about the behind-the-scenes elements going on.
Specifically, this section will cover idAI2s and spawns.
idAI2s
Earlier, I said that:
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:
- entitydefs
- aistateoverride
- spawnOrientation
- spawnPosition
It is these four, and only these four, that matter.
Here is an example of a custom spawn point, notice how it references our Imp idAI2 from earlier. I have also marked the other important things to edit with comments.
entity {
entityDef custom_imp_spawn_1 {
inherit = "target/spawn";
class = "idTarget_Spawn";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
noFlood = true;
}
spawnConditions = {
maxCount = 0;
reuseDelaySec = 0;
doBoundsTest = false;
boundsTestType = "BOUNDSTEST_NONE";
fovCheck = 0;
minDistance = 0;
maxDistance = 0;
neighborSpawnerDistance = -1;
LOS_Test = "LOS_NONE";
playerToTest = "PLAYER_SP";
conditionProxy = "";
}
spawnEditableShared = {
groupName = "";
deathTrigger = "";
coverRadius = 0;
maxEnemyCoverDistance = 0;
}
entityDefs = {
num = 1;
item[0] = {
name = "ai_custom_imp"; // the idAI2 is referenced in here
}
}
conductorEntityAIType = "SPAWN_AI_TYPE_ANY";
initialEntityDefs = {
num = 0;
}
spawnEditable = {
spawnAt = "";
copyTargets = false;
additionalTargets = {
num = 0;
}
overwriteTraversalFlags = true;
traversalClassFlags = "CLASS_A";
combatHintClass = "CLASS_ALL";
spawnAnim = "";
aiStateOverride = "AIOVERRIDE_TELEPORT"; // this specifies that this ai will spawn in alongside the red teleport FX you see
initialTargetOverride = "";
}
portal = "";
targetSpawnParent = "";
disablePooling = false;
spawnOrientation = { // this is where the ai will face when it's spawned. it is ignored if the ai is teleported in.
mat = {
mat[0] = {
x = -1.000000;
y = -0.000000;
z = -0.000000;
}
mat[1] = {
x = 0.000000;
y = -1.000000;
z=0.000000;
}
mat[2] = {
x = -0.000000;
y = 0.000000;
z = 1.000000;
}
}
}
spawnPosition = { // this is the spawn position of the ai
x = -30.209999;
y = -11.000000;
z = -10;
}
}
}
}
Everything else in the target spawn can, and should, be ignored.
You can use the same idAI2 for as many target spawns as you want. For example I can very much have every single new spawn point I make that I want to support an imp all use "ai_custom_imp".
This is how idAI2s and idTarget_Spawns work with each other. The idAI2 is just an entity for a specific demon that target spawns will take and place wherever you want, however many times you want.
Before going into encounter editing, we ought to go over two more entities that use idTarget_Spawns, idTargetSpawnGroups and idTarget_Spawn_Parent, and how they are used in an encounter as well.
After that, we will go over incorporating all of this into an encounter in the next page, including how to obtain usable positions for our custom spawn points.
idTargetSpawnGroups
Earlier, you may have noticed that I said target spawns must reference an idAI2 in one of two ways, either by itself (which you have been given an example of above) or by being part of a spawn group that references a spawn parent that references idAI2s.
Spawn groups are special entities that are a set of multiple target spawns. On their own, they may sound useless (why bother when I want to spawn individual demons in?) but they are crucial for things like maintained AI (which you must have for respawning fodder) or if you want to just spawn many demons at once without having a whole lot of spawnSingleAIs.
Here is an example of an idTargetSpawnGroup below:
entity {
entityDef custom_spawn_group_1 {
inherit = "encounter/spawn_group/zone";
class = "idTargetSpawnGroup";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
spawnPosition = {
x = 0;
y = 0;
z = -1000;
}
renderModelInfo = {
model = NULL;
}
clipModelInfo = {
clipModelName = NULL;
}
spawners = {
num = 4;
item[0] = "custom_ai_spawn_1";
item[1] = "custom_ai_spawn_2";
item[2] = "custom_ai_spawn_3";
item[3] = "custom_ai_spawn_4";
}
targetSpawnParent = "custom_spawn_parent";
}
}
}
Individual target spawns in these groups may have zero entitydefs defined, for so long as the spawn parent contains the idAI2 you wish to use.
What did I just mean by that? Let's see an example of a spawn parent:
idTarget_Spawn_Parents
Much like how a spawn group is a collection of target spawns, a spawn parent is a collection of idAI2s. Groups and parents go hand in hand to allow for more flexibility when placing down demons in an encounter.
Here is an example, pretend these idAI2s are already present in your file.
entity {
entityDef custom_spawn_parent_1 {
inherit = "encounter/spawn_group/parent";
class = "idTarget_Spawn_Parent";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
noFlood = true;
}
spawnConditions = {
maxCount = 0;
reuseDelaySec = 0;
doBoundsTest = false;
boundsTestType = "BOUNDSTEST_NONE";
fovCheck = 0;
minDistance = 0;
maxDistance = 0;
neighborSpawnerDistance = -1;
LOS_Test = "LOS_NONE";
playerToTest = "PLAYER_SP";
conditionProxy = "";
}
spawnEditableShared = {
groupName = "";
deathTrigger = "";
coverRadius = 0;
maxEnemyCoverDistance = 0;
}
entityDefs = {
num = 2;
item[0] = {
name = "ai_custom_imp";
}
item[1] = {
name = "ai_custom_pinky";
}
}
conductorEntityAIType = "SPAWN_AI_TYPE_ANY";
initialEntityDefs = {
num = 0;
}
spawnPosition = {
x = 17.0000057;
y = 1209.99939;
z = 185.500961;
}
targets = {
num = 2;
item[0] = "ai_custom_imp";
item[1] = "ai_custom_pinky";
}
}
}
}
When I say flexibility, I mean that when I use these two, I can change the ai spawned in an encounter on the fly without having to go into their individual spawn points and change the linked idAI2.
Instead, hypothetically, every spawn point can be part of a spawn group that is linked to a spawn parent that contains the idAI2s of every ai supported in the level (if DLC ai is not supported in the level, adding a DLC idAI2 into the file will not make it work on its own.)
You can reference the same spawn parent multiple times, so I use a "master parent" that does indeed contain every supported idAI2 in the specific level I'm working on at the time.
When you're spawning in individual demons in an encounter, you may choose to forgo putting in specific idAI2s in your spawn points in favor of this system if you so choose, but it is mandatory when having respawning enemies or spawning multiple enemies at once in its own specialized function rather than having multiple spawnSingleAIs.
Next step, we will bring our knowledge of idAI2s, idTargetSpawns, idTargetSpawnGroups, and idTarget_Spawn_Parents to finally be able to edit an encounter in a way you want to.
Section 2: Editing an encounter: Replacing
Most people who want to make level mods, myself included, first got to the "let's open the .entities file" part of the process, saw the unorganized chaos it presented, and backed out.
With our pre-requisite knowledge, perhaps now it won't seem as overwhelming.
We're going to begin editing our first encounter by replacing one single enemy within.
Extract the .entities file of the level of your choice and get all your things in order - having a backup file, knowing where the file to extract them from is alongside which version of the file is the correct one, etc.
Do the music change text to make sure you have everything setup, and refer back to section 1 if you have any difficulties.
Load in the level itself and head to the encounter you wish to edit. This is where meathook will begin to shine as an important level modding tool. First, enable 'notarget' in the console to make life easier, then type in 'mh_active_encounter' to grab the name of the encounter itself. CTRL+F the name of said encounter in your .entities file.
If you know how the specific encounter you've chosen works, it should be easy to line up what you see in game with what the listed steps are in the file.
Now, you might think it's as easy as simply replacing, say, ENCOUNTER_SPAWN_ZOMBIE_TIER_1 with ENCOUNTER_SPAWN_IMP, and it is. Mostly.
But don't forget. The eventdef that spawns a demon not only has the type of demon to spawn, but also which spawn point to use. Refer to the previous section. If you use a spawn point that doesn't support the idAI2 you want it to spawn, the game will crash.
Luckily, this problem is easily solvable, simply add the idAI2 of your desired demon type into the spawn point. The name of an existing idAI2 can be simply found elsewhere in the file, or one can be made by you.
For more documentation on types of eventdefs, please refer to the Event Calls section of this wiki.
Section 2: Editing an encounter: Adding
I'm going to be frank, I think ProdeusDoom does a much better job of explaining it, check it out here:
https://www.youtube.com/watch?v=HgzoFr9Zaf8
Tools
Information about the tools necessary for Level Modding.
Getting Started
Entities Files
Levels are edited through ".entities" files and are saved in:<resource>/maps/game/<campaign>/<level_name>/<level_name>.entities
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
EntitySlayer by FlavorfulGecko5 - Download
> EntitySlayer is an easy yet powerful entity editing tool that lists entities as nodes, while providing advanced features such as filtering, searching, multi-node selection.
> To install: Download the Entity Slayer zip and extract its contents to whatever folder you want. Make sure to copy oocore_8_win64.dll from DOOM Eternal's installation directory to the folder.
Text Editor
Notepad++ is the Recommended Text Editor to Use
.entities files are compressed and must be decompressed in order to edit Entities.
Decompressing Tools:
EntitySlayer by FlavorfulGecko5 - 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 PowerBall253 - 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.
EntitySlayer
EntitySlayer by FlavorfulGecko5 - Download
EntitySlayer is an easy yet powerful entity editing tool that lists entities as nodes, while providing advanced features such as filtering, searching, multi-node selection.
To install: Extract the files to whatever folder you want. Make sure to copyoocore_8_win64.dllfrom DOOM Eternal's installation directory to the folder.
EntitySlayer 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 Meathook instance. Be sure so save your instance somewhere.
With EntitySlayer, you can press the button, "Reload level" and it will perform the command "mh_force_reload" for you.
If you wish, you can copy an entity into a dedicated text editor like Notepad++, make changes there, then copy the result back to EntitySlayer.
Copying from EntitySlayer to Text Editor:
1. Copy the eventCall selected
2. Paste into text editor
3. Make your changes and only copy the following
4. Reinsert the eventCall into EntitySlayer
5. If you are replacing an eventCall, delete the original one, but you can always add more eventCalls this way.
Entities
A description of various entities that shape the level.
Entities List (Doom Eternal)
An incomplete list of known entity classes in Doom Eternal:
idAASObstacle
idAASReachability
idAbnormalPlayerMetrics
idActionNode
idActor
idActorAmbientFilter
idActorWorkNode
idAFEntity_Corpse
idAFEntity_Dummy
idAFEntity_Generic
idAFEntity_GetUpTest
idAI2
idAIAASHint
idAICombatHint
idAICombatHint_SuppressionFirePoint
idAIDeathVolume
idAIDebugCamera
idAIHint
idAIHintGroup
idAIInteraction
idAIMapMarkupEntity
idAISearchHintAnimation
idAISearchHintAuto
idAISearchHintGroup
idAITest
idAITest_Rotation
idAlignedEntity
idAmbientNodeExclusionArea
idAmbientNodeGenerationArea
idAmbientTriggerModifier_SetAITypes
idAnimated
idAnimated_AnimWeb
idAnimated_AnimWeb_Samuel
idAnimated_ThreatSensor
idAnimatedAttachment
idAnimatedAttachment_AF
idAnimatedEntity
idAnimatedInteractable
idAnimatedSimple_AnimSys
idAnimatedSimple_Faust
idAnimCamera
idAnimNode
idAnnouncementManager
idArchvileTemplate
idAutomapMapGroupRevealEntity
idAutomapSectionRevealTrigger
idBarricade
idBasePropSpawner
idBFG_Geyser
idBfgBurn
idBillboard
idBloatedEntity
idBossInfo
idBotActionEntity
idBotActionEntity_Info
idBotActionEntity_Info_POI
idBotActionEntity_Info_RoamGoal
idBotActionEntity_Usable
idBotPathNodeEntity
idBreakable
idBreakablePlatform
idBuildArea
idCamera
idCameraView
idCampaignInvaderStart
idCaptureFrames
idCinematicCamera
idCollectibleEntity
idCollisionExclusionVolume
idCollisionStreamArea
idCombatGrouping
idCombatVolume
idCoopStartingInventory
idCrusher
idCyberdemonMissileShooter
idDamageableAttachment
idDeathmatchPlayerStart
idDebrisEntity
idDecalEntity
idDecalEntity_Coop
idDemonPlayer
idDemonPlayer_Arachnotron
idDemonPlayer_Archvile
idDemonPlayer_Baron
idDemonPlayer_Cacodemon
idDemonPlayer_Mancubus
idDemonPlayer_Marauder
idDemonPlayer_PainElemental
idDemonPlayer_Pinky
idDemonPlayer_Prowler
idDemonPlayer_Revenant
idDemonPlayer_Summoner
idDemonPlayerStart
idDestroyableProp
idDestructible
idDestructibleManager
idDynamicEntity
idDynamicEntity_Damageable
idDynamicVisibilityBlocker
idEditorModelEntity
idElectricBoltEmitter
idEncounterAmbientAudio
idEncounterGroupMgr
idEncounterManager
idEncounterModifier_Reset
idEncounterModifier_SetEnabledState
idEncounterModifier_SetNextScriptIndex
idEncounterTrigger_AmbientAIAudio
idEncounterTrigger_Commit
idEncounterTrigger_Exit
idEncounterTrigger_OverrideCombatGrouping
idEncounterTrigger_PreCombat
idEncounterTrigger_RaiseUserFlag
idEncounterVolume_ValidCover
idEnergyShell
idEngineEntity
idEntity
idEntityCamera
idEntityFx
idEntityFxRandom
idEnvArea
idEnvironmentalDamage_Hurt_Trigger
idEnvironmentalDamage_Point
idEnvironmentalDamage_PointManager_Trigger
idEscapePod
idExtraLifeTeleportLocation
idFlightVolumeTraversalSpline
idFreeCamera
idFreeDbgCam
idFuncRotate
idFuncShadowCaster
idFuncSwing
idGameChallenge
idGameChallenge_CampaignSinglePlayer
idGameChallenge_Horde
idGameChallenge_PVP
idGameChallenge_PVPTutorial
idGameChallenge_Shell
idGeomCacheEntity
idGladiatorShield
idGoreEntity
idGuiEntity
idGuiEntity_Cinematic
idGuiEntity_Text
idHeightmapVolumeEntity
idHighlightBehavior
idHighlightBehavior_Augment
idInfluenceSpawnSettings
idInfo
idInfo_BounceDestination
idInfo_DoorTraversalChain
idInfo_FastTravel
idInfo_SpawnConditionProxy
idInfo_TeleportDestination
idInfo_TraversalBase
idInfo_TraversalChain
idInfo_TraversalPoint
idInfo_Trigger_Facing_Target
idInfo_UniversalTraversal
idInfoAAS
idInfoAmbient
idInfoBounds
idInfoCloudShot
idInfoCover
idInfoCoverExposed
idInfoDebugMarker
idInfoExportHint
idInfoFlightVolumeEntrance
idInfoFocus
idInfoGoalPosition
idInfoLevelFadeIn
idInfoLookTarget
idInfoLookTargetGroup
idInfoOrbit
idInfoPath
idInfoPlayerHud
idInfoRoam
idInfoRuler
idInfoSpawnPoint
idInfoSplineChild
idInfoStandPoint
idInfoTexLod
idInfoTraversal
idInfoTraversal_Bot
idInfoTraversal_Ultimate
idInfoTraversalEndPoint
idInfoWaitForButtonAfterLoad
idInteractable
idInteractable_Automap
idInteractable_BatterySocket
idInteractable_Challenge_Shrine
idInteractable_CollectibleViewer
idInteractable_CurrencyExchange
idInteractable_Doom
idInteractable_EliteGuard
idInteractable_EliteGuard_Coop
idInteractable_GiveItems
idInteractable_GoreBud
idInteractable_GoreNest
idInteractable_HighlightSelector
idInteractable_JukeBox
idInteractable_LootCrate
idInteractable_LootDrop
idInteractable_Minigame
idInteractable_Moveable
idInteractable_NightmareMarker
idInteractable_Obstacle
idInteractable_Respec
idInteractable_Rune
idInteractable_Shooter
idInteractable_SlayerGate
idInteractable_SlayerGate_Coop
idInteractable_SonicBoost
idInteractable_Tutorial
idInteractable_VegaTraining
idInteractable_WeaponModBot
idInteractable_WorldCache
idInteractionCamera
idInvasionAreaManager
idInvasionBlocker
idInventoryStorage
idIOS_MeteorCrater
idItemPropSpawner
idJostleAnimated
idJostleSpring
idJostleSwivel
idLensFlare
idLight
idLogicEntity
idLowGravityMover
idMidnightCutscene
idMover
idMoverModifier
idMultiplayerTrigger
idMusicEntity
idNetworkedEntityFx
idNetworkedParticleEmitter
idNetworkLight
idObjective_Relay
idOverTheShoulderCamera
idParticleEmitter
idPathCorner
idPerceptionVolume
idPhotoModeCamera
idPieceEmitter
idPlayer
idPlayerStart
idPortalSurface
idPortalWorld
idPoseableEntity
idProjectile
idProjectile_AIHomingRocket
idProjectile_Auger
idProjectile_BfgArc
idProjectile_BfgBurn
idProjectile_CacoDemonRocket
idProjectile_CyberdemonSwarmMissile
idProjectile_DamageOverTime
idProjectile_Destroyer
idProjectile_EMP
idProjectile_Grenade
idProjectile_GrenadeFast
idProjectile_Mancubus_Smoke
idProjectile_MeatHook
idProjectile_Rocket
idProjectile_RollingFire
idProjectile_SiphonGrenade
idProjectile_SwarmMissile
idProjectile_SwarmMissile_V2
idProjectileShield
idProp
idProp_AIArmor
idProp_ArmorPickup
idProp_Breakable
idProp_BreakableLoot
idProp_ContinuallyUsed
idProp_Coop
idProp_Coop_Billboard
idProp_DemonCircle
idProp_ElectricArmor
idProp_Explosive
idProp_HealthPickup
idProp_Moveable
idProp_OnlineCollectible
idProp_Pickup
idProp_PlayableDemonCircle
idProp_Spawnable
idProp_Static
idProp_Usable
idProp_WeaponPickup
idProp_WeaponStatic
idProp2
idPurifyingBeam
idReferenceMap
idRegenArea
idResurrectionProxy
idRibbon2Emitter
idRiftBuildPosition
idRotatableCamera
idSlowMotionCamera
idSoundAreaEntity
idSoundBeamEntity
idSoundBoxEntity
idSoundEntity
idSoundPrefetchEntity
idSoundSphereEntity
idSoundSubtitlesEntity
idSoundTrigger
idSpawnArea
idSpawnNode
idSpawnNodeSplines
idSpawnPoint
idSpectacleCamera
idSpectatorCamera
idSpitfireCannon
idSplinePath
idSpringCamera
idStaticEntity
idStaticMultiGuiEntity
idStaticVisibilityBlocker
idStaticWaterEntity
idSummoningTemplate
idSyncEntity
idTarget
idTarget_ActionScript
idTarget_AdaptiveTickToggle
idTarget_AIEvent
idTarget_AIGlobalSettings
idTarget_AIProxy
idTarget_AmplitudeTrigger
idTarget_AnimWebChangeState
idTarget_AnimWebChangeStateVia
idTarget_AnimWebPause
idTarget_AnimWebUnpause
idTarget_ApplyExplosionImpulse
idTarget_ApplyImpulse
idTarget_Award_Adrenaline
idTarget_Award_RushAttack
idTarget_Break
idTarget_ChangeColor
idTarget_ChangeMaterial
idTarget_ChangeVolume_PlayerEnvOverride
idTarget_ClearFakeEnemy
idTarget_Codex
idTarget_CollisionDamage
idTarget_Command
idTarget_Conditional
idTarget_ConditionalAccessor
idTarget_Count
idTarget_Count_Random
idTarget_Credits
idTarget_CurrencyCheck
idTarget_Cvar
idTarget_Damage
idTarget_DeactivateStatusEffects
idTarget_DemonBountyAiTypes
idTarget_DevLoadoutSwap
idTarget_DisableEscMenu
idTarget_DisableInvasion
idTarget_Disconnect
idTarget_Disconnect_GoToScreen
idTarget_DormancyRadius
idTarget_DummyFire
idTarget_DynamicChallenge_End
idTarget_DynamicChallenge_FailChallenge
idTarget_DynamicChallenge_GiveBonus
idTarget_DynamicChallenge_PointTrigger
idTarget_DynamicChallenge_Start
idTarget_EnableAIEvent
idTarget_EnableGroup
idTarget_EnableTarget
idTarget_EncounterChallenge
idTarget_EndInvasion
idTarget_EndOfCampaign
idTarget_Enemy
idTarget_EquipItem
idTarget_FadeComplete
idTarget_FakeEnemy
idTarget_FastTravelInhibit
idTarget_FastTravelUnlock
idTarget_FireWeapon
idTarget_FirstThinkActivate
idTarget_ForceDormancy
idTarget_ForceGroupRole
idTarget_GameChallengeGameOver
idTarget_GameStateIntInc
idTarget_GameStateIntSet
idTarget_GeomCacheStreamer
idTarget_GiveItems
idTarget_GiveWeaponUpgradePoints
idTarget_GroupExpression
idTarget_GroupMessage
idTarget_GUICommand
idTarget_Hide
idTarget_HideHands
idTarget_InteractionAction
idTarget_Intro
idTarget_InventoryCheck
idTarget_LayerStateChange
idTarget_LevelTransition
idTarget_LightController
idTarget_MakeActivatable
idTarget_MapGroupUnlock
idTarget_Melee
idTarget_ModifyGroup
idTarget_ModifyTraversalClass
idTarget_Notification
idTarget_Objective_Complete
idTarget_Objective_Give
idTarget_Objective_HideEntities
idTarget_Objective_Replace
idTarget_Objective_Triggered
idTarget_Path
idTarget_Perk
idTarget_Ping
idTarget_PlayerCheckpoint
idTarget_PlayerInvulnerability
idTarget_PlayerModifier
idTarget_PlayerStatModifier
idTarget_PlayerStatus
idTarget_PlayerViewEffect
idTarget_PlayerWhiplash
idTarget_PlayVoiceOver
idTarget_PodiumSpawn
idTarget_POI
idTarget_Print
idTarget_RandomImpulse
idTarget_Remove
idTarget_RemoveItems
idTarget_RemoveSaveGate
idTarget_Secret
idTarget_SetGroupCombatStage
idTarget_SetInEncounterGroup
idTarget_SetSpawnSpot
idTarget_ShakeTrigger
idTarget_Show
idTarget_ShowGui
idTarget_ShowHands
idTarget_Snap_Objective
idTarget_SoundDuck
idTarget_Spawn
idTarget_Spawn_Parent
idTarget_Spawn_Target
idTarget_StartSoundShader
idTarget_Subtitle
idTarget_SwapFaction
idTarget_SwapNavMesh
idTarget_Teleport
idTarget_TestPlayerState
idTarget_Timeline
idTarget_Timer
idTarget_TutorialGui
idTarget_UnlockUltraNightmare
idTarget_ViewPos
idTarget_VisibilityController
idTargetSpawnGroup
idTeamCapturePoint
idTeleporterPad
idTendrilEye
idTest_MetaData_Bounds
idTest_MetaData_Circle
idTest_MetaData_Cylinder
idTest_MetaData_Cylinder2
idTest_MetaData_Fov
idTest_MetaData_FovPitch
idTest_MetaData_FovYaw
idTest_MetaData_Line
idTest_MetaData_Model
idTest_MetaData_MoveableSpheres
idTest_MetaData_Plane
idTest_MetaData_SectorPitch
idTest_MetaData_SectorYaw
idTest_MetaData_String
idTest_MetaData_Target
idTest_MetaData_WebPath
idTest_Sector
idTestEntity
idTestModel2
idTexlodNodeGenerationArea
idToucher
idTrailerCamera
idTrigger
idTrigger_AIInteraction
idTrigger_BouncePad
idTrigger_ChallengeBoundry
idTrigger_Damage
idTrigger_DemonDamageOutModifier
idTrigger_Dormancy
idTrigger_DummyFire
idTrigger_DynamicHurt
idTrigger_EnergyField
idTrigger_Facing
idTrigger_ForcePlayerBodyReactionOnce
idTrigger_GorillaBar
idTrigger_Hurt
idTrigger_InvasionAreaEnter
idTrigger_InvasionAreaExit
idTrigger_ModPlayerVelocity
idTrigger_MovementModifier
idTrigger_Multiplayer
idTrigger_Push
idTrigger_RemoveEntities
idTrigger_RemoveInventoryItems
idTrigger_Repulsor
idTrigger_SonicBoom
idTrigger_StatDrivenEvent
idTrigger_TakeDamage
idTrigger_Teleporter
idTrigger_Teleporter_Fade
idTrigger_TestPlayerState
idTrigger_VisibilityController
idTrigger_VoiceCommunication
idTriggerToucher
idTurret
idUmbraVisibilityContributionVolume
idUmbraVolume
idUtilityCamera
idVolume
idVolume_Blocking
idVolume_ControlPointSpawnInfluence
idVolume_CustomLedgeGrab
idVolume_Damage
idVolume_DamageOverTime
idVolume_DemonicBait
idVolume_DemonicPossession
idVolume_DeployedLaser
idVolume_DoomGravity
idVolume_EmpField
idVolume_Flight
idVolume_FlightObstacle
idVolume_ForceDormant
idVolume_Gravity
idVolume_Invasion
idVolume_InvasionInhibit
idVolume_InvasionSpawnZone
idVolume_KillDownedInjured
idVolume_LightRigModifier
idVolume_LocationCalling
idVolume_MancubusFlamethrower
idVolume_MancubusSteam
idVolume_MancubusSteamFX
idVolume_MatterBallWarp
idVolume_OliviasGuardFight_DangerZone
idVolume_PlacedFlightVolume
idVolume_PlasmaPuddle
idVolume_PlasmaPuddleFX
idVolume_PlayerBodyReaction
idVolume_PlayerEnvOverride
idVolume_PlayerUseProxy
idVolume_PlayerViewEffect
idVolume_RevivePlayer
idVolume_RunCycleHint
idVolume_RuneHint
idVolume_SecretHint
idVolume_Siphon
idVolume_SpaceWarp
idVolume_Stairs
idVolume_StatusEffect
idVolume_StealthField
idVolume_StreamTreeMarkup
idVolume_ToggleableDamageOverTime
idVolume_TogglePlayerBodyReaction
idVolume_TraversalGen
idVolume_Trigger
idVolume_VisualImpairment
idWaterEntity
idWaveShield
idWeaponEntity
idWorldClipBounds
idWorldspawn
jakesDevWidget
idAI2
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;
}
}
}
}
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
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;
}
}
}
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
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";
}
}
}
}
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
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
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.
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;
}
}
}
}
}
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
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;
}
}
}
}
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
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;
}
}
}
}
}
}
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:
offsetOrientation- Rotate by Angles (roll, pitch,yaw)offsetDestination- Move by offset (X Y Z units from current position)destinationEntity(sp?) - Move to an entities current position.- Activate a list of entities when a scripted movement starts, or ends.
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
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
idPlayerStart
An entity that defines the spawn position for players.
Single Player
entity {
entityDef initial_player_start_1 {
class = "idPlayerStart";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
noFlood = true;
}
spawnPosition = {
x = 1;
y = 1;
z = 1;
}
spawnOrientation = {
mat = {
mat[0] = {
x = 0;
y = 1;
}
mat[1] = {
x = -1;
y = 0;
}
}
}
targets = {
num = 1;
item[0] = "some_post_checkpoint_relay"; // optional, trigger these entities when a checkpoint using this spawn is loaded.
}
}
}
}
Multiplayer - Slayer
entity {
entityDef game_online_battle_arena_player_start_1 {
class = "idPlayerStart";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = true;
disableAIPooling = false;
edit = {
spawnPosition = {
x = 1;
y = 1;
z = 1;
}
spawnOrientation = {
mat = {
mat[0] = {
x = 0;
y = 1;
}
mat[1] = {
x = -1;
y = 0;
}
}
}
team = "TEAM_ONE";
respawnOnly = false; // can slayer players respawn in this location
}
}
}
Multiplayer - Demon
entity {
entityDef game_online_battle_arena_demon_start_1 {
class = "idDemonPlayerStart";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = true;
disableAIPooling = false;
edit = {
spawnPosition = {
x = 1;
y = 1;
z = 1;
}
spawnOrientation = {
mat = {
mat[0] = {
x = 0;
y = 1;
}
mat[1] = {
x = -1;
y = 0;
}
}
}
team = "TEAM_TWO";
respawnOnly = false; // can demon players respawn in this location
}
}
}
idProp2
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";
}
}
}
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;
}
}
}
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
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;
}
}
}
}
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.
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
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.
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";
}
}
}
}
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";
}
}
}
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.
idTarget_Remove
An entity that will remove the listed entities when activated.
Usage
entity {
entityDef example_target_remove_eternal {
class = "idTarget_Remove";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
noFlood = true;
}
spawnPosition = {
x = 0;
y = 0;
z = 0;
}
targets = { // list of entities to remove
num = 1;
item[0] = "example_func_dynamic";
}
}
}
}
idTarget_Hide
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 {
class = "idTarget_Hide";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
noFlood = true;
}
spawnPosition = {
x = 5;
y = -105;
z = -15;
}
targets = { // list of entities to hide
num = 1;
item[0] = "example_proxy";
}
reuseable = true; // if false, this target will be single use
}
}
}
See Also
idTarget_Show
An entity that will show the listed entities when activated.
Usage
entity {
entityDef example_target_show_eternal {
class = "idTarget_Show";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
noFlood = true;
}
spawnPosition = {
x = 13;
y = -76;
z = -5;
}
targets = {
num = 1;
item[0] = "func_dynamic_vista_example";
}
reuseable = true; // if false, this target will be single use
}
}
}
See Also
idTarget_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.
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.
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
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;
}
}
}
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
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;
}
}
}
}
}
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.
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.
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.
idTrigger_BouncePad & idInfo_BounceDestination
Entities that propel a player to a target destination.
A bounce pad consists of either three or four entities:
- A trigger that actually launches the player.
- A destination for the trigger to target.
- A particle emitter.
- Dynamic entities to render the pad on the ground. Some pads might be made of multiple models spread across multiple dynamic entities, other pads instead are rendered by the map geometry itself and have no dynamic entities at all, and therefore cannot entirely be visually removed.
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;
}
}
}
}
}
}
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;
}
}
}
}
}
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";
}
}
}
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.
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;
}
}
}
}
}
}
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";
}
}
}
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.
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
}
}
}
}
targetis the entity that is being activated.designCommentis an optional parameter for the user, and does not show up in game.
Example Usage
entity { // You Can't Just Shoot a Hole into the Surface of Mars
entityDef mod_soundentity_samuel_vo_shoot_mars {
inherit = "sound/soundentity";
class = "idSoundEntity";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
temporarySoundEvent = true;
spawnPosition = {
x = 4.20000553;
y = 0.449982464;
z = 12.1500015;
}
soundOcclusionBypass = true;
startEvents = {
num = 1;
item[0] = "play_vo_samuel_hubsamuel_hookup_you_cant_just_shoot__ghost52033";
}
}
}
}
item[0] = {
eventCall = {
eventDef = "waitAIRemaining";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
}
item[1] = {
int = 0; // desired_remaing_ai_count
}
item[2] = {
string = ""; // group_label
}
}
}
}
item[1] = {
eventCall = {
eventDef = "activateTarget";
args = {
num = 2;
item[0] = {
entity = "mod_soundentity_samuel_vo_shoot_mars"; // target
}
item[1] = {
string = "Play Hayden's audio for the Mars Hole line"; // designComment
}
}
}
}
First we place an idSoundEntity with the name mod_soundentity_samuel_vo_shoot_mars in the .entities, and then within the encounter manager, we can use activateTarget on mod_soundentity_samuel_vo_shoot_mars after our waitAIRemaining, so that the "You can't just shoot a hole in the surface of Mars" line is triggered once no ai remain.
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
}
}
}
}
spawnTypeare theeEncounterSpawnType_twhose role should be cleared.group_labelis the label for the ai whose role should be cleared. This parameter is optional, and can be left blank.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
}
item[1] = {
entity = "ai_target_spawn_454";
}
item[2] = {
string = "defender";
}
}
}
}
item[1] = {
eventCall = {
eventDef = "setCombatRoles";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType
}
item[1] = {
string = "defender"; // group_label
}
item[2] = {
encounterGroupRole_t = "ROLE_DEFEND"; // group_role
}
}
}
}
item[2] = {
eventCall = {
eventDef = "waitAIHealthLevel";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
}
item[1] = {
float = 0.5; // target_group_health
}
item[2] = {
string = ""; // group_label
}
}
}
}
item[3] = {
eventCall = {
eventDef = "clearCombatRoles";
args = {
num = 2;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS"; // spawnType
}
item[1] = {
string = "defender"; // group_label
}
}
}
}
In this example, we spawn a Mancubus which is set to ROLE_DEFEND. Once it reaches 50% HP, we use clearCombatRoles to clear the defend role.
See Also
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
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
}
}
}
}
damageTypeis the path to the decl for the damage type to be used.aiTypeare theeEncounterSpawnType_tthat you want the damage to be applied to.group_labelis the label assigned to the ai that will be damaged by this eventCall. This parameter is optional, and can be left blank.
Example Usage
item[0] = {
eventCall = {
eventDef = "damageAI";
args = {
num = 3;
item[0] = {
decl = {
damage = "damage/triggerhurt/triggerhurt1000_instagib"; // damageType
}
}
item[1] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
}
item[2] = {
string = "fodder"; // groupLabel
}
}
}
}
In this example, triggerhurt1000_instagib is applied to any ai type with the fodder label, killing them instantly.
designerComment
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
}
}
}
}
designerCommentis the comment you wish to add.printToConsoledetermines whether said comment is displayed in the console.
Example Usage
item[0] = {
eventCall = {
eventDef = "designerComment";
args = {
num = 2;
item[0] = {
string = "\nExample text between line breaks\n"; // designerComment
}
item[1] = {
bool = true; // printToConsole
}
}
}
}
forceAIToFlee
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
}
}
}
}
spawnTypeare theeEncounterSpawnType_tthat you want to flee.group_labelis the label for the ai to fleeradiusimmediateDespawnis if the ai will immediately despawn (with the despawn animation)
Example Usage
item[0] = {
eventCall = {
eventDef = "forceAIToFlee";
args = {
num = 4;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType
}
item[1] = {
string = ""; // group_label
}
item[2] = {
float = 0; // radius
}
item[3] = {
bool = true; // immediateDespawn
}
}
}
}
forceChargeOnAllAI
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.
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
}
}
}
}
spawnTypeare theeEncounterSpawnType_tthat you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list.ENCOUNTER_SPAWN_ANYcan also be used.desired_countis how many ai this eventCall should spawn up to. To avoid overlapping spawns,desired_countshould be <= the number ofidTarget_Spawnslisted under youridTargetSpawnGroup.max_spawn_countis the maximum number of ai that can be spawned by this eventCall in total. This can be set to-1for infinite respawns.min_spawn_delayis the minimum delay between each spawn, in seconds. This value also affects how soon before this eventCall spawns its first ai.min_ai_for_respawntriggers the ai respawns when they fall below or equal to the value it's set to.min_ai_for_respawnshould also be <desired_count. If it is greater thandesired_count, the quantity of demons maintained will not properly reflectdesired_count, possibly exceeding it.spawnGroupis theidTargetSpawnGroupyou want to use.group_labelis what label you want to give to the ai spawned by this eventCall. This parameter is optional, and can be left blank.max_spawn_delayis the maximum delay between each spawn, in seconds.
Example Usage
item[0] = {
eventCall = {
eventDef = "maintainAICount";
args = {
num = 8;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ZOMBIE"; // spawnType
}
item[1] = {
int = 10; // desired_count
}
item[2] = {
int = 20; // max_spawn_count
}
item[3] = {
float = 3; // min_spawn_delay
}
item[4] = {
int = 5; // min_ai_for_respawn
}
item[5] = {
entity = "ai_target_spawn_volume_76"; // spawnGroup
}
item[6] = {
string = ""; // group_label
}
item[7] = {
float = 5; // max_spawn_delay
}
}
}
}
In this example, 10 Zombies will be spawned, with a 3-5s delay between each (re)spawn. When only 5 Zombies remain, they will begin respawning until there are 10 Zombies again. Once 20 Zombies have been spawned in total, this eventCall is complete.
Notes
This eventcall appears to have functionality to adjust its kill requirements if not enough enemies are available, to prevent the encounter from locking up, due to otherwise unattainable kill requirements.
If the quantity of currently alive required enemies are greater or equal to the required kills, then the eventcall functions as normal. However, if the quantity of currently alive required enemies are less than the required kills, then the amount of enemies you need to kill is lowered to match the quantity of currently alive required enemies.
This anti-softlock functionality fails if a maintainAICount is followed by a waitKillCount sometime later in the same encounter manager, while the maintainAICount is still active. If there are not enough enemies are available in this scenario, then the waitKillCount will use the completion of the maintainAICount as one of it's requirements. Simply killing the maintained demons until its max_spawn_count is depleted will avoid soft locking in this situation. Do note that if max_spawn_count is set to -1, then the soft lock cannot be avoided.
This functionality has only been tested for in Doom Eternal.
See Also
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
}
}
}
}
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
}
}
}
}
encounterScriptis the name of the external idEncounterManager to migrate ai from.aiTypeare the ai types from the external encounter manager to be migrated.groupLabelis the label given to the migrated ai.sharedBetweenScriptsis if the migrated ai are shared between both encounter managers.
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
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
}
}
}
}
encounterScriptis the encounter manager that the user flag is foreventFlagis theeEncounterEventFlags_t(type) for the flaguserFlagis the parameter of the name in theidEncounterTrigger_RaiseUserFlagbeing triggered
Note that using activateTarget directly on the idEncounterTrigger_RaiseUserFlag in question can also accomplish the same effect.
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
}
}
}
}
spawnTypeare theeEncounterSpawnType_tthat you want to be removed.group_labelis what label for the ai to be removed by this eventCall. This parameter is optional, and can be left blank.
AI entities removed with this command will be instantly removed, without any death or despawn animation. It is best used for ai types that are not affected by damageAI or forceAIToFlee.
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
}
}
}
}
spawnTypeare theeEncounterSpawnType_tthat you want to given a role.group_labelis the label for the ai be given a role by this eventCall. This parameter is optional, and can be left blank.group_roleis theencounterGroupRole_t(combat role) that you wish to give to the specified ai.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
}
item[1] = {
entity = "ai_target_spawn_454";
}
item[2] = {
string = "defender";
}
}
}
}
item[1] = {
eventCall = {
eventDef = "setCombatRoles";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType
}
item[1] = {
string = "defender"; // group_label
}
item[2] = {
encounterGroupRole_t = "ROLE_DEFEND"; // group_role
}
}
}
}
In this example, a Mancubus is spawned with the label defender, and then setCombatRoles is used to set any ai type with the defender label to ROLE_DEFEND.
See Also
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
}
}
}
}
instigatorSpawnTypeis the ai type for the instigator.targetSpawnTypeis the ai type for the target.relationis thesocialEmotion_t(emotion) that the instigator feels towards the target.
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
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
}
}
}
}
targetis theidMusicEntityto change the state of.stateDeclis the path to the decl for theidSoundStateyou want to change it to.
Example Usage
item[0] = {
eventCall = {
eventDef = "setMusicState";
args = {
num = 3;
item[0] = {
entity = "sound_sound_musicentity_1"; // target
}
item[1] = {
decl = {
soundstate = "music_ghost_states/main_heavy"; // stateDecl
}
}
item[2] = {
string = "Change music state to heavy combat music"; // designComment
}
}
}
}
See Also
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;
}
}
}
}
nextScriptIndexis the index of next script
Example Usage
entity { // Custom Encounter #1
entityDef mod_encounter_manager_custom_1 {
inherit = "encounter/manager";
class = "idEncounterManager";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = true;
disableAIPooling = false;
edit = {
enableAIHighlightOnFinish = true;
disabledAITypeForHighlight = "AI_MONSTER_SPECTRE AI_MONSTER_BUFF_POD AI_MONSTER_TENTACLE";
playerMetricDef = "encounter/player_metrics";
chargeCombatGrouping = "encounter/combat_role/charge_command";
aiTypeDefAssignments = "actorpopulation/default/default_no_bosses";
spawnPosition = {
x = 0;
y = 0;
z = 0;
}
soundOcclusionBypass = true;
combatRatingScale = "COMBAT_RATING_SCALE_IGNORE";
encounterComponent = {
entityEvents = {
num = 2;
item[0] = { // Part 0
entity = "mod_encounter_manager_custom_1";
events = {
num = 5;
item[0] = {
eventCall = {
eventDef = "setMusicState";
args = {
num = 3;
item[0] = {
entity = "sound_sound_musicentity_1";
}
item[1] = {
decl = {
soundstate = "music_ghost_states/main_heavy";
}
}
item[2] = {
string = "";
}
}
}
}
item[1] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON";
}
item[1] = {
entity = "ai_target_spawn_87";
}
item[2] = {
string = "";
}
}
}
}
item[2] = {
eventCall = {
eventDef = "waitAIRemaining";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
}
item[1] = {
int = 0; // desired_remaing_ai_count
}
item[2] = {
string = ""; // group_label
}
}
}
}
item[3] = {
eventCall = {
eventDef = "setNextScriptIndex";
args = {
num = 1;
item[0] = { // index of next script
int = 1;
}
}
}
}
item[4] = {
eventCall = {
eventDef = "proceedToNextScript";
args = {
num = 2;
item[0] = {
bool = true; // bypassNextWaitForCommit
}
item[1] = {
bool = true; // carryOverExistingUserFlags
}
}
}
}
}
}
item[1] = { // Part 1
entity = "mod_encounter_manager_custom_1";
events = {
num = 2;
item[0] = {
eventCall = {
eventDef = "setMusicState";
args = {
num = 3;
item[0] = {
entity = "sound_sound_musicentity_1";
}
item[1] = {
decl = {
soundstate = "music_ghost_states/main_ambient";
}
}
item[2] = {
string = "";
}
}
}
}
item[1] = {
eventCall = {
eventDef = "activateTarget";
args = {
num = 2;
item[0] = {
entity = "game_target_count_cp11"; // target
}
item[1] = {
string = ""; // designComment
}
}
}
}
}
}
}
}
}
}
}
In this example we use setNextScriptIndex after all there are no ai remaning, followed by proceedToNextScript 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
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
}
}
}
}
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
}
}
}
}
spawnTypeis the ai type that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list.spawnCountis the number of ai you want to be spawned. To avoid overlapping spawns,spawnCountshould be <= the number ofidTarget_Spawnentities listed under youridTargetSpawnGroup.group_labelis the label you want to give this spawned ai. This parameter is optional and can be left blank.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnAI";
args = {
num = 4;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType
}
item[1] = {
int = 6; // spawn_count
}
item[2] = {
entity = "mod_spawngroup_1"; // spawnGroup
}
item[3] = {
string = "fodder"; // group_label
}
}
}
}
spawnArchvile
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
}
}
}
}
spawnTargetis the spawn target or spawn group to spawn the Archvile with.archvileTemplateis theidArchvileTemplateyou want to use.archvile_labelis the label given to the Archvile that is spawned. This parameter is optional and can be left blank.group_labelis the label given to demons summoned by the Archvile. This parameter is optional and can be left blank.
Note that if an Archvile is spawned without an idArchvileTemplate, it will default to being able summon all (base game?) ai types, with the exemption of another Archvile.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnArchvile";
args = {
num = 4;
item[0] = {
entity = "ai_target_spawn_111"; // spawnTarget
}
item[1] = {
entity = "mod_template_2"; // archvileTemplate
}
item[2] = {
string = "super heavy"; // archvile_label
}
item[3] = {
string = "summons"; // group_label
}
}
}
}
See Also
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
}
}
}
}
spawnTargetis the spawn target to spawn the totem at.buffpod_labelis the label for the totem itself.buffed_ai_labelis the label for the ai to buff. If this is left blank, all ai will be buffed.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
}
item[1] = {
entity = "ai_target_spawn_46"; // spawnTarget
}
item[2] = {
string = ""; // group_label
}
}
}
}
item[1] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
}
item[1] = {
entity = "ai_target_spawn_47"; // spawnTarget
}
item[2] = {
string = "buff me pls"; // group_label
}
}
}
}
item[2] = {
eventCall = {
eventDef = "spawnBuffPod";
args = {
num = 3;
item[0] = {
entity = "ai_target_spawn_451"; // spawnTarget
}
item[1] = {
string = ""; // buffpod_label
}
item[2] = {
string = "buff me pls"; // buffed_ai_label
}
}
}
}
In this example, the totem will only buff the Imp with a group_label of "buff me pls", because that matches the buffed_ai_label the totem is looking for.
spawnPossessedAI
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
}
}
}
}
ai_spawnTypeis theeEncounterSpawnType_tfor the ai to be spawned.ai_spawnTargetis the spawn target to be used for the ai to be spawned.ai_groupLabelis the label to be given to the spawned ai.spirit_spawnTargetis the spawn target to be used for the spirit.spirit_allowedAITypesare theeEncounterSpawnType_tthat the spirit is allowed to possess.spirit_allowedGroupLabelis the label that the spirit is allowed to possess.aiTypeExplicitFilteringis whether the spirit will possess ai based on the specified restrictions.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_PINKY";
}
item[1] = {
entity = "ai_target_spawn_13";
}
item[2] = {
string = "heavy";
}
}
}
}
item[1] = {
eventCall = {
eventDef = "spawnPossessedAI";
args = {
num = 7;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_REVENANT"; // ai_spawnType
}
item[1] = {
entity = "ai_target_spawn_21"; // ai_spawnTarget
}
item[2] = {
string = "beamer"; // ai_groupLabel
}
item[3] = {
entity = "ai_target_spawn_17"; // spirit_spawnTarget
}
item[4] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spirit_allowedAITypes
}
item[5] = {
string = "beamer"; // spirit_allowedGroupLabel
}
item[6] = {
bool = true; // aiTypeExplicitFiltering
}
}
}
}
In this example, we spawn a Pinky with the heavy label. Then we use spawnPossessedAI to spawn a Revenant with the beamer label, and the spirit with the ability to possess any ai type with the beamer label. This way, once the possessed Revenant is dead, there are no other ai that use the beamer label, so the spirit will be unable to possess anyone else, and will despawn.
See Also
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
}
}
}
}
spawnTypeis what ai type is spawned. Multiple types can be listed, but only a single ai entity will be spawned. Its type will be randomly chosen from this list.spawnTargetis theidTarget_Spawnentity you want to use.group_labelis the label you want to give this spawned ai. This parameter is optional and can be left blank.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
}
item[1] = {
entity = "ai_target_spawn_47"; // spawnTarget
}
item[2] = {
string = "fodder"; // group_label
}
}
}
}
spawnSpirit
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
}
}
}
}
spawnTargetis the spawn target that the spirit is to be spawned with.allowedAITypesare theeEncounterSpawnType_tthat the spirit is allowed to possess.allowed_group_labelis the label that the spirit is allowed to possess.aiTypeExplicitFilteringis whether the spirit will only possess the exact specified ai types/group label.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON";
}
item[1] = {
entity = "ai_target_spawn_17";
}
item[2] = {
string = "spider";
}
}
}
}
item[1] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON";
}
item[1] = {
entity = "ai_target_spawn_21";
}
item[2] = {
string = "possess me";
}
}
}
}
item[2] = {
eventCall = {
eventDef = "spawnSpirit";
args = {
num = 4;
item[0] = {
entity = "ai_target_spawn_26"; // spawnTarget
}
item[1] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON"; // allowedAITypes
}
item[2] = {
string = "possess me"; // allowed_group_label
}
item[3] = {
bool = true; // aiTypeExplicitFiltering
}
}
}
}
In this example, two Arachnotrons are spawned, one with a spider label, and the other with the possess me label. spawnSpirit is then used for ENCOUNTER_SPAWN_ARACHNOTRON with the possess me label, that way only the latter Arachnotron will be possessed.
See Also
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
}
}
}
}
spawnTypeis the ai type that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list.spawnCountis the number of ai you want to be spawned. To avoid overlapping spawns, spawnCount should be <= the number ofidTarget_Spawnslisted under youridTargetSpawnGroup.spawnGroupis theidTargetSpawnGroupyou want to use.group_labelis what label you want to give to the ai spawned by this eventCall. This parameter is optional, and can be left blank.minSpawnStaggeris the minimum delay between each spawn, in seconds. This value also affects how soon the first spawn in this eventCall occurs.maxSpawnStaggeris the maximum delay between spawns, in seconds.
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
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
}
}
}
}
spawnTypeis theeEncounterSpawnType_tused in the precedingmaintainAICount.ENCOUNTER_SPAWN_ANYmay also be used instead.group_labelis the label used in the precedingmaintainAICount. This parameter is optional, and may be left blank.
Example Usage
item[0] = {
eventCall = {
eventDef = "maintainAICount";
args = {
num = 8;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
}
item[1] = {
int = 5; // desired_count
}
item[2] = {
int = -1; // max_spawn_count
}
item[3] = {
float = 1; // min_spawn_delay
}
item[4] = {
int = 3; // min_ai_for_respawn
}
item[5] = {
entity = "mod_spawngroup_1"; // spawnGroup
}
item[6] = {
string = "fodder"; // group_label
}
item[7] = {
float = 2; // max_spawn_delay
}
}
}
}
item[1] = {
eventCall = {
eventDef = "waitKillCount";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
}
item[1] = {
int = 10;
}
item[2] = {
string = "fodder";
}
}
}
}
item[2] = {
eventCall = {
eventDef = "stopMaintainingAICount";
args = {
num = 2;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY";
}
item[1] = {
string = "fodder";
}
}
}
}
In this example, the maintainAICount 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
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.
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
}
}
}
}
aiTypeis theeEncounterSpawnType_twhose HP level should be checked.target_group_healthis the HP level, in decimal percentage, that you want to reach before proceeding.group_labelis the label for the specified ai type(s). This parameter is optional, can be left blank if inapplicable.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // spawnType
}
item[1] = {
entity = "game_target_spawn_1312"; // spawnTarget
}
item[2] = {
string = "check health"; // group_label
}
}
}
}
item[1] = {
eventCall = {
eventDef = "waitAIHealthLevel";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // spawnType
}
item[1] = {
float = 0.6; // target_group_health
}
item[2] = {
string = "check health"; // group_label
}
}
}
}
item[2] = {
eventCall = {
eventDef = "spawnAI";
args = {
num = 4;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CACODEMON"; // spawnType
}
item[1] = {
int = 2; // spawn_count
}
item[2] = {
entity = "mod_spawngroup_flying_7"; // spawnGroup
}
item[3] = {
string = "heavy"; // group_label
}
}
}
}
In this example, we spawn a Cyber-Mancubus with the label check_health. Then we call waitAIHealthLevel with said spawnType and group_label, with target_group_health set to 0.6, so that when the Cyber-Mancubus is <= 60% of its HP, the encounter will proceed.
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
}
}
}
}
aiTypeare theeEncounterSpawnType_tthat you want to wait on.- The encounter will wait until the quantity of specified ai types present in the encounter are less than or equal to the value of
desired_remaing_ai_count group_labelis the label that you want to wait on. This parameter is optional, and can be left blank.
Example Usage
item[0] = {
eventCall = {
eventDef = "spawnAI";
args = {
num = 4;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_SHOTGUN_SOLDIER"; // spawnType
}
item[1] = {
int = 4; // spawn_count
}
item[2] = {
entity = "mod_spawngroup_15"; // spawnGroup
}
item[3] = {
string = ""; // group_label
}
}
}
}
item[1] = {
eventCall = {
eventDef = "spawnAI";
args = {
num = 4;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER ENCOUNTER_SPAWN_BEAM_SOLDIER"; // spawnType
}
item[1] = {
int = 4; // spawn_count
}
item[2] = {
entity = "mod_spawngroup_21"; // spawnGroup
}
item[3] = {
string = ""; // group_label
}
}
}
}
item[2] = {
eventCall = {
eventDef = "waitAIRemaining";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
}
item[1] = {
int = 0; // desired_remaing_ai_count
}
item[2] = {
string = ""; // group_label
}
}
}
}
In this example, 4 Imps/Shotgunners are spawned, and 4 Soldiers/Hell Razers. By using waitAIRemaining set to ENCOUNTER_SPAWN_ANY with a desired_remaing_ai_count of 0, this ensures that all enemies will need to be killed first.
waitForEventFlag
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.
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
}
}
}
}
aiTypeis the ai type(s) that you want to wait on.desired_kill_countis how many of the specified ai type(s) you want to be killed before proceeding.group_labelis the label for the specified ai type(s). This parameter is optional, can be left blank if inapplicable.
Example Usage
item[0] = {
eventCall = {
eventDef = "maintainAICount";
args = {
num = 8;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType
}
item[1] = {
int = 5; // desired_count
}
item[2] = {
int = -1; // max_spawn_count
}
item[3] = {
float = 1; // min_spawn_delay
}
item[4] = {
int = 3; // min_ai_for_respawn
}
item[5] = {
entity = "mod_spawngroup_1"; // spawnGroup
}
item[6] = {
string = "fodder"; // group_label
}
item[7] = {
float = 2; // max_spawn_delay
}
}
}
}
item[1] = {
eventCall = {
eventDef = "waitKillCount";
args = {
num = 3;
item[0] = {
eEncounterEventFlags_t = "ENCOUNTER_SPAWN_ANY"; // aiType
}
item[1] = {
int = 10; // desired_kill_count
}
item[2] = {
string = "fodder"; // group_label
}
}
}
}
item[2] = {
eventCall = {
eventDef = "stopMaintainingAICount";
args = {
num = 2;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
}
item[1] = {
string = "fodder"; // group_label
}
}
}
}
In this example, the maintainAICount will spawn 5 infinitely respawning Imps or Soldiers. However, once the player has killed 10 fodder, the maintainAICount will be stopped.
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
}
}
}
}
aiTypeare theeEncounterSpawnType_tthat you want to be wait on.ENCOUNTER_SPAWN_ANYcan also be used.remaining_spawn_countdesired_countis how many remaining spawns this eventCall should wait on.group_labelis the same as the label given to the precedingmaintainAICount. This parameter is optional, and can be left blank.
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
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
}
}
}
}
condition_countis the amount of wait conditionslogic_operatoris the logic operator used for the wait conditions. The only operators areENCOUNTER_LOGICAL_OP_OR(any wait condition is fulfilled) andENCOUNTER_LOGICAL_OP_AND(all wait conditions are fulfilled).
Example Usage #1
item[0] = {
eventCall = {
eventDef = "waitMulitpleConditions";
args = {
num = 2;
item[0] = {
int = 2; // condition_count
}
item[1] = {
encounterLogicOperator_t = "ENCOUNTER_LOGICAL_OP_OR"; // logic_operator
}
}
}
}
item[1] = {
eventCall = {
eventDef = "wait";
args = {
num = 1;
item[0] = {
float = 10;
}
}
}
}
item[2] = {
eventCall = {
eventDef = "waitKillCount";
args = {
num = 3;
item[0] = {
eEncounterEventFlags_t = "ENCOUNTER_SPAWN_ANY";
}
item[1] = {
int = 2;
}
item[2] = {
string = "";
}
}
}
}
In this example we have two conditions, set to OR. This way, when either 10s pass or any 2 ai types are killed, the encounter proceeds.
Example Usage #2
item[0] = {
eventCall = {
eventDef = "waitMulitpleConditions";
args = {
num = 2;
item[0] = {
int = 3; // condition_count
}
item[1] = {
encounterLogicOperator_t = "ENCOUNTER_LOGICAL_OP_AND"; // logic_operator
}
}
}
}
item[1] = {
eventCall = {
eventDef = "waitAIRemaining";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON";
}
item[1] = {
int = 0; // desired_remaing_ai_count
}
item[2] = {
string = ""; // group_label
}
}
}
}
item[2] = {
eventCall = {
eventDef = "waitAIRemaining";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS";
}
item[1] = {
int = 0; // desired_remaing_ai_count
}
item[2] = {
string = ""; // group_label
}
}
}
}
item[3] = {
eventCall = {
eventDef = "wait";
args = {
num = 1;
item[0] = {
float = 5;
}
}
}
}
In this example, we have three conditions, set to AND. This way, there needs to be no Barons and Mancubi, and 5s must have passed as well, in order for the encounter to proceed.
waitRandomKillCount
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
}
}
}
}
aiTypeare theeEncounterSpawnType_tthat will be tracked for the kill count.kill_count_minis the minimum value for the random kill count.kill_count_maxis the maximum value for the random kill count.
A value will be randomly picked from between kill_count_min and kill_count_max (inclusive?). Once that kill count is achieved, the wait condition will be fulfilled.
Example Usage
item[0] = {
eventCall = {
eventDef = "waitRandomKillCount";
args = {
num = 4;
item[0] = {
eEncounterEventFlags_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // aiType
}
item[1] = {
int = 15; // kill_count_min
}
item[2] = {
int = 20; // kill_count_max
}
item[3] = {
string = "fodder"; // group_label
}
}
}
}
In this example, once between 15 and 20 Imps/Soldiers are killed, the encounter will proceed.
waitStaggeredSpawnComplete
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
}
}
}
}
aiTypeare theeEncounterSpawnType_tfrom the precedingstaggeredAISpawnthat you want to wait on.ENCOUNTER_SPAWN_ANYcan also be used.remaining_spawn_countis how many remaining spawns this eventCall should wait on.
Example Usage
item[0] = {
eventCall = {
eventDef = "staggeredAISpawn";
args = {
num = 6;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType
}
item[1] = {
int = 3; // spawn_count
}
item[2] = {
entity = "mod_spawngroup_encounter2"; // spawnGroup
}
item[3] = {
string = "fodder"; // group_label
}
item[4] = {
float = 1; // minSpawnStagger
}
item[5] = {
float = 2; // maxSpawnStagger
}
}
}
}
item[1] = {
eventCall = {
eventDef = "staggeredAISpawn";
args = {
num = 6;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType
}
item[1] = {
int = 3; // spawn_count
}
item[2] = {
entity = "mod_spawngroup_encounter2B"; // spawnGroup
}
item[3] = {
string = "fodder"; // group_label
}
item[4] = {
float = 1; // minSpawnStagger
}
item[5] = {
float = 2; // maxSpawnStagger
}
}
}
}
item[2] = {
eventCall = {
eventDef = "waitStaggeredSpawnComplete";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType
}
item[1] = {
int = 0; // remaining_spawn_count
}
item[2] = {
string = ""; // group_label
}
}
}
}
item[3] = {
eventCall = {
eventDef = "spawnSingleAI";
args = {
num = 3;
item[0] = {
eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_KNIGHT";
}
item[1] = {
entity = ai_target_spawn_23";
}
item[2] = {
string = "priority";
}
}
}
}
In this example, we have a staggeredAISpawn 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
aiStateOverride_t
These types can also be dumped with sh_type/mh_type aiStateOverride_t
Types
2016
AIOVERRIDE_DEFAULTAIOVERRIDE_FORCE_AWARENESS_OF_PLAYERAIOVERRIDE_FORCE_AWARENESS_OF_ENTITYAIOVERRIDE_FORCE_SEARCH_TO_PLAYERAIOVERRIDE_FORCE_SEARCH_TO_ENTITYAIOVERRIDE_CHARGE_MELEE_PLAYERAIOVERRIDE_PLAY_ENTRANCE_ANIMATIONAIOVERRIDE_FORCE_MOVE_TO_TRAVERSALAIOVERRIDE_FORCE_TELEPORT_TO_TRAVERSALAIOVERRIDE_TELEPORTAIOVERRIDE_TELEPORT_FORCE_SPAWN_ANGLEAIOVERRIDE_SPAWN_ANIM_IDLEAIOVERRIDE_SPAWNED_BY_SYNC_ENTITYAIOVERRIDE_WANDERAIOVERRIDE_ENTRANCE_ANIM_NO_ENEMIESAIOVERRIDE_TELEPORT_NO_ENEMIESAIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_ENTRANCEAIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_SPLINE
Eternal
AIOVERRIDE_DEFAULTAIOVERRIDE_FORCE_AWARENESS_OF_PLAYERAIOVERRIDE_FORCE_AWARENESS_OF_ENTITYAIOVERRIDE_FORCE_SEARCH_TO_PLAYERAIOVERRIDE_FORCE_SEARCH_TO_ENTITYAIOVERRIDE_CHARGE_MELEE_PLAYERAIOVERRIDE_PLAY_ENTRANCE_ANIMATIONAIOVERRIDE_PLAY_ENTRANCE_ANIMATION_WITH_CORRECTIONAIOVERRIDE_FORCE_MOVE_TO_ENTITYAIOVERRIDE_FORCE_MOVE_TO_TRAVERSALAIOVERRIDE_FORCE_TELEPORT_TO_TRAVERSALAIOVERRIDE_TELEPORTAIOVERRIDE_TELEPORT_FORCE_SPAWN_ANGLEAIOVERRIDE_SPAWN_ANIM_IDLEAIOVERRIDE_SPAWNED_BY_SYNC_ENTITYAIOVERRIDE_WANDERAIOVERRIDE_ENTRANCE_ANIM_NO_ENEMIESAIOVERRIDE_TELEPORT_NO_ENEMIESAIOVERRIDE_FORCE_TELEPORT_TO_FLIGHT_ENTRANCEAIOVERRIDE_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_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_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
eEncounterSpawnType_t
These types can also be dumped with sh_type/mh_type eEncounterSpawnType_t
Types
2016
ENCOUNTER_SPAWN_ZOMBIEENCOUNTER_SPAWN_WELDER_ZOMBIEENCOUNTER_SPAWN_IMPENCOUNTER_SPAWN_IMP_ALBINO - Unused/Cut AI typeENCOUNTER_SPAWN_HELL_SOLDIERENCOUNTER_SPAWN_SHOTGUN_SOLDIERENCOUNTER_SPAWN_BEAM_SOLDIER - Hell RazerENCOUNTER_SPAWN_LOST_SOULENCOUNTER_SPAWN_HELL_KNIGHTENCOUNTER_SPAWN_CACODEMONENCOUNTER_SPAWN_ARCHVILE - SummonerENCOUNTER_SPAWN_REVENANTENCOUNTER_SPAWN_PINKYENCOUNTER_SPAWN_SPECTREENCOUNTER_SPAWN_MANCUBUSENCOUNTER_SPAWN_CYBER_MANCUBUS ENCOUNTER_SPAWN_BARONENCOUNTER_SPAWN_CYBERDEMONENCOUNTER_SPAWN_ANY
Eternal
ENCOUNTER_SPAWN_ZOMBIE_TIER_1 - Regular ZombieENCOUNTER_SPAWN_ZOMBIE_T1_SCREECHERENCOUNTER_SPAWN_ZOMBIE_TIER_3 - Mecha ZombieENCOUNTER_SPAWN_ZOMBIE_MAYKR - Maykr DroneENCOUNTER_SPAWN_IMPENCOUNTER_SPAWN_STONE_IMPENCOUNTER_SPAWN_GARGOYLEENCOUNTER_SPAWN_PROWLERENCOUNTER_SPAWN_CURSED_PROWLERENCOUNTER_SPAWN_HELL_SOLDIERENCOUNTER_SPAWN_SHOTGUN_SOLDIERENCOUNTER_SPAWN_CHAINGUN_SOLDIERENCOUNTER_SPAWN_CARCASSENCOUNTER_SPAWN_LOST_SOULENCOUNTER_SPAWN_HELL_KNIGHTENCOUNTER_SPAWN_DREAD_KNIGHTENCOUNTER_SPAWN_PINKYENCOUNTER_SPAWN_SPECTREENCOUNTER_SPAWN_CACODEMONENCOUNTER_SPAWN_PAIN_ELEMENTALENCOUNTER_SPAWN_MANCUBUSENCOUNTER_SPAWN_CYBER_MANCUBUSENCOUNTER_SPAWN_ARACHNOTRONENCOUNTER_SPAWN_REVENANTENCOUNTER_SPAWN_BLOOD_ANGEL - Blood MaykrENCOUNTER_SPAWN_WHIPLASH - Spectre Whiplashes are spawned using the same typeENCOUNTER_SPAWN_DOOM_HUNTERENCOUNTER_SPAWN_MARAUDERENCOUNTER_SPAWN_BARONENCOUNTER_SPAWN_ARMORED_BARONENCOUNTER_SPAWN_ARCHVILEENCOUNTER_SPAWN_TYRANTENCOUNTER_SPAWN_GLADIATORENCOUNTER_SPAWN_ICON_OF_SINENCOUNTER_SPAWN_MAYKR_ANGEL - Khan MaykrENCOUNTER_SPAWN_SAMUEL_BOSSENCOUNTER_SPAWN_CUEBALLENCOUNTER_SPAWN_BUFF_POD - Buff TotemENCOUNTER_SPAWN_SUPER_TENTACLEENCOUNTER_SPAWN_TENTACLEENCOUNTER_SPAWN_SPIRITENCOUNTER_SPAWN_TURRETENCOUNTER_SPAWN_DEMONIC_TROOPERENCOUNTER_SPAWN_GENERICENCOUNTER_SPAWN_ANY
encounterGroupRole_t
These types can also be dumped with sh_type/mh_type encounterGroupRole_t
Types
2016
ROLE_DEFENDROLE_ASSAULTROLE_FLANKROLE_FLANK_CHARGEROLE_FORMATIONROLE_THROWROLE_CHARGE
Eternal
ROLE_DEFENDROLE_ASSAULTROLE_FLANKROLE_FLANK_CHARGEROLE_FORMATIONROLE_THROWROLE_CHARGEROLE_TURRETROLE_DEFEND_ZONE
Explanations
- ROLE_DEFEND: The ai attack the player while attempting to remain at its current location.
- ROLE_ASSAULT: The ai will attack the player (?)
- ROLE_FLANK: The ai will flank the player.
- ROLE_FLANK_CHARGE: The ai will continuously charge towards/follow the player, while maintaining a certain distance (usually outside of melee range).
- ROLE_FORMATION: ?
- ROLE_THROW: The ai will use ranged throw attacks (?) Not applicable to all ai types.
- ROLE_CHARGE: The ai will continuously charge towards/follow the player, often getting into melee range.
- ROLE_TURRET: The ai will remain completely stationary, and only used ranged attacks. Not applicable to all ai types.
- ROLE_DEFEND_ZONE: ?
socialEmotion_t
These types can also be dumped with sh_type/mh_type socialEmotion_t
Types
2016
EMOTION_TERRIFIEDEMOTION_FEAREMOTION_WARYEMOTION_DESTROY_AT_ALL_COSTSEMOTION_DESTROYEMOTION_HATEEMOTION_ANGEREMOTION_DISLIKEEMOTION_ANNOYEDEMOTION_NEUTRALEMOTION_FRIENDLYEMOTION_SQUADMATEEMOTION_PARTNER
Eternal
EMOTION_TERRIFIEDEMOTION_FEAREMOTION_WARYEMOTION_DESTROY_AT_ALL_COSTSEMOTION_DESTROY_PRIORITYEMOTION_DESTROYEMOTION_HATEEMOTION_ANGEREMOTION_DISLIKEEMOTION_ANNOYEDEMOTION_NEUTRALEMOTION_FRIENDLYEMOTION_SQUADMATEEMOTION_PARTNER
Slayer Inventory
Modify the player's initial inventory.
DevInvLoadout Fundamentals
The devinvloadout decls dictate the slayer's starting inventory when the player loads a map, but does not load an existing save file. Scenarios where this occurs include:
- Creating a new save file.
- Joining an online match.
- playing through the tutorial.
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;
}
}
}
}