Skip to main content

idAI2

idAI2's are the entities which are connected to spawn targets or spawn groups, and defines the specific enemy which will be spawned when called upon.

The idAI2's in each level are usually named differently, however you can easily find them by searching for the structure used in their inherit parameter.

Ex. "ai/ambient/spirit", "ai/fodder/zombie_maykr", "ai/heavy/arachnotron", "ai/superheavy/marauder" 

Below is an example of the idAI2 for the Tier 1 Zombie enemy. 

}
entity {
	layers {
		"spawn_target_layer"
	}
	entityDef zombie_tier_1_1 {
	inherit = "ai/fodder/zombie_tier_1";
	class = "idAI2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		highlightDecl = "glorykill_highlight";
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 0.400000006;
				y = 0.400000006;
				z = 1.5;
			}
		}
		dormancy = {
			delay = 30;
			distance = 19.5070019;
		}
		spawn_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_AI_SPAWNED";
				increase = 1;
			}
		}
		targetingDecl = "characters/zombie";
		actorConstants = {
			perception = {
				eyeOffset = {
					z = 1.63829994;
				}
				crouchedEyeOffset = {
					z = 0.609600008;
				}
			}
			actorSounds = {
				sndFootsteps = "footsteps/zombies/zombies_default";
				sndPainSmall = "player/pain/small";
				sndPainMedium = "player/pain/medium";
				sndPainLarge = "player/pain/large";
				sndRagdollStart = "play_zombie_death";
			}
			footstepEffectTable = "impacteffect/footsteps/ai_zombie";
			footstepEvents = "footstepevents/default";
			painInfo = {
				decayDelay = 1000;
				bucketMaxValue = 200;
				decayRate = 0;
			}
			bulletPenetrationData = {
				energyCostToPenetrate = 10;
				damageScaleToPenetrate = 1;
			}
			footstepEffectTable_Sprint = "impacteffect/footsteps/ai_zombie_sprint";
			footstepEffectTable_SlowWalk = "impacteffect/footsteps/ai_zombie";
			footstepEffectTable_CrouchWalk = "impacteffect/footsteps/ai_zombie";
			footstepEffectTable_Landing = "impacteffect/footsteps/ai_zombie_landing";
			footstepEffectTable_HeavyLanding = "impacteffect/footsteps/ai_zombie_landing";
			ledgeGrabEffectTable = "impacteffect/footsteps/ai_zombie";
			ledgeGrabEffectTable_Heavy = "impacteffect/footsteps/ai_zombie";
			ledgeGrabEffectTable_Friendly = "impacteffect/footsteps/ai_zombie";
			ledgeGrabEffectTable_FriendlyHeavy = "impacteffect/footsteps/ai_zombie";
		}
		actorEditable = {
			entityDamageComponent = {
				entityDamage = "entitydamage/ai/zombie/base";
			}
			injuredStates = {
				num = 1;
				item[0] = {
					name = "not_injured";
					damageGroupMaxGoreLevels = {
						num = 1;
						item[0] = {
							damageGroupName = "left_upper_leg";
							maxGoreLevel = "GORELEVEL_LIGHT_DAMAGE";
						}
					}
					allowIK = true;
					canUseAllTraversalsWhileInjured = true;
					canUseDownTraversalsWhileInjured = true;
				}
			}
			radiusDamageJoints = {
				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 = "zombie_t1";
		mass = 18.1439991;
		lootable = false;
		lootDropComponent = {
			lootDropDataDecl = "ai/default_fodder";
		}
		pvpLootDropComponent = {
			lootDropDataDecl = "ai/default_fodder_pvp";
		}
		aiConstants = {
			components = {
				ptr = {
					ptr[12] = {
						componentDecl = "aicomponent/pathmanager/zombie";
					}
					ptr[14] = {
						componentDecl = "aicomponent/attack/base";
					}
				}
			}
			syncMelee = {
				msAfterAttackBeforeCanSync = 250;
				syncMeleeEntityDefs = {
					num = 2;
					item[0] = "syncmelee/zombie_tier1";
					item[1] = "syncmelee/zombie_tier1_3p";
				}
				syncGroups = {
					num = 1;
					item[0] = {
						syncGroupName = "";
						syncInteractions = {
							num = 21;
							item[0] = "syncdeath/playervsai/zombie_tier1/front_head";
							item[1] = "syncdeath/playervsai/zombie_tier1/back_lower";
							item[2] = "syncdeath/playervsai/zombie_tier1/above_back";
							item[3] = "syncdeath/playervsai/zombie_tier1/above_front";
							item[4] = "syncdeath/playervsai/zombie_tier1/back_head";
							item[5] = "syncdeath/playervsai/zombie_tier1/front_chest";
							item[6] = "syncdeath/playervsai/zombie_tier1/front_leftarm";
							item[7] = "syncdeath/playervsai/zombie_tier1/front_lower";
							item[8] = "syncdeath/playervsai/zombie_tier1/front_rightarm";
							item[9] = "syncdeath/playervsai/zombie_tier1/left_lower";
							item[10] = "syncdeath/playervsai/zombie_tier1/left_upper";
							item[11] = "syncdeath/playervsai/zombie_tier1/right_lower";
							item[12] = "syncdeath/playervsai/zombie_tier1/right_upper";
							item[13] = "syncdeath/playervsai/zombie_tier1/back_upper";
							item[14] = "syncdeath/playervsai/zombie_tier1/chainsaw/cut_front";
							item[15] = "syncdeath/playervsai/zombie_tier1/chainsaw/cut_back";
							item[16] = "syncdeath/playervsai/zombie_tier3/front_rightarm";
							item[17] = "syncdeath/playervsai/zombie_tier1/berserk/berserk_front_upper";
							item[18] = "syncdeath/playervsai/zombie_tier1/berserk/berserk_above_front";
							item[19] = "syncdeath/playervsai/zombie_tier1/crucbile/crucible_front";
							item[20] = "syncdeath/playervsai/zombie_tier1/crucbile/crucible_back";
						}
					}
				}
			}
			aiDeathStat = "STAT_ZOMBIE_KILLED";
			aiDeathCodex = "codex/hell/demon_zombie_earth";
		}
		aiEditable = {
			perception = {
				actorPerceptionRadius = 14;
				obstaclePerceptionRadius = 39;
				closePerceptionRadius = 5;
				eventPerceptionRadius = 14;
				senseUpdatesOnNonEnemies = false;
				fieldOfView = {
					value = 150;
				}
			}
			useTouchComponent = true;
			death = {
				ignoreDamageType = "DAMAGETYPE_EMP";
				fadeOutAfterDeathDelay_Seconds = {
					value = 3;
				}
				removeAfterFadeOutDelay_Seconds = {
					value = 3;
				}
				canBecomeInjured = true;
				explosionDecl = NULL;
				declTwitchPain = "twitchpain/zombie_t1";
			}
			movement = {
				wanderRadius = 19.5070019;
				useTraversalClassA = true;
				preferredCombatWalkState = "WALKSTATE_WALKING";
				allowWander = true;
			}
			cover = {
				coverRadius = 0;
			}
			behaviors = {
				decl = "behaviors/zombie/tier_1";
				declBehaviorEvents = "behaviorevents/default";
				attackGraph = "ai/zombie_tier_1";
			}
			vsAIDamageMask = "PAIN";
			spawnSettings = {
				entranceAnimPath = "animweb/characters/monsters/zombie_tier_1/spawn/teleport_entrance";
				spawnFXEntityDef = "fx/spawn_in_fodder";
				teleportDelayMS = 750;
			}
		}
		aiHealth = {
			components = {
				components[1] = {
					max = 0;
					regenInterval = {
						value = 0;
					}
				}
				components[0] = {
					max = 200;
					starting = 200;
				}
			}
		}
		goreComponent = {
			goreContainer = "ai/fodder/zombie_tier1";
		}
		afProperties = {
			impactEffectTable = "impacteffect/ragdoll/ragdoll_fodder";
			articulatedFigure = "characters/monsters/zombie_tier1";
		}
		renderModelInfo = {
			model = "md6def/characters/monsters/zombie_tier1/base/zombie_tier1_hell.md6";
			lightRigDecl = "zombie_tier1/zombie_tier1_default";
		}
		fxDecl = "character/zombie_tier1/zombie_tier1";
		walkIKDecl = "walkik/zombie";
		killerNames = {
			num = 1;
			item[0] = "#str_decl_damage_zombie_GHOST81206";
		}
		spawnPosition = {
			x = -1825.60095;
			y = 2194.30444;
			z = 44.5000305;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 5.36441803e-07;
					y = 0.99999994;
				}
				mat[1] = {
					x = -0.99999994;
					y = 5.36441803e-07;
				}
			}
		}
	}
}



Custom AI

idAI2's can be edited in order to make custom AI. Values such as EntityDamage, LootDropComponent, and SpawnSettings can be swapped out between different idAI2's for a desired change, and others such as aiHealth and all the values in aiEditable can be edited to change how a demon functions entirely. 

In this zombie idai2 for example, you can swap out the "LootDropComponent" parameter with that of the maykr drone. The result will be Tier 1 Zombies which will drop Maykr Drone lootdrops when headshot.