Eternal - Level Modding Beginner's Guide This guide will cover the basics required to get started with level modding. Section 1: Before you begin modding Section 1 will cover everything you need to know before you can begin editing or making your own enemy encounters. There will be non-essential steps that you don't technically need to do, but it will streamline the modding process and be good in the long run. Watch out for those.Section 1: What is a level mod? In order to untangle the mess that is teaching the pre-requisite knowledge of being able to create level mods on your own, it is best to lay down the process step by step. This is something I've noticed this wiki does not do. It may have a lot of useful documentation such as eventcalls and miscellaneous entities such as damage triggers, particle effects, etc., but it does not put together a concise tutorial on how to use them properly. This guide sets out to correct this. First, a brief write-up of what exactly level mods are and how they work. 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: GitHub2. A list of a map's current highest priority so you know which .resources file to extract from and subsequently edit. The game uses the .entities file from the map's highest priority patch. If you choose the wrong one and have your mod replace the .entities file in the wrong patch, it won't work. Link to the list: Google Docs 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=HgzoFr9Zaf8Tools Information about the tools necessary for Level Modding. Getting Started Entities Files Levels are edited through ".entities" files and are saved in:/maps/game///.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 - DownloadFile -> Export to text (make sure the file extension is still .entities) SAMUEL Asset Extraction Tool by SamPT - DownloadCurrently 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///.entitiesExample: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 copy oocore_8_win64.dll from 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 useFile -> 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 selected2. Paste into text editor3. Make your changes and only copy the following4. Reinsert the eventCall into EntitySlayer5. 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 jakesDevWidgetidAI2 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 spawnArchvile 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 activateTarget idTarget_Count (Relays)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 light2. Spawns a Hell Knight3. Waits for 2 seconds4. Spawns a Cacodemon5. Continuously maintains 4 Imps at a time6. Makes the AI aware of the player7. Waits for 0 AI with the "main_combat" string to remain (which is the Hell Knight and Cacodemon)8. Sets music to be heavy9. Spawns a Baron of Hell10. 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 you13. Waits for 0 AI to remain14. 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 idEncounterManager idEncounterTrigger_Exit idEncounterTrigger_Exit An entity used to end an encounter manager Usage entity { entityDef example_trigger_exit { inherit = "encounter/trigger/exit"; class = "idEncounterTrigger_Exit"; expandInheritance = false; poolCount = 0; poolGranularity = 2; networkReplicated = false; disableAIPooling = false; edit = { triggerOnce = false; spawnPosition = { // Be sure to set spawn position x = 1; y = 1; z = 1; } renderModelInfo = { model = NULL; } clipModelInfo = { // Be sure to set trigger dimensions clipModelName = NULL; } soundOcclusionBypass = true; forceAIToFlee = true; // Set to true if you want all AI to despawn once this is triggered } } } Simply entering the trigger's volume will abruptly end the encounter manager if it has this entity added to it in the exitTriggers section. Be sure to use exit triggers to despawn remaining AI when scripting brand new encounters. See Also idEncounterManager idEncounterTrigger_CommitidEncounterTrigger_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 idParticleEmitteridGameChallenge 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 String Customization 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_musicGhost States: main_ambient, main_light, main_heavy, additional_reveal, cine_1, cine_2, cine_3 Exultia/Taras Nabad:Switch State: slayer_city_musicGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, cine_4 Cultist Base:Switch State: cultist_base_musicGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2 Doom Hunter Base:Switch State: doom_hunter_musicGhost 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_musicGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2Secondary Switch: sgn_combat_suite_1 Super Gore Nest 2:Switch State: supergorenest_musicGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2Secondary Switch: sgn_combat_suite_2 ARC Complex:Switch State: samuelsbase_musicGhost States: main_ambient, main_light, main_heavy Phobos:Switch State: mars_core_musicGhost States: main_ambient, main_light, main_heavy, alt_ambient, alt_light, alt_heavy, cine_1, level_marscore_baron, escape_podSecondary Switch: phobos Mars Core:Switch State: mars_core_musicGhost States: main_ambient, main_light, main_heavy, cine_1, level_marscore_painelemental, stingerSecondary Switch: space Sentinel Prime:Switch State: gladiator_musicGhost 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_musicGhost States: main_ambient, main_light, main_heavy Urdak:Switch State: maykr_musicGhost 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_musicGhost 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_rigGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, cine_6, stinger The Blood Swamps:Switch State: dlc1_hell_swamp_musicGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2, boss_phase1, boss_phase2 The Holt:Switch State: dlc1_maykr_city_musicGhost 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_spearGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2, cine_3, additional_levelstart, stinger Reclaimed Earth:Switch State: dlc2_overgrown_earth_musicGhost States: main_ambient, main_light, main_heavy Immora/The Dark Lord:Switch State: dlc2_tech_hell_musicGhost 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_musicGhost States: main_ambient, main_light, main_heavy, cine_1, cine_2Secondary Switch: hub Blood Harvester: (unused track)Switch State: bloodharvester_musicGhost States: main_ambient, main_light BATTLEMODE Music: (pvp)Switch State: pvpGhost 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_switchGhost States: main_ambientidParticleEmitter 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_TriggeridPlayerStart 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 idMusicEntity 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 DevInvLoadout Fundamentals 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 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_Hide 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_Spawn idTarget_Spawn_Parent 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 idTrigger_Teleporter & idInfo_TeleportDestination 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 } } } } target is the entity that is being activated. designComment is an optional parameter for the user, and does not show up in game. Example Usage entity { // You Can't Just Shoot a Hole into the Surface of Mars entityDef mod_soundentity_samuel_vo_shoot_mars { inherit = "sound/soundentity"; class = "idSoundEntity"; expandInheritance = false; poolCount = 0; poolGranularity = 2; networkReplicated = false; disableAIPooling = false; edit = { temporarySoundEvent = true; spawnPosition = { x = 4.20000553; y = 0.449982464; z = 12.1500015; } soundOcclusionBypass = true; startEvents = { num = 1; item[0] = "play_vo_samuel_hubsamuel_hookup_you_cant_just_shoot__ghost52033"; } } } } item[0] = { eventCall = { eventDef = "waitAIRemaining"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; } item[1] = { int = 0; // desired_remaing_ai_count } item[2] = { string = ""; // group_label } } } } item[1] = { eventCall = { eventDef = "activateTarget"; args = { num = 2; item[0] = { entity = "mod_soundentity_samuel_vo_shoot_mars"; // target } item[1] = { string = "Play Hayden's audio for the Mars Hole line"; // designComment } } } } First we place an idSoundEntity with the name mod_soundentity_samuel_vo_shoot_mars in the .entities, and then within the encounter manager, we can use activateTarget on mod_soundentity_samuel_vo_shoot_mars after our waitAIRemaining, 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 } } } } spawnType are the eEncounterSpawnType_t whose role should be cleared. group_label is the label for the ai whose role should be cleared. This parameter is optional, and can be left blank. Example Usage item[0] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS"; } item[1] = { entity = "ai_target_spawn_454"; } item[2] = { string = "defender"; } } } } item[1] = { eventCall = { eventDef = "setCombatRoles"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType } item[1] = { string = "defender"; // group_label } item[2] = { encounterGroupRole_t = "ROLE_DEFEND"; // group_role } } } } item[2] = { eventCall = { eventDef = "waitAIHealthLevel"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS"; } item[1] = { float = 0.5; // target_group_health } item[2] = { string = ""; // group_label } } } } item[3] = { eventCall = { eventDef = "clearCombatRoles"; args = { num = 2; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS"; // spawnType } item[1] = { string = "defender"; // group_label } } } } In this example, we spawn a Mancubus which is set to ROLE_DEFEND. Once it reaches 50% HP, we use clearCombatRoles to clear the defend role. See Also setCombatRoles 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 setFactionRelation 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 } } } } damageType is the path to the decl for the damage type to be used. aiType are the eEncounterSpawnType_t that you want the damage to be applied to. group_label is the label assigned to the ai that will be damaged by this eventCall. This parameter is optional, and can be left blank. Example Usage item[0] = { eventCall = { eventDef = "damageAI"; args = { num = 3; item[0] = { decl = { damage = "damage/triggerhurt/triggerhurt1000_instagib"; // damageType } } item[1] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType } item[2] = { string = "fodder"; // groupLabel } } } } In this example, triggerhurt1000_instagib is applied to any ai type with the fodder label, killing them instantly. designerComment 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 } } } } designerComment is the comment you wish to add. printToConsole determines whether said comment is displayed in the console. Example Usage item[0] = { eventCall = { eventDef = "designerComment"; args = { num = 2; item[0] = { string = "\nExample text between line breaks\n"; // designerComment } item[1] = { bool = true; // printToConsole } } } } forceAIToFlee 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 } } } } spawnType are the eEncounterSpawnType_t that you want to flee. group_label is the label for the ai to flee radius immediateDespawn is if the ai will immediately despawn (with the despawn animation) Example Usage item[0] = { eventCall = { eventDef = "forceAIToFlee"; args = { num = 4; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType } item[1] = { string = ""; // group_label } item[2] = { float = 0; // radius } item[3] = { bool = true; // immediateDespawn } } } } forceChargeOnAllAI 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 } } } } spawnType are the eEncounterSpawnType_t that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list. ENCOUNTER_SPAWN_ANY can also be used. desired_count is how many ai this eventCall should spawn up to. To avoid overlapping spawns, desired_count should be <= the number of idTarget_Spawns listed under your idTargetSpawnGroup. max_spawn_count is the maximum number of ai that can be spawned by this eventCall in total. This can be set to -1 for infinite respawns. min_spawn_delay is the minimum delay between each spawn, in seconds. This value also affects how soon before this eventCall spawns its first ai. min_ai_for_respawn triggers the ai respawns when they fall below or equal to the value it's set to. min_ai_for_respawn should also be < desired_count. If it is greater than desired_count, the quantity of demons maintained will not properly reflect desired_count, possibly exceeding it. spawnGroup is the idTargetSpawnGroup you want to use. group_label is what label you want to give to the ai spawned by this eventCall. This parameter is optional, and can be left blank. max_spawn_delay is the maximum delay between each spawn, in seconds. Example Usage item[0] = { eventCall = { eventDef = "maintainAICount"; args = { num = 8; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ZOMBIE"; // spawnType } item[1] = { int = 10; // desired_count } item[2] = { int = 20; // max_spawn_count } item[3] = { float = 3; // min_spawn_delay } item[4] = { int = 5; // min_ai_for_respawn } item[5] = { entity = "ai_target_spawn_volume_76"; // spawnGroup } item[6] = { string = ""; // group_label } item[7] = { float = 5; // max_spawn_delay } } } } In this example, 10 Zombies will be spawned, with a 3-5s delay between each (re)spawn. When only 5 Zombies remain, they will begin respawning until there are 10 Zombies again. Once 20 Zombies have been spawned in total, this eventCall is complete. Notes This eventcall appears to have functionality to adjust its kill requirements if not enough enemies are available, to prevent the encounter from locking up, due to otherwise unattainable kill requirements. If the quantity of currently alive required enemies are greater or equal to the required kills, then the eventcall functions as normal. However, if the quantity of currently alive required enemies are less than the required kills, then the amount of enemies you need to kill is lowered to match the quantity of currently alive required enemies. This anti-softlock functionality fails if a maintainAICount is followed by a waitKillCount sometime later in the same encounter manager, while the maintainAICount is still active. If there are not enough enemies are available in this scenario, then the waitKillCount will use the completion of the maintainAICount as one of it's requirements. Simply killing the maintained demons until its max_spawn_count is depleted will avoid soft locking in this situation. Do note that if max_spawn_count is set to -1, then the soft lock cannot be avoided. This functionality has only been tested for in Doom Eternal. See Also waitMaintainComplete stopMaintainingAICount 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 } } } } encounterScript is the name of the external idEncounterManager to migrate ai from. aiType are the ai types from the external encounter manager to be migrated. groupLabel is the label given to the migrated ai. sharedBetweenScripts is if the migrated ai are shared between both encounter managers. proceedToNextScript 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 setNextScriptIndex 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 } } } } encounterScript is the encounter manager that the user flag is for eventFlag is the eEncounterEventFlags_t (type) for the flag userFlag is the parameter of the name in the idEncounterTrigger_RaiseUserFlag being triggered Note that using activateTarget 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 } } } } spawnType are the eEncounterSpawnType_t that you want to be removed. group_label is what label for the ai to be removed by this eventCall. This parameter is optional, and can be left blank. AI entities removed with this command will be instantly removed, without any death or despawn animation. It is best used for ai types that are not affected by damageAI 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 } } } } spawnType are the eEncounterSpawnType_t that you want to given a role. group_label is the label for the ai be given a role by this eventCall. This parameter is optional, and can be left blank. group_role is the encounterGroupRole_t (combat role) that you wish to give to the specified ai. Example Usage item[0] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS"; } item[1] = { entity = "ai_target_spawn_454"; } item[2] = { string = "defender"; } } } } item[1] = { eventCall = { eventDef = "setCombatRoles"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spawnType } item[1] = { string = "defender"; // group_label } item[2] = { encounterGroupRole_t = "ROLE_DEFEND"; // group_role } } } } In this example, a Mancubus is spawned with the label defender, and then setCombatRoles is used to set any ai type with the defender label to ROLE_DEFEND. See Also clearCombatRoles 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 } } } } instigatorSpawnType is the ai type for the instigator. targetSpawnType is the ai type for the target. relation is the socialEmotion_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 clearFactionOverrides 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 } } } } target is the idMusicEntity to change the state of. stateDecl is the path to the decl for the idSoundState you want to change it to. Example Usage item[0] = { eventCall = { eventDef = "setMusicState"; args = { num = 3; item[0] = { entity = "sound_sound_musicentity_1"; // target } item[1] = { decl = { soundstate = "music_ghost_states/main_heavy"; // stateDecl } } item[2] = { string = "Change music state to heavy combat music"; // designComment } } } } See Also idMusicEntity 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; } } } } nextScriptIndex is the index of next script Example Usage entity { // Custom Encounter #1 entityDef mod_encounter_manager_custom_1 { inherit = "encounter/manager"; class = "idEncounterManager"; expandInheritance = false; poolCount = 0; poolGranularity = 2; networkReplicated = true; disableAIPooling = false; edit = { enableAIHighlightOnFinish = true; disabledAITypeForHighlight = "AI_MONSTER_SPECTRE AI_MONSTER_BUFF_POD AI_MONSTER_TENTACLE"; playerMetricDef = "encounter/player_metrics"; chargeCombatGrouping = "encounter/combat_role/charge_command"; aiTypeDefAssignments = "actorpopulation/default/default_no_bosses"; spawnPosition = { x = 0; y = 0; z = 0; } soundOcclusionBypass = true; combatRatingScale = "COMBAT_RATING_SCALE_IGNORE"; encounterComponent = { entityEvents = { num = 2; item[0] = { // Part 0 entity = "mod_encounter_manager_custom_1"; events = { num = 5; item[0] = { eventCall = { eventDef = "setMusicState"; args = { num = 3; item[0] = { entity = "sound_sound_musicentity_1"; } item[1] = { decl = { soundstate = "music_ghost_states/main_heavy"; } } item[2] = { string = ""; } } } } item[1] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON"; } item[1] = { entity = "ai_target_spawn_87"; } item[2] = { string = ""; } } } } item[2] = { eventCall = { eventDef = "waitAIRemaining"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; } item[1] = { int = 0; // desired_remaing_ai_count } item[2] = { string = ""; // group_label } } } } item[3] = { eventCall = { eventDef = "setNextScriptIndex"; args = { num = 1; item[0] = { // index of next script int = 1; } } } } item[4] = { eventCall = { eventDef = "proceedToNextScript"; args = { num = 2; item[0] = { bool = true; // bypassNextWaitForCommit } item[1] = { bool = true; // carryOverExistingUserFlags } } } } } } item[1] = { // Part 1 entity = "mod_encounter_manager_custom_1"; events = { num = 2; item[0] = { eventCall = { eventDef = "setMusicState"; args = { num = 3; item[0] = { entity = "sound_sound_musicentity_1"; } item[1] = { decl = { soundstate = "music_ghost_states/main_ambient"; } } item[2] = { string = ""; } } } } item[1] = { eventCall = { eventDef = "activateTarget"; args = { num = 2; item[0] = { entity = "game_target_count_cp11"; // target } item[1] = { string = ""; // designComment } } } } } } } } } } } In this example we use setNextScriptIndex after all there are no ai remaning, followed by proceedToNextScript to advance to the next script. Note that the encounter manager has to be split into multiple scripts (line 26 and 110) in order for setNextScriptIndex to work properly. The next script index does not have to be in sequential order either, as in an encounter manager with 4 scripts, it is possible to advance from script 0 to script 3, skipping over scripts 1 and 2. See Also proceedToNextScript 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 } } } } spawnType is the ai type that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list. spawnCount is the number of ai you want to be spawned. To avoid overlapping spawns, spawnCount should be <= the number of idTarget_Spawn entities listed under your idTargetSpawnGroup. group_label is the label you want to give this spawned ai. This parameter is optional and can be left blank. Example Usage item[0] = { eventCall = { eventDef = "spawnAI"; args = { num = 4; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType } item[1] = { int = 6; // spawn_count } item[2] = { entity = "mod_spawngroup_1"; // spawnGroup } item[3] = { string = "fodder"; // group_label } } } } spawnArchvile 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 } } } } spawnTarget is the spawn target or spawn group to spawn the Archvile with. archvileTemplate is the idArchvileTemplate you want to use. archvile_label is the label given to the Archvile that is spawned. This parameter is optional and can be left blank. group_label is the label given to demons summoned by the Archvile. This parameter is optional and can be left blank. Note that if an Archvile is spawned without an idArchvileTemplate, it will default to being able summon all (base game?) ai types, with the exemption of another Archvile. Example Usage item[0] = { eventCall = { eventDef = "spawnArchvile"; args = { num = 4; item[0] = { entity = "ai_target_spawn_111"; // spawnTarget } item[1] = { entity = "mod_template_2"; // archvileTemplate } item[2] = { string = "super heavy"; // archvile_label } item[3] = { string = "summons"; // group_label } } } } See Also idArchvileTemplate 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 } } } } spawnTarget is the spawn target to spawn the totem at. buffpod_label is the label for the totem itself. buffed_ai_label is the label for the ai to buff. If this is left blank, all ai will be buffed. Example Usage item[0] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType } item[1] = { entity = "ai_target_spawn_46"; // spawnTarget } item[2] = { string = ""; // group_label } } } } item[1] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType } item[1] = { entity = "ai_target_spawn_47"; // spawnTarget } item[2] = { string = "buff me pls"; // group_label } } } } item[2] = { eventCall = { eventDef = "spawnBuffPod"; args = { num = 3; item[0] = { entity = "ai_target_spawn_451"; // spawnTarget } item[1] = { string = ""; // buffpod_label } item[2] = { string = "buff me pls"; // buffed_ai_label } } } } In this example, the totem will only buff the Imp with a group_label of "buff me pls", because that matches the buffed_ai_label the totem is looking for. spawnPossessedAI 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_spawnType is the eEncounterSpawnType_t for the ai to be spawned. ai_spawnTarget is the spawn target to be used for the ai to be spawned. ai_groupLabel is the label to be given to the spawned ai. spirit_spawnTarget is the spawn target to be used for the spirit. spirit_allowedAITypes are the eEncounterSpawnType_t that the spirit is allowed to possess. spirit_allowedGroupLabel is the label that the spirit is allowed to possess. aiTypeExplicitFiltering is whether the spirit will possess ai based on the specified restrictions. Example Usage item[0] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_PINKY"; } item[1] = { entity = "ai_target_spawn_13"; } item[2] = { string = "heavy"; } } } } item[1] = { eventCall = { eventDef = "spawnPossessedAI"; args = { num = 7; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_REVENANT"; // ai_spawnType } item[1] = { entity = "ai_target_spawn_21"; // ai_spawnTarget } item[2] = { string = "beamer"; // ai_groupLabel } item[3] = { entity = "ai_target_spawn_17"; // spirit_spawnTarget } item[4] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // spirit_allowedAITypes } item[5] = { string = "beamer"; // spirit_allowedGroupLabel } item[6] = { bool = true; // aiTypeExplicitFiltering } } } } In this example, we spawn a Pinky with the heavy label. Then we use spawnPossessedAI to spawn a Revenant with the beamer label, and the spirit with the ability to possess any ai type with the beamer label. This way, once the possessed Revenant is dead, there are no other ai that use the beamer label, so the spirit will be unable to possess anyone else, and will despawn. See Also spawnSpirit 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 } } } } spawnType is what ai type is spawned. Multiple types can be listed, but only a single ai entity will be spawned. Its type will be randomly chosen from this list. spawnTarget is the idTarget_Spawn entity you want to use. group_label is the label you want to give this spawned ai. This parameter is optional and can be left blank. Example Usage item[0] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType } item[1] = { entity = "ai_target_spawn_47"; // spawnTarget } item[2] = { string = "fodder"; // group_label } } } } spawnSpirit 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 } } } } spawnTarget is the spawn target that the spirit is to be spawned with. allowedAITypes are the eEncounterSpawnType_t that the spirit is allowed to possess. allowed_group_label is the label that the spirit is allowed to possess. aiTypeExplicitFiltering is whether the spirit will only possess the exact specified ai types/group label. Example Usage item[0] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON"; } item[1] = { entity = "ai_target_spawn_17"; } item[2] = { string = "spider"; } } } } item[1] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON"; } item[1] = { entity = "ai_target_spawn_21"; } item[2] = { string = "possess me"; } } } } item[2] = { eventCall = { eventDef = "spawnSpirit"; args = { num = 4; item[0] = { entity = "ai_target_spawn_26"; // spawnTarget } item[1] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ARACHNOTRON"; // allowedAITypes } item[2] = { string = "possess me"; // allowed_group_label } item[3] = { bool = true; // aiTypeExplicitFiltering } } } } In this example, two Arachnotrons are spawned, one with a spider label, and the other with the possess me label. spawnSpirit is then used for ENCOUNTER_SPAWN_ARACHNOTRON with the possess me label, that way only the latter Arachnotron will be possessed. See Also spawnPossessedAI 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 } } } } spawnType is the ai type that you want to be spawned. Multiple types can be listed, and the spawned ai types will be randomly chosen from this list. spawnCount is the number of ai you want to be spawned. To avoid overlapping spawns, spawnCount should be <= the number of idTarget_Spawns listed under your idTargetSpawnGroup. spawnGroup is the idTargetSpawnGroup you want to use. group_label is what label you want to give to the ai spawned by this eventCall. This parameter is optional, and can be left blank. minSpawnStagger is the minimum delay between each spawn, in seconds. This value also affects how soon the first spawn in this eventCall occurs. maxSpawnStagger is the maximum delay between spawns, in seconds. 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 waitStaggeredSpawnComplete 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 } } } } spawnType is the eEncounterSpawnType_t used in the preceding maintainAICount. ENCOUNTER_SPAWN_ANY may also be used instead. group_label is the label used in the preceding maintainAICount. This parameter is optional, and may be left blank. Example Usage item[0] = { eventCall = { eventDef = "maintainAICount"; args = { num = 8; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType } item[1] = { int = 5; // desired_count } item[2] = { int = -1; // max_spawn_count } item[3] = { float = 1; // min_spawn_delay } item[4] = { int = 3; // min_ai_for_respawn } item[5] = { entity = "mod_spawngroup_1"; // spawnGroup } item[6] = { string = "fodder"; // group_label } item[7] = { float = 2; // max_spawn_delay } } } } item[1] = { eventCall = { eventDef = "waitKillCount"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; } item[1] = { int = 10; } item[2] = { string = "fodder"; } } } } item[2] = { eventCall = { eventDef = "stopMaintainingAICount"; args = { num = 2; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; } item[1] = { string = "fodder"; } } } } In this example, the maintainAICount 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 maintainAICount waitMaintainComplete 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 } } } } aiType is the eEncounterSpawnType_t whose HP level should be checked. target_group_health is the HP level, in decimal percentage, that you want to reach before proceeding. group_label is the label for the specified ai type(s). This parameter is optional, can be left blank if inapplicable. Example Usage item[0] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // spawnType } item[1] = { entity = "game_target_spawn_1312"; // spawnTarget } item[2] = { string = "check health"; // group_label } } } } item[1] = { eventCall = { eventDef = "waitAIHealthLevel"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CYBER_MANCUBUS"; // spawnType } item[1] = { float = 0.6; // target_group_health } item[2] = { string = "check health"; // group_label } } } } item[2] = { eventCall = { eventDef = "spawnAI"; args = { num = 4; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_CACODEMON"; // spawnType } item[1] = { int = 2; // spawn_count } item[2] = { entity = "mod_spawngroup_flying_7"; // spawnGroup } item[3] = { string = "heavy"; // group_label } } } } In this example, we spawn a Cyber-Mancubus with the label check_health. Then we call waitAIHealthLevel with said spawnType and group_label, with target_group_health set to 0.6, so that when the Cyber-Mancubus is <= 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 } } } } aiType are the eEncounterSpawnType_t that you want to wait on. The encounter will wait until the quantity of specified ai types present in the encounter are less than or equal to the value of desired_remaing_ai_count group_label is the label that you want to wait on. This parameter is optional, and can be left blank. Example Usage item[0] = { eventCall = { eventDef = "spawnAI"; args = { num = 4; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_SHOTGUN_SOLDIER"; // spawnType } item[1] = { int = 4; // spawn_count } item[2] = { entity = "mod_spawngroup_15"; // spawnGroup } item[3] = { string = ""; // group_label } } } } item[1] = { eventCall = { eventDef = "spawnAI"; args = { num = 4; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER ENCOUNTER_SPAWN_BEAM_SOLDIER"; // spawnType } item[1] = { int = 4; // spawn_count } item[2] = { entity = "mod_spawngroup_21"; // spawnGroup } item[3] = { string = ""; // group_label } } } } item[2] = { eventCall = { eventDef = "waitAIRemaining"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType } item[1] = { int = 0; // desired_remaing_ai_count } item[2] = { string = ""; // group_label } } } } In this example, 4 Imps/Shotgunners are spawned, and 4 Soldiers/Hell Razers. By using waitAIRemaining set to ENCOUNTER_SPAWN_ANY with a desired_remaing_ai_count of 0, this ensures that all enemies will need to be killed first. waitForEventFlag 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 } } } } aiType is the ai type(s) that you want to wait on. desired_kill_count is how many of the specified ai type(s) you want to be killed before proceeding. group_label is the label for the specified ai type(s). This parameter is optional, can be left blank if inapplicable. Example Usage item[0] = { eventCall = { eventDef = "maintainAICount"; args = { num = 8; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType } item[1] = { int = 5; // desired_count } item[2] = { int = -1; // max_spawn_count } item[3] = { float = 1; // min_spawn_delay } item[4] = { int = 3; // min_ai_for_respawn } item[5] = { entity = "mod_spawngroup_1"; // spawnGroup } item[6] = { string = "fodder"; // group_label } item[7] = { float = 2; // max_spawn_delay } } } } item[1] = { eventCall = { eventDef = "waitKillCount"; args = { num = 3; item[0] = { eEncounterEventFlags_t = "ENCOUNTER_SPAWN_ANY"; // aiType } item[1] = { int = 10; // desired_kill_count } item[2] = { string = "fodder"; // group_label } } } } item[2] = { eventCall = { eventDef = "stopMaintainingAICount"; args = { num = 2; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType } item[1] = { string = "fodder"; // group_label } } } } In this example, the maintainAICount 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 } } } } aiType are the eEncounterSpawnType_t that you want to be wait on. ENCOUNTER_SPAWN_ANY can also be used. remaining_spawn_countdesired_count is how many remaining spawns this eventCall should wait on. group_label is the same as the label given to the preceding maintainAICount. 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 maintainAICount stopMaintainingAICount 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_count is the amount of wait conditions logic_operator is the logic operator used for the wait conditions. The only operators are ENCOUNTER_LOGICAL_OP_OR (any wait condition is fulfilled) and ENCOUNTER_LOGICAL_OP_AND (all wait conditions are fulfilled). Example Usage #1 item[0] = { eventCall = { eventDef = "waitMulitpleConditions"; args = { num = 2; item[0] = { int = 2; // condition_count } item[1] = { encounterLogicOperator_t = "ENCOUNTER_LOGICAL_OP_OR"; // logic_operator } } } } item[1] = { eventCall = { eventDef = "wait"; args = { num = 1; item[0] = { float = 10; } } } } item[2] = { eventCall = { eventDef = "waitKillCount"; args = { num = 3; item[0] = { eEncounterEventFlags_t = "ENCOUNTER_SPAWN_ANY"; } item[1] = { int = 2; } item[2] = { string = ""; } } } } In this example we have two conditions, set to OR. This way, when either 10s pass or any 2 ai types are killed, the encounter proceeds. Example Usage #2 item[0] = { eventCall = { eventDef = "waitMulitpleConditions"; args = { num = 2; item[0] = { int = 3; // condition_count } item[1] = { encounterLogicOperator_t = "ENCOUNTER_LOGICAL_OP_AND"; // logic_operator } } } } item[1] = { eventCall = { eventDef = "waitAIRemaining"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_BARON"; } item[1] = { int = 0; // desired_remaing_ai_count } item[2] = { string = ""; // group_label } } } } item[2] = { eventCall = { eventDef = "waitAIRemaining"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_MANCUBUS"; } item[1] = { int = 0; // desired_remaing_ai_count } item[2] = { string = ""; // group_label } } } } item[3] = { eventCall = { eventDef = "wait"; args = { num = 1; item[0] = { float = 5; } } } } In this example, we have three conditions, set to AND. This way, there needs to be no Barons and Mancubi, and 5s must have passed as well, in order for the encounter to proceed.waitRandomKillCount 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 } } } } aiType are the eEncounterSpawnType_t that will be tracked for the kill count. kill_count_min is the minimum value for the random kill count. kill_count_max is the maximum value for the random kill count. A value will be randomly picked from between kill_count_min and kill_count_max (inclusive?). Once that kill count is achieved, the wait condition will be fulfilled. Example Usage item[0] = { eventCall = { eventDef = "waitRandomKillCount"; args = { num = 4; item[0] = { eEncounterEventFlags_t = "ENCOUNTER_SPAWN_IMP ENCOUNTER_SPAWN_HELL_SOLDIER"; // aiType } item[1] = { int = 15; // kill_count_min } item[2] = { int = 20; // kill_count_max } item[3] = { string = "fodder"; // group_label } } } } In this example, once between 15 and 20 Imps/Soldiers are killed, the encounter will proceed. waitStaggeredSpawnComplete 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 } } } } aiType are the eEncounterSpawnType_t from the preceding staggeredAISpawn that you want to wait on. ENCOUNTER_SPAWN_ANY can also be used. remaining_spawn_count is how many remaining spawns this eventCall should wait on. Example Usage item[0] = { eventCall = { eventDef = "staggeredAISpawn"; args = { num = 6; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_IMP"; // spawnType } item[1] = { int = 3; // spawn_count } item[2] = { entity = "mod_spawngroup_encounter2"; // spawnGroup } item[3] = { string = "fodder"; // group_label } item[4] = { float = 1; // minSpawnStagger } item[5] = { float = 2; // maxSpawnStagger } } } } item[1] = { eventCall = { eventDef = "staggeredAISpawn"; args = { num = 6; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_SOLDIER"; // spawnType } item[1] = { int = 3; // spawn_count } item[2] = { entity = "mod_spawngroup_encounter2B"; // spawnGroup } item[3] = { string = "fodder"; // group_label } item[4] = { float = 1; // minSpawnStagger } item[5] = { float = 2; // maxSpawnStagger } } } } item[2] = { eventCall = { eventDef = "waitStaggeredSpawnComplete"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_ANY"; // aiType } item[1] = { int = 0; // remaining_spawn_count } item[2] = { string = ""; // group_label } } } } item[3] = { eventCall = { eventDef = "spawnSingleAI"; args = { num = 3; item[0] = { eEncounterSpawnType_t = "ENCOUNTER_SPAWN_HELL_KNIGHT"; } item[1] = { entity = ai_target_spawn_23"; } item[2] = { string = "priority"; } } } } In this example, we have a staggeredAISpawn 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 staggeredAISpawn 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_ANYencounterGroupRole_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_PARTNERSlayer 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; } } } }