Entities

This chapter contains required and recommended changes to entities.

Game Challenges

Co-op

entity {
	entityDef coop_game_challenge {
	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;
		}
		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";
		}
		scoreLimit = 99;
		numLives = 0;
		numRounds = 99;
		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 = "";
			demonCriticalRecovery = "pvp/voiced/demon_healed";
			slayerCriticalHealth = "pvp/voiced/slayer_health_critical";
			everyoneCritical = "main_heavy";
		}
		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 = true;
		desummonKillDamage = "damage/hazard/pvp_round_kill";
		slayerHighlightDecl = "pvp/demon_view_slayer_outline";
		demonHighlightDecl = "pvp/demon_view_slayer_outline";
		teammateHighlightDecl = "pvp/demon_view_slayer_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 = {
			allyDemon = "EHM_ALWAYS";
			enemyDemon = "EHM_ALWAYS";
			allySlayer = "EHM_ALWAYS";
			enemySlayer = "EHM_ALWAYS";
		}
		demonHighlightOptions = {
			allyDemon = "EHM_ALWAYS";
			enemyDemon = "EHM_ALWAYS";
			allySlayer = "EHM_ALWAYS";
			enemySlayer = "EHM_ALWAYS";
		}
		raceToStyle = true;
		pvpGameEventCallouts = {
			roundOne = "";
			roundTwo = "";
			roundThree = "";
			roundFour = "";
			roundFinal = "";
			preMatchFiveSecondsRemaining = "";
			preMatchFourSecondsRemaining = "";
			preMatchThreeSecondsRemaining = "";
			preMatchTwoSecondsRemaining = "";
			preMatchOneSecondRemaining = "";
			roundStart = "";
			finalRound = "";
			demonsRoundLost = "";
			slayerRoundLost = "";
			slayerKilled = "pvp/voiced/slayer_killed";
			demonKilled = "pvp/voiced/slayer_killed";
			demonsKilled = "pvp/voiced/slayer_killed";
			slayerVictory = "";
			demonVictory = "";
			demonRespawningSoon = "";
			respawnFiveSecondsRemaining = "";
			respawnFourSecondsRemaining = "";
			respawnThreeSecondsRemaining = "";
			respawnTwoSecondsRemaining = "";
			respawnOneSecondRemaining = "";
			demonRespawned = "pvp/voiced/demon_resurrected";
			delayDuringSync = {
				num = 1;
				item[0] = "pvp/voiced/slayer_killed";
			}
		}
		jockeyTimeDuration = {
			value = 0;
		}
		roundCalloutTimeDuration = {
			value = 0.1;
		}
		roundStartCalloutDelaySec = {
			value = 0;
		}
		roundEndCalloutDelaySec = {
			value = 0;
		}
		upgradeUIDelaySec = {
			value = 0;
		}
		upgradeUIDuration = {
			value = 0;
		}
		matchEndCalloutDelaySec = {
			value = 0;
		}
		matchEndResultsDelaySec = {
			value = 0;
		}
		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 = 0.1;
					}
				}
			}
		}
		respawnTimeCapSec = {
			defaultValue = {
				value = 0.1;
			}
			branchPairs = {
				num = 1;
				item[0] = {
					branchKey = "CONTROLLERPAD_DECL";
					branchResult = {
						value = 0.1;
					}
				}
			}
		}
		respawnStatusEffects = {
			num = 0;
		}
		idealRespawnDistanceFromSlayer = 0;
		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";
		}
		musicWinState = "music_ghost_states/pvp_lose";
		musicLoseState = "music_ghost_states/pvp_lose";
		musicHealthCriticalState = "music_ghost_states/main_heavy";
		closeCallHealthThreshold = 50;
		clutchThreshold = 5;
		comebackThreshold = 3;
		surpriseTimeLimit = {
			value = 3;
		}
		surviveThreshold = 4;
		requiredPlayerCount = 2;
		respawnHealthScalar = 0.5;
		powerUpgradeRound = 99;
		soundOcclusionBypass = false;
		gameDifficulty = "DIFFICULTY_NIGHTMARE";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
	}
}
}

Slayer vs Slayer

entity {
	entityDef deathmatch_game_challenge {
	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 = 0;
		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";
		}
		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_teammate_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 = {
			allyDemon = "EHM_NONE";
			enemyDemon = "EHM_NONE";
			allySlayer = "EHM_ALWAYS";
			enemySlayer = "EHM_NONE";
		}
		demonHighlightOptions = {
			allyDemon = "EHM_ALWAYS";
			enemyDemon = "EHM_ALWAYS";
			allySlayer = "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 = "";
			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;
		}
		upgradeUIDelaySec = {
			value = 0;
		}
		matchEndCalloutDelaySec = {
			value = 0;
		}
		matchEndResultsDelaySec = {
			value = 0;
		}
		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 = 0;
					}
				}
			}
		}
		respawnTimeCapSec = {
			defaultValue = {
				value = 0;
			}
			branchPairs = {
				num = 1;
				item[0] = {
					branchKey = "CONTROLLERPAD_DECL";
					branchResult = {
						value = 0;
					}
				}
			}
		}
		respawnStatusEffects = {
			num = 0;
		}
		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";
		}
		musicWinState = "music_ghost_states/pvp_win";
		musicLoseState = "music_ghost_states/pvp_lose";
		closeCallHealthThreshold = 50;
		clutchThreshold = 5;
		comebackThreshold = 3;
		surpriseTimeLimit = {
			value = 3;
		}
		surviveThreshold = 4;
		requiredPlayerCount = 2;
		soundOcclusionBypass = false;
	}
}
}

Pickups

Pickup

For non-respawning pickups, only use the idProp2/idMover entities.

idProp2

Remove the bindInfo if this is a self-respawning pickup.

entity {
	entityDef deathmatch_pickup_mega_health_1 {
	inherit = "pickup/health/large";
	class = "idProp2";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true; // Must be true
	disableAIPooling = false;
	edit = {
		bindInfo = { // remove if self-respawning pickup
			bindParent = "deathmatch_pickup_mega_health_1_offset_mover"; // fixes entity offset
		}
		renderModelInfo = {
			model = "art/pickups/health/megaHealth_head_a.lwo";
			contributesToLightProbeGen = false;
			noAmbient = true;
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
			emissiveColor = {
				r = 0;
				g = 0.913725019;
			}
			emissiveScale = 3;
		}
		spawn_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_ITEMS_SPAWNED";
				increase = 1;
			}
		}
		equipOnPickup = true;
		lootStyle = "LOOT_TOUCH";
		triggerDef = "trigger/props/megahealth";
		isStatic = true;
		canBePossessed = true;
		fxDecl = "pickups/megahealth_head";
		useableComponentDecl = "mega_health";
		sound_spawn = "play_pickup_loop_05";
		sound_stop = "stop_pickup_loop_05";
		pickup_statIncreases = {
			num = 1;
			item[0] = {
				stat = "STAT_HEALTH_PICKUP";
				increase = 1;
			}
		}
		spawnPosition = { // Be sure to set the spawn position
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Be sure to set the spawn orientation
			mat = {
				mat[0] = {
					x = -1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = -1;
					z = 0;
				}
			}
		}
		targets = {
			num = 1;
			item[0] = "deathmatch_pickup_mega_health_1_respawn_relay"; // Activates relay to start respawn process
		}
		isLootDrop = true; // Must be true
	}
}
}

idMover

Optional, but will fix the entity offset for the pickup. However, the pickup's spawn orientation will revert to its default value.

entity {
	entityDef deathmatch_pickup_mega_health_1_offset_mover {
	inherit = "func/mover";
	class = "idMover";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Be sure to set the spawn position
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // The spawn orientation does not matter
			mat = {
				mat[0] = {
					x = -1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = -1;
					z = 0;
				}
			}
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			clipModelName = NULL;
		}
	}
}
}

Respawning Pickups

Target Spawn

entity {
	entityDef deathmatch_pickup_mega_health_1_respawn {
	inherit = "target/spawn";
	class = "idTarget_Spawn";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be 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 = "deathmatch_pickup_mega_health_1"; // Activates respawning pickup
		}
}
		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 = "";
		disablePooling = false;
		spawnPosition = { // Be sure to set the spawn position
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Be sure to set the spawn orientation
			mat = {
				mat[0] = {
					x = -1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = -1;
					z = 0;
				}
			}
		}
	}
}
}

Relay

entity {
	entityDef deathmatch_pickup_mega_health_1_respawn_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be false
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1; // Activates on one count
		spawnPosition = { // Spawn position is not important
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "deathmatch_pickup_mega_health_1_respawn"; // Activates target spawn
		}
        delay = 15; // Must have a delay
		repeat = true; // Can activate again
	}
}
}

Chainsaw Pickups

Info

Chainsaw fuel pickups cannot be picked-up after a client has already picked-up 2 of them in the same map.

This method will give ALL Slayers +1 fuel pickup when one Slayer tries to pickup a fuel canister.

idDynamicEntity

entity {
	entityDef coop_pickup_ammo_gas_1_fake {
	inherit = "func/dynamic";
	class = "idDynamicEntity"; // This is the fuel canister model
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Be sure to set the spawn position
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Be sure to set the spawn orientation
			mat = {
				mat[0] = {
					x = -1;
					y = 0;
					z = 0;
				}
				mat[1] = {
					x = 0;
					y = -1;
					z = 0;
				}
			}
		}
		renderModelInfo = {
			model = "art/pickups/ammo/ammo_chainsaw_01.lwo";
			contributesToLightProbeGen = false;
			ignoreDesaturate = true;
			emissiveScale = 0.2;
			scale = {
				x = 2;
				y = 2;
				z = 2;
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_NONE";
		}
		dormancy = {
			canBecomeDormant = true;
		}
	}
}
}

idTrigger

entity {
	entityDef coop_pickup_ammo_gas_1_trigger {
	inherit = "trigger/trigger";
	class = "idTrigger";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Set the spawn position to same as the idDynamicEntity
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 2;
				y = 2;
				z = 2;
			}
		}
		targets = {
			num = 1;
			item[0] = "coop_pickup_ammo_gas_1_fake_timeline"; // Targets the removal or respawn timeline
		}
		playerCanActivate = true;
		clientCanActivate = true;
		triggerForAllClients = true;
		triggerOnEnter = true;
		triggerOnce = true; // Set to false for respawning pickup
		wait = 0; // Add a wait timer for respawning pickup
	}
}
}

Global SFX / Give Fuel

A separate relay entity must exist once to activate the sound effect & give fuel ammo command.

entity {
	entityDef multiplayer_chainsaw_refill_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be false
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 2;
			item[0] = "multiplayer_chainsaw_refill"; // Ammo refill
			item[1] = "multiplayer_chainsaw_refill_sfx"; // Sound effect
		}
		repeat = true; // Must be true
	}
}
}
entity {
	entityDef multiplayer_chainsaw_refill_sfx {
	inherit = "sound/soundentity";
	class = "idSoundEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		temporarySoundEvent = true;
		spawnPosition = { // The spawn position does not matter
			x = 1;
			y = 1;
			z = 1;
		}
		soundOcclusionBypass = true;
		startEvents = {
			num = 1;
			item[0] = "play_pickup_ammo_chainsaw";
		}
		stopEvents = {
			num = 1;
			item[0] = "play_pickup_ammo_chainsaw";
		}
	}
}
}
entity {
	entityDef multiplayer_chainsaw_refill {
	class = "idTarget_Command";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		commandText = "give ammo/sharedammopool/fuel"; // Be sure to set the ammo count to 1 for this decl
		spawnPosition = { // The spawn position does not matter
			x = 1;
			y = 1;
			z = 1;
		}
	}
}
}

Removal Timeline / Relay

entity {
	entityDef coop_pickup_ammo_gas_1_fake_timeline {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true; // Must be true
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 2;
				item[0] = {
					entity = "coop_pickup_ammo_gas_1_fake_remove"; // Remove relay
					events = {
						num = 1;
						item[0] = {
							eventTime = 100;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
				item[1] = {
					entity = "multiplayer_chainsaw_refill_relay"; // SFX & give fuel relay
					events = {
						num = 1;
						item[0] = {
							eventTime = 100;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
entity {
	entityDef coop_pickup_ammo_gas_1_fake_remove {
	inherit = "target/remove";
	class = "idTarget_Remove";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be false
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "coop_pickup_ammo_gas_1_fake"; // Removes the chainsaw canister model
		}
	}
}
}

Respawn Timeline / Relay

entity {
	entityDef coop_pickup_ammo_gas_1_fake_timeline {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true; // Must be true
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 2;
				item[0] = {
					entity = "coop_pickup_ammo_gas_1_fake_relay"; // Respawn relay
					events = {
						num = 2;
						item[0] = {
							eventTime = 100;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
						item[1] = {
							eventTime = 30000; // Show fuel cansiter render model after 30 seconds
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
				item[1] = {
					entity = "multiplayer_chainsaw_refill_fuck_you_relay"; // SFX & give fuel relay
					events = {
						num = 1;
						item[0] = {
							eventTime = 100;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
entity {
	entityDef coop_pickup_ammo_gas_1_fake_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be false
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "coop_pickup_ammo_gas_1_fake"; // Show/Hide fuel canister render model
		}
		repeat = true; // Must be true
	}
}
}

Resetting Encounter Managers

If you want Encounter Managers to reset when a round ends (all players die on either team), you will need to setup a unique exit trigger for every idEncounterManager entity. The round_end entity must target the exit trigger.

idEncounterTrigger_Exit

entity {
	entityDef multiplayer_reset_encounter_on_round_end {
	inherit = "encounter/trigger/exit";
	class = "idEncounterTrigger_Exit";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // The spawn position does not matter
			x = 0;
			y = 0;
			z = 0;
		}
		triggerOnce = false; // Must be false
		resetScriptOnExit = true; // Must be true
	}
}
}

round_end

This entity will always activate so long as the entityDef name is unchanged.

entity {
	entityDef round_end { // Do not change the entityDef name
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be false
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		count = 1;
		delay = 0;
		call = "";
		repeat = true; // Must be true
		checkLiveActivator = false;
		adjustFor16msFrames = false;
		selfActivateDelay = -1;
		waitInterval = 0;
		delayMin = -1;
		delayMax = -1;
		spawnPosition = { // The spawn position does not matter
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 2;
			item[0] = "multiplayer_reset_encounter_on_round_end"; // Exit trigger
			item[1] = "invasion_ambient_music_1_new"; // Recommended to target a new ambient music timeline
		}
	}
}
}

idEncounterManager

entity {
	entityDef coop_encounter_manager_test_1 {
	inherit = "encounter/manager";
	class = "idEncounterManager";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		enableAIHighlightOnFinish = false;
		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 = { // The spawn position does not matter
			x = 0;
			y = 0;
			z = 0;
		}
		combatRatingScale = "COMBAT_RATING_SCALE_IGNORE";
		encounterComponent = {
			entityEvents = {
				num = 1;
				item[0] = {
					entity = "coop_encounter_manager_test_1"; // Must match the entityDef name
					events = {
						num = 1;
						item[0] = {
							eventCall = {
								eventDef = "designerComment";
								args = {
									num = 2;
									item[0] = {
										string = "This is a test encounter";
									}
									item[1] = {
										bool = true;
									}
								}
							}
						}
					}
				}
			}
		}
		exitTriggers = {
			num = 1; // Must be present in addition to the encounter's normal exit trigger
			item[0] = "multiplayer_reset_encounter_on_round_end";
		}
	}
}
}

Music

Event Call

item[0] = {
	eventCall = {
		eventDef = "activateTarget";
		args = {
			num = 2;
			item[0] = {
				entity = "heavy_music_timeline_1";
			}
			item[1] = {
				string = "activate heavy music";
			}
		}
	}
}

Entities

entity {
	entityDef heavy_music_timeline_1 {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 1;
				item[0] = {
					entity = "heavy_music_relay_1";
					events = {
						num = 2;
						item[0] = {
							eventTime = 250;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
			}
		}
		allowOnClients = true;
		allowClientsToStart = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
entity {
	entityDef heavy_music_relay_1 {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "heavy_music_1";
		}
		repeat = true;
	}
}
}
entity {
	entityDef heavy_music_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_heavy";
		initialSwitchGroup = "music_ghost_switch";
		initialSwitchState = "doom_hunter_music";
	}
}
}

Doors

Door

entity {
	entityDef interact_doors_cultist_wide_01_1 {
	inherit = "interact/doors/cultist_wide_01";
	class = "idInteractable_Obstacle";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		soundOffset = {
			z = 1.5;
		}
		whenToSave = "SGT_CHECKPOINT";
		flags = {
			skipRenderModelReplication = true;
		}
		dormancy = {
			distance = 100;
			playerDistance = 120;
			playerRearwardDistance = 80;
		}
		fxDecl = "gameplay/invasion/demon_door";
		interaction = {
			initalState = "interactables/door/normal/locked";
			interactionGraph = "interactables/door";
			stateData = {
				num = 1;
				item[0] = {
					stateName = "interactables/door/normal/locked";
				}
			}
			transitionData = {
				num = 12;
				item[0] = {
					transitionName = "needs_key_To_unlocked_open";
					additionalWaitMs = 1000;
					playSoundOnTransition = "play_doomhunter_widedoor_open_unlocked";
				}
				item[1] = {
					transitionName = "unlocked_To_unlocked_open";
					playSoundOnTransition = "play_doomhunter_widedoor_open";
				}
				item[2] = {
					transitionName = "unlocked_open_To_unlocked";
					playSoundOnTransition = "play_doomhunter_widedoor_close";
				}
				item[3] = {
					transitionName = "locked_To_locked_open";
					playSoundOnTransition = "play_doomhunter_widedoor_open";
				}
				item[4] = {
					transitionName = "locked_open_To_locked";
					playSoundOnTransition = "play_doomhunter_widedoor_close";
				}
				item[5] = {
					transitionName = "unlocked_open_To_locked";
					playSoundOnTransition = "play_doomhunter_widedoor_close";
				}
				item[6] = {
					transitionName = "locked_To_locked_fail";
				}
				item[7] = {
					transitionName = "needs_key_To_needs_key_failed";
				}
				item[8] = {
					transitionName = "locked_To_unlocked";
				}
				item[9] = {
					transitionName = "unlocked_To_locked";
				}
				item[10] = {
					transitionName = "start_locked_To_locked";
				}
				item[11] = {
					transitionName = "locked_To_stay_open";
				}
			}
			animWebDecl = "animweb/interact/doors/cultist_wide_01";
		}
		touchData = {
			retouchDelaySec = 0.5;
			triggerDef = "trigger/interact/cultist_wide_01_square";
		}
		stateColors = {
			num = 8;
			item[0] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_red";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_red";
					}
				}
				state = "start_locked";
			}
			item[1] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_red";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_red";
					}
				}
				state = "activate_to_unlock";
			}
			item[2] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_red";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_red";
					}
				}
				state = "locked";
			}
			item[3] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_red";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_red";
					}
				}
				state = "needs_key";
			}
			item[4] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_green";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_blue";
					}
				}
				state = "unlocked";
			}
			item[5] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_green";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_blue";
					}
				}
				state = "locked_open";
			}
			item[6] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_green";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_blue";
					}
				}
				state = "unlocked_open";
			}
			item[7] = {
				colorScale = 5;
				materialSwapList = {
					num = 2;
					item[0] = {
						from = "art/tile/glow/doorglow_a";
						to = "art/tile/glow/doorglow_green";
					}
					item[1] = {
						from = "art/tile/glow/doorglow_b";
						to = "art/tile/glow/doorglow_blue";
					}
				}
				state = "stay_open";
			}
		}
		collisionPieces = {
			num = 4;
			item[0] = {
				meshName = "collision";
				jointName = "collision_joint";
			}
			item[1] = {
				meshName = "collision1";
				jointName = "collision1_joint";
			}
			item[2] = {
				meshName = "collision2";
				jointName = "collision2_joint";
			}
			item[3] = {
				meshName = "collision3";
				jointName = "collision3_joint";
			}
		}
		blockerBoundsExpandDists = {
			x = 0.100000001;
			y = 1;
			z = 0.100000001;
		}
		stateObstacleData = {
			num = 16;
			item[0] = {
				statePath = "interactables/door/normal/activate_to_unlock";
				obstacleReachability = true;
			}
			item[1] = {
				statePath = "interactables/door/normal/locked";
				obstacleReachability = true;
			}
			item[2] = {
				statePath = "interactables/door/normal/locked_fail";
				obstacleReachability = true;
			}
			item[3] = {
				statePath = "interactables/door/normal/locked_open";
			}
			item[4] = {
				statePath = "interactables/door/normal/needs_key";
				obstacleReachability = true;
			}
			item[5] = {
				statePath = "interactables/door/normal/needs_key_failed";
				obstacleReachability = true;
			}
			item[6] = {
				statePath = "interactables/door/normal/start_locked";
				obstacleReachability = true;
			}
			item[7] = {
				statePath = "interactables/door/normal/stay_open";
			}
			item[8] = {
				statePath = "interactables/door/normal/unlocked";
			}
			item[9] = {
				statePath = "interactables/door/normal/unlocked_open";
			}
			item[10] = {
				statePath = "interactables/door/oneWay/oneWay_closed";
				obstacleReachability = true;
			}
			item[11] = {
				statePath = "interactables/door/oneWay/oneWay_lock_fail";
				obstacleReachability = true;
			}
			item[12] = {
				statePath = "interactables/door/oneWay/oneWay_locked";
				obstacleReachability = true;
			}
			item[13] = {
				statePath = "interactables/door/oneWay/oneWay_open";
			}
			item[14] = {
				statePath = "interactables/door/oneWay/oneWay_open_fail";
				obstacleReachability = true;
			}
			item[15] = {
				statePath = "interactables/door/oneWay/oneWay_opened";
			}
		}
		dissolveDistance = 20;
		renderModelInfo = {
			model = "md6def/objects/doors/cultist_wide_door_01/cultist_wide_door_01.md6";
		}
		guiData = {
			swfFile = "swf/worldgui/guientity/1_interact_lock_default.swf";
			scale = 0.0850000009;
			initialCommands = {
				num = 1;
				item[0] = {
					commandType = "SPRITE_HIDE";
				}
			}
			positionOffset = {
				x = 8;
				z = 25;
			}
		}
		umbraVisBlocking = "CAN_BLOCK";
		umbraSoundBlocking = "CAN_BLOCK";
		demonPlayerRenderModel = "art/objects/door/demon/cultist_wideDoor_01_demon.lwo";
		spawnPosition = {
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		demonPlayersPassThrough = false;
	}
}
}

Open

entity {
	entityDef interact_doors_cultist_wide_01_1_open {
	inherit = "target/interact_action_door";
	class = "idTarget_InteractionAction";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		renderModelInfo = {
			materialRemap = {
				num = 1;
				item[0] = {
					to = "art/tile/common/nodraw";
				}
			}
		}
		actionFilter = "interactionAction/door";
		spawnPosition = {
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		targets = {
			num = 1;
			item[0] = "interact_doors_cultist_wide_01_1";
		}
		action = "IA_DOOR_OPEN";
	}
}
}

Replication

entity {
	entityDef interact_doors_cultist_wide_01_1_timeline {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 2;
				item[0] = {
					entity = "interact_doors_cultist_wide_01_1_relay";
					events = {
						num = 1;
						item[0] = {
							eventTime = 250;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
				item[1] = {
					entity = "interact_doors_cultist_wide_01_1_remove";
					events = {
						num = 1;
						item[0] = {
							eventTime = 2500;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
entity {
	entityDef interact_doors_cultist_wide_01_1_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "interact_doors_cultist_wide_01_1_open";
		}
		repeat = true;
	}
}
}
entity {
	entityDef interact_doors_cultist_wide_01_1_remove {
	inherit = "target/remove";
	class = "idTarget_Remove";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "interact_doors_cultist_wide_01_1";
		}
		repeat = true;
	}
}
}

Shootables

Shootable

Disable network replication

entity {
	entityDef funky_shootable_1 {
	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.25;
				y = 0.25;
				z = 0.25;
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 1.5;
				y = 1.5;
				z = 1.5;
			}
		}
		spawnPosition = {
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = -1;
					z = 0;
				}
				mat[1] = {
					x = 1;
					y = 0;
					z = 0;
				}
			}
		}
		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_";
		targets = {
			num = 1;
			item[0] = "funky_shootable_1_timeline";
		}
		dormancy = {
			allowDormancy = false;
			allowPvsDormancy = false;
		}
		keepAfterTriggerOnce = true;
	}
}
}

Replication

entity {
	entityDef funky_shootable_1_timeline {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 2;
				item[0] = {
					entity = "funky_shootable_1_relay";
					events = {
						num = 1;
						item[0] = {
							eventTime = 250;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
				item[1] = {
					entity = "funky_shootable_1_remove";
					events = {
						num = 1;
						item[0] = {
							eventTime = 250;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
entity {
	entityDef funky_shootable_1_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "something_to_activate";
		}
		dormancy = {
			allowPvsDormancy = false;
		}
		delay = 0;
	}
}
}
entity {
	entityDef funky_shootable_1_remove {
	inherit = "target/remove";
	class = "idTarget_Remove";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "funky_shootable_1";
		}
		dormancy = {
			allowPvsDormancy = false;
		}
		delay = 0;
	}
}
}

Breakable Walls

Breakable Wall

entity {
	entityDef destructible_mall_wall_b_1 {
	inherit = "destructible/e2m1_nest/mall_wall_b";
	class = "idDestructible";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		whenToSave = "SGT_CHECKPOINT";
		flags = {
			skipRenderModelReplication = true;
		}
		soundOffset = {
			z = 1.5;
		}
		renderModelInfo = {
			emissiveColor = {
				r = 0;
				b = 0.0470587984;
			}
			emissiveScale = 6;
			model = "art/kit/hell_earth/walls/crack_mall_b_whole.lwo";
			acceptsDecals = true;
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 7.19999981;
				y = 1;
				z = 7.0999999;
			}
			numSides = 6;
		}
		soundOcclusionBypass = true;
		targetingDecl = NULL;
		fxDecl = "gameplay/invasion/demon_door";
		destructible = {
			idleCommands = {
				num = 1;
				item[0] = {
					time = 10000;
					command = "IDLE_COMMAND_BECOME_STATIC";
				}
			}
			decl = "destructible/e2m1_nest/mall_wall_b";
		}
		effectiveDamageTypes = {
			num = 1;
			item[0] = "damage/special/no_damage";
		}
		meleeOnDash = false;
		dissolveDistance = 20;
		demonPlayerRenderModel = "art/kit/hell_earth/walls/crack_mall_a_demon.lwo";
		umbraVisBlocking = "CAN_BLOCK";
		umbraSoundBlocking = "CAN_BLOCK";
		spawnPosition = {
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		dormancy = {
			playerDistance = 20;
			playerRearwardDistance = 20;
			allowDistanceDormancy = false;
			allowDormancy = true;
			allowPvsDormancy = false;
		}
		targets = {
			num = 1;
			item[0] = "destructible_mall_wall_b_1_timeline";
		}
		demonPlayersPassThrough = false;
	}
}
}

Replication

entity {
	entityDef destructible_mall_wall_b_1_timeline {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 1;
				item[0] = {
					entity = "destructible_mall_wall_b_1_relay";
					events = {
						num = 1;
						item[0] = {
							eventTime = 250;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
entity {
	entityDef destructible_mall_wall_b_1_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "destructible_mall_wall_b_1";
		}
		repeat = false;
	}
}
}

Bounce Pads

Dynamic Entity (Backer)

entity {
	entityDef invasion_bouncepad_back_1 {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Set the position roughly -0.2 (on the z axis) behind the emitter FX
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Backer should be laying on the ground
			mat = {
				mat[0] = {
					x = 0.707107;
					y = -0.707107;
					z = 0;
				}
				mat[1] = {
					x = 0.707107;
					y = 0.707107;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 0;
					z = 1;
				}
			}
		}
		renderModelInfo = {
			model = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo";
			scale = { // Do not change the scale, it will break collision
				x = 0.66;
				y = 0.66;
				z = 0.5;
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo"; // Adds collision
		}
	}
}
}

Emitter FX (Slayer Team)

entity {
	layers {
		"game/pvp/slayer_team" // Only the Slayer can see this FX
	}
	entityDef invasion_bouncepad_fx_slayer_1 {
	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 = { // Position should be identical to the FX on the demon team
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		fxEffect = "gameplay/invasion/bounce_pad_slayer"; // Emitter is red
		spawnOrientation = { // Orientation should not be changed
			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;
				}
			}
		}
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}

Emitter FX (Demon Team)

entity {
	layers {
		"game/pvp/demon_team" // Only Demon Players can see this FX
	}
	entityDef invasion_bouncepad_fx_slayer_1 {
	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 = { // Position should be identical to the FX on the slayer team
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
        automapPropertiesDecl = "invasion_bounce_demon";
		fxEffect = "gameplay/invasion/bounce_pad_demon"; // Emitter is purple
		spawnOrientation = { // Orientation should not be changed
			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;
				}
			}
		}
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}

Bouncepad

entity {
	entityDef invasion_bouncepad_from_1 {
	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 = { // Position should be roughtly +1 (z axis) above the FX
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		renderModelInfo = {
			model = NULL;
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		clipModelInfo = {
			clipModelName = "maps/game/sp/e1m3_cult/e1m3_cult/invasion_x_bouncepad_from_1";
			size = {
				x = 1.5;
				y = 1.5;
				z = 1;
			}
		}
		playerCanActivate = false; // Slayer cannot activate
		demonPlayerCanActivate = true; // Demon players can activate
		destination = "invasion_bouncepad_dest_1"; // Fly to this destination when activated
		launchSpeed = 32; // Speed demons will fly upwards
	}
}
}

Destination

entity {
	layers {
		"game/pvp/demon_team" // Only demon players can be launched
	}
	entityDef invasion_bouncepad_dest_1 {
	inherit = "info/bounce_destination";
	class = "idInfo_BounceDestination";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Increase z axis position close to the destination
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Orientation does not matter
			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;
				}
			}
		}
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}

Teleporters

Timeline

The timeline is only required for teleporter cooldowns.

entity {
	layers {
		"game/pvp/demon_team" // Applies only to Demon Players
	}
	entityDef invasion_portal_timeline_1 {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be false so cooldown is not shared globally
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 2;
				item[0] = {
					entity = "invasion_portal_fx_demon_1";
					events = {
						num = 2;
						item[0] = {
							eventCall = {
								eventDef = "hide"; // Hide 1st effect upon activation
								args = {
									num = 0;
								}
							}
						}
						item[1] = {
							eventTime = 5000;
							eventCall = {
								eventDef = "show"; // Show 1st effect after 5 seconds
								args = {
									num = 0;
								}
							}
						}
					}
				}
				item[1] = {
					entity = "invasion_portal_fx_demon_2";
					events = {
						num = 2;
						item[0] = {
							eventCall = {
								eventDef = "hide"; // Hide 2nd effect upon activation
								args = {
									num = 0;
								}
							}
						}
						item[1] = {
							eventTime = 5000;
							eventCall = {
								eventDef = "show"; // Show 2nd effect after 5 seconds
								args = {
									num = 0;
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true; // Must be true
		shouldForceTimelineFinish = true; // Must be true
	}
}
}

Dynamic Entity (Backer)

entity {
	entityDef invasion_portal_back_1 {
	inherit = "func/dynamic";
	class = "idDynamicEntity";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Set the spawn position roughly -0.2 (on the x or y axis) behind the portal FX
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Backer should be standing upright
			mat = {
				mat[0] = {
					x = 0;
					y = 0;
					z = -1;
				}
				mat[1] = {
					x = -1;
					y = 0;
					z = 0;
				}
				mat[2] = {
					x = 0;
					y = 1;
					z = 0;
				}
			}
		}
		renderModelInfo = {
			model = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo";
			scale = { // Do not change the scale, it will break collision
				x = 0.66;
				y = 0.66;
				z = 0.5;
			}
		}
		clipModelInfo = {
			clipModelName = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo"; // Adds collision
		}
	}
}
}

Portal FX (Slayer Team)

entity {
	layers {
		"game/pvp/slayer_team" // Only the Slayer can see this FX
	}
	entityDef invasion_portal_fx_slayer_1 {
	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 = { // Position should be identical to the FX on the demon team
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Orientation should be identical to the FX on the demon team
			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 = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		flags = {
			hide = false;
		}
		fxEffect = "gameplay/invasion/teleporter_flat_demon"; // FX is red
	}
}
}

Portal FX (Demon Team)

entity {
	layers {
		"game/pvp/demon_team" // Only Demon Players can see this FX
	}
	entityDef invasion_portal_fx_demon_1 {
	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 = { // Position should be identical to the FX on the slayer team
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Orientation should be identical to the FX on the slayer team
			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 = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		flags = {
			hide = false;
		}
		fxEffect = "gameplay/invasion/teleporter_flat_slayer"; // FX is blue
	}
}
}

Teleporter

entity {
	layers {
		"game/pvp/demon_team" // Only demon players can use the teleporter
	}
	entityDef invasion_portal_from_1 {
	inherit = "trigger/teleporter";
	class = "idTrigger_Teleporter";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false; // Must be false so cooldown is not shared globally
	disableAIPooling = false;
	edit = {
		clientCanActivate = true; // Must be true
		fxExtraCondition = "FX_EXTRA_COND_MAX";
		sounds = {
			activated = "play_arena_teleporter_use";
		}
		spawnPosition = { // Position should be close to the idDynamicEntity backer
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		renderModelInfo = {
			model = NULL;
		}
		clipModelInfo = {
			type = "CLIPMODEL_CYLINDER";
			size = { // Scale based on portal size
				x = 1;
				y = 3;
				z = 2;
			}
			clipModelName = NULL;
		}
		targets = {
			num = 1;
			item[0] = "invasion_portal_timeline_1"; // Activate the timeline to show and hide FX
		}
		dormancy = {
			playerDistance = 6;
			playerRearwardDistance = 6;
		}
		flags = {
			hide = false;
		}
		wait = 5; // Deactivate both teleporters for 5 seconds
		playerCanActivate = false; // Slayer cannot activate
		demonPlayerCanActivate = true; // Demon players can activate
		otherTeleporter = "invasion_portal_from_2"; // Deactivate this teleporter
		destination = "invasion_portal_dest_1"; // Go to this destination when activated
	}
}
}

Destination

entity {
	entityDef invasion_portal_dest_1 {
	inherit = "info/teleport_destination";
	class = "idInfo_TeleportDestination";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		spawnPosition = { // Position should be just foward of the opposing idTrigger_Teleporter
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = { // Orientation should be identical to the opposing idEntityFx
			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;
				}
			}
		}
	}
}
}

Triggers

Trigger

entity {
	entityDef trigger_volume_1 {
	inherit = "trigger/trigger";
	class = "idTrigger";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		demonPlayerCanActivate = true;
		removeFlag = "RMV_CHECKPOINT_ALLOW_MS";
		spawnPosition = {
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		renderModelInfo = {
			model = NULL;
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
		clipModelInfo = {
			type = "CLIPMODEL_BOX";
			size = {
				x = 5;
				y = 5;
				z = 5;
			}
		}
		targets = {
			num = 1;
			item[0] = "trigger_volume_1_timeline";
		}
		wait = 0;
		triggerOnce = true;
	}
}
}

Replication

entity {
	entityDef trigger_volume_1_timeline {
	inherit = "target/timeline";
	class = "idTarget_Timeline";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = true;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		componentTimeLine = {
			entityEvents = {
				num = 1;
				item[0] = {
					entity = "trigger_volume_1_relay";
					events = {
						num = 1;
						item[0] = {
							eventTime = 250;
							eventCall = {
								eventDef = "activate";
								args = {
									num = 1;
									item[0] = {
										entity = "";
									}
								}
							}
						}
					}
				}
			}
		}
		allowClientsToStart = true;
		renderModelInfo = {
			scale = {
				x = 1;
				y = 1;
				z = 1;
			}
		}
	}
}
}
entity {
	entityDef trigger_volume_1_relay {
	inherit = "target/relay";
	class = "idTarget_Count";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		networkSerializeTransforms = false;
		count = 1;
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
		targets = {
			num = 1;
			item[0] = "something_to_activate";
		}
		repeat = true;
	}
}
}

Gorilla Bars

Entity

Disable network replication.

entity {
	entityDef game_interact_vault_pipe_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/test/monkey_bar_a.lwo";
		}
		netRelevancyFlags = "";
		triggerOnce = false;
		triggerOnEnter = true;
		testForValidGrab = true;
		spawnPosition = {
			x = -11.11;
			y = -11.11;
			z = -11.11;
		}
		spawnOrientation = {
			mat = {
				mat[0] = {
					x = 0;
					y = 1;
				}
				mat[1] = {
					x = -1;
					y = 0;
				}
			}
		}
		clipModelInfo = {
			clipModelName = "art/test/monkey_bar_a.lwo";
		}
		animOffsetAdjust = {
			x = -1;
		}
	}
}
}

Startup Commands

Add this to "shell.entities" and trigger with a logic entity

entity {
	entityDef mapstart_commands {
	class = "idTarget_Command";
	expandInheritance = false;
	poolCount = 0;
	poolGranularity = 2;
	networkReplicated = false;
	disableAIPooling = false;
	edit = {
		flags = {
			noFlood = true;
		}
		commandText = "pvp_lobby_showFullMapList 1; net_gameserver_enable 0; net_maxRate 100; g_havokHeapLimitMB 200; g_damageScaleAItoDP 4; g_damageScaleSlayertoSlayer 0; g_damageScaleSlayertoDP 0; g_damageScaleDPtoSlayer 0; pm_disableWalkingOnTheEdgeOfLedge 0; warning_disable general; warning_disable anim";
		spawnPosition = {
			x = 1;
			y = 1;
			z = 1;
		}
	}
}
}

Command details