Monster Spawner Tutorial {Unfinished}
Posted: Tue Sep 25, 2012 8:38 pm
Table of Contents
Setup
You'll need the following packages to be able to run the game mod:
Go to the Actor Class browser and open the DWAssaultMapperTools.u file. To find the monster spawner, go to Keypoint -> Thing Factory -> Creature Factory -> DWMonsterSpawner -> BasicMonsterSpawner. Place this actor somewhere in your map where you may find it.
To place a spawn point, return to the actor class browser. Go to NavigationPoint -> SpawnPoint. Place a spawn point to where you want your monster to potentially spawn. If there's multiple spawn points for the monster spawner, then the monster spawner will pick a random spawn point the monster can fit in every time it attempts to spawn a monster.
Triggering
We need a way to tell the monster spawner when to spawn its monsters. Once the monster spawner heard its signal, it'll spawn its monster(s).
The easiest way in doing this is by positioning the monster spawner, itself. by adjusting the monster spawner's collision properties (collision -> collision radius and collision height), and setting Misc -> Player Collision Trigger equal to true, the monster spawner will not spawn a monster until a character runs into its collision radius. Be mindful that players, vehicles, any monster, and redeemer warheads may trigger this spawner.
The recommended way (for more control, cleaner, and grouping) is by associating the spawner to an event. A way you may do this is by placing a proximity trigger (found in the actor class browser: triggers->trigger). With the trigger, you may associate with volumes, apply a class constraint, assign retrigger properties, etc.. To make this trigger detect on foot attackers only, set the trigger's class constraint property equal to AssaultxPawn. You also need to link up the monster spawner to the trigger. To do this, set the monster spawner's tag property equal to the trigger's event property. Both of these properties may be found in the events category for both actors.
The monster spawner also needs to be linked to the spawn point(s). To do this, set the spawn point(s) tag equal to the monster spawner's SpawnPointTag (in the events category). A monster spawner may support up to 16 spawn points.
Picking a Monster Class
See DWMonsterRoster for a list of monsters, and their associated index numbers.
There are two ways to pick a monster class. the easiest way is by typing the monster's name in the Monster Spawner -> MonsterSpawning -> MonsterName property. You must spell the monster's name correctly for the monster spawner to find the monster. If the monster is not found, you'll be given an error message in the UT2004.log (in system directory), and a Krall will spawn instead. If you're picky about performance, and you hate linear searching, you can narrow down the search by selecting a package name. For an example: you'll want the package name to be Doom Monsters if you're going to spawn a Sentry. The monster spawner will not even search in the Skaarj Pack or the Dragons to look for a match in "Sentry". The default value 'IDontKnowSearchEntireTable' is safest since that'll tell the monster spawner to search through all monsters.
The other option in picking a monster class is by index. Although, you'll have to look up the correspinding number to every monster you wish to spawn, this still has advantages over the other option. With by indexes option, you may have the monster spawner spawn a range of monsters. The monster roster is sorted by package, then relevance then difficulty. Since related monsters are grouped together, the mapper may spawn a variety of monsters that are similar and still slighty fluxuate the difficulty randomly. For an example, you want to set the index range from 8 to 9 if you want the monster spawner to randomly select either a Krall or Elite Krall every time it spawns a monster. Also since it searches in constant time (much faster than linear), you don't even have to worry about selecting a package since that has no affect when picking a monster class by index.
Another thing to note, if you are mapping with only the SmartMonsterPackSample then you'll only face SkaarjPack monster during offline testing. Because of the DWMonsterRoster.ini in your UT2004/system folder, the Satore, WOS, Bio, Doom, Dragons, Dinosaurs, Xenomorphs, Unreal Classic, Misc, and Boss monsters will be substituted by OSM (SkaarjPack) monsters. However when your map goes live, they will respawn as their intended class.
Basic Monster Spawner
These are the necessary properties you'll need to know to properly utilize the Basic Monster Spawner.
Misc category
bCollisionTriggered (type boolean)
If true, then the monster spawner will spawn its monsters when any pawn (vehicle, character, monster) enters within its collision cylinder.
CreatureFactoryID (type integer)
See this part in document for use of this.
MaxMonstersAtOnce (type integer)
How many monsters should be alive at first. The monster spawner will spawn monsters up to this number. Should one of the factory's monsters die, then it will continue spawning monsters until it's either out of lives or number of monsters reaches to this number again.
Monster Attributes
bIsBoss (type boolean)
If true, then this monster will gain additional properties. The player adjustment formula is much more dynamically adjusted than a standard monster. More aggression. Less knockback anim from taking damage. Improved AI behavior. etc...
bMonsterVariesOnPlayers (type boolean)
If true, then the monster's health and score will dynamically be adjusted based on number of players.
bVaryMonsterAttributesOnSize (type boolean)
If you have a scaleSize range, then the monster attributes will be adjusted relative to the scale Size's range. Setting the scale Size range = to 2 will not adjust the monster's strength. However the monster will adjust if the range is from 1.5 - 2. Where the monster at scale 2 will be 1.071428... times stronger than a monster at scale size 1.75. This is useful if you are using varied size creatures of the same species (such as dinosaurs). Typically the larger creature should be stronger than the smaller ones. Setting this to false will make the monster spawner ignore the dynamically adjusted strength based on its relative scale size.
ChanceToReflectProjectiles (type float)
If value is greater than zero, then the monster will reflect projectiles as if it was a metal monster or something. 0 => don't reflect at all. 0.5 => reflect half the energetic projectiles. 1 => always reflect energetic projectiles. Leaving it negative will let the monster's default properties take over. Monsters like the Gold Angus will reflect projectiles by default.
DamageModifier (type float)
This is the damage multiplier for the monster. 2.0 => twice the damage. 0.5 => half damage.
Health Modifier (type float)
This is the health multiplier for the monster. 2.0 => twice the default health. 0.5 => half health. This is multiplied before the dynamically adjusted values are calculated. Score Value is also adjusted based on monster's health to keep the exp per damage ratio consistent for this monster.
MonsterGibType (type class<xPawnGibGroup>)
If this value is not none, then the monster's gib type will switch to this class. This is useful if you want to make a robotic creature or an organic creature from a monster class that doesn't fit that criteria.
MonsterNetSkins[8] (type Array<Material>)
This is the skin you can attach to the monster. Just like skinning any mesh, a creature may have multiple layers of skins.
ScaleSize (type Range of floats)
The monster's scale, prepivot, and collision will be adjusted randomly based on the range specified here. Defaults 1 - 1 will keep the creature at normal size.
Score Multiplier (type float)
This is the experience multiplier received when players damage this monster. 2.0 => twice the exp. 0.5 => Half the exp. This property will be closely monitored.
You want this value to be from 0 - 0.1 for infinite monsters. Only set this above 1 for monsters that have damage scaling above 1. Remember that the health multiplier already adds to the monster's scoring value. No need to adjust the score based on your HealthModifier property.
Speed Modifier (type float)
This adjusts the monster's ground, swim, and flying speed. 0 => stationary monster. 0.5 => half speed. 2.0 => twice as fast.
Monster Spawning
bAnyEventMayTrigger (type boolean)
If true, then the monster spawner will always spawn its monsters regardless who triggered the event.
bEmitTeleportationEmitter (type boolean)
If true, then it'll spawn a particle emitter where the monsters spawn. The class is determined via EmitSpawningEmitter.
bInfiniteLives (type boolean)
If true, then the monster spawner will have infinite lives.
bToggleInfLives (type boolean)
If true, then the spawner will toggle its InfLives property every time it's triggered. Make sure bInfiniteLives = false if you want infinite monsters the first time it's triggered. Even first trigger will toggle bInfiniteLives.
Warning: Monsters will trigger this factory every time a monster dies. Make sure bAutoRespawn is false (in advanced Monster Spawner)
ChanceToSpawn (type float)
This is the percent chance that this factory will appear in game. 0.1 => 10% chance that the factory will exists. 0.5 => 50% chance that the factory will exist. 1.0 => the factory will be in every game.
EmitSpawningemitter (type class<Emitter>)
Emitter that'll spawn at every monster spawn.
Lives (type int)
How many monsters this factory should spawn.
MonsterName (type name)
Monster class that should spawn
MonsterNumber Max & Min (type int)
Monster class (specified by monster class's associate index number to the MonsterTable) that should spawn. The factory will randomly pick the monsters from Min - Max. These properties are ignored if MonsterName is not None or blank.
MonsterPackage (Type enumerator)
Narrows scope for monster class searching (ignored if MonsterName is None or blank).
MonstersPerTrigger (type Range)
If you're using the Advanced Monster Spawner you can set bStoppable to true. bStoppable will only spawn monster(s) every time it's triggered. If you're using this method, then this property specifies how many monsters should spawn every time this is triggered. It randomly picks a value from Min - Max after each trigger. By default bStoppable is false. This property useless for BasicMonsterSpawner.
RandomExtraLivesMax (type int)
Randomly generates extra monsters to add onto lives.
Real Num Lives = Lives + Random from 0 - RandomExtraLives;
RecalcExtraLives (type Struct)
bIncludedDeadPlayers (type boolean)
If true, then dead players are also included when calculating extra lives.
bUseAutoRecalcExtraLives (type boolean)
If true, then the random extra lives are recalculated upon the first trigger.
bWeighted (type boolean)
If true, then the RandomExtraLivesMax property will be influenced based on number of players. More players => greater chance to spawn monsters. It will always stay under Max limit.
MaxMultiFactorPerPlayer (type float)
This will add extra lives based on number of players. 0.5 => One extra monster for every two players. 2.0 => 2 extra monsters for every player. This property is ignored if bWeighted is true. This stacks on the RandomExtraLivesMax.
Formula: RandomExtraLivesMax = Rand(RandomExtraLivesMax + 1) + Round(NumberOfPlayers * MaxMultiFactorPerPlayer);
Advanced Monster Spawner
The advanced monster spawner is the parent class of the BasicMonsterSpawner (DWMonsterSpawner). The Basic Monster Spawner simply conceals many properties from the DWMonsterSpawner, and it initializes several properties for easy use. The DWMonsterSpawner, although more complicated, enables you to setup some unique monster setups. Going over the properties for the DWMonsterSpawner
AI
AIScriptTag (type name)
Associate this monster with a ScriptedSequence
Alertness (type float)
Sets the monster's awareness to environment. This also applies the monster's reaction time when seeing a pawn. Range is from -1 to 1.
AttitudeToPlayer (type enumerator)
Monster's behavior towards players. Note: monsters have different reactions based on the monster's species type and current situation.
Fear-attempts to run away from player. Attacks if the monster has little hope in escaping.
Hate-attacks players (default)
Frenzy-The pawn acts a bit less concentrated with less accuracy. The pawn will fight to the end and never flees.
Threaten-Will make hostile motions but will wait for the player to initiate combat.
Ignore-Ignores players
Friendly-Monster is friendly to towards player. Will fight for the players. Will turn hostile if player attacks monster.
Follow-Not yet implemented (use Max instead)
Max-Max always friendly to player. Will follow and fight for the player.
bCanUse (type boolean)
If true, then the monster may interact with buttons (UseTriggers).
bCrouchingAnimation (type boolean)
If your starting animation has the creature laying down or crouch, set this to true to recalculate its collision cylinder.
bFriendlyFire (type boolean)
If true, the monsters on the same alignment may damage this monster.
bIsTeamLeader (type boolean)
Is this the leader for the squad of monsters that matches the TeamTag? Set this to true for one of the Dice Krall. This Krall will spawn the dice.
bNoCrushVehicle (type boolean)
If false, then the players may easily crush this monster in vehicles.
bPlayerCanDamage (type boolean)
If false, then the monster will ignore damage from players.
bQuiet (type boolean)
If true, then the monster will not make extraneous sound (such as roaring from Doom Monsters).
EndingAnimation (type name)
Animation to play after seeing a player (it's the transition from StartingAnim to normal fighting)
HearingThreshold (type float)
Distance the monster can hear from sound FX such as shooting.
SightRadius (type float)
How far the monster can see.
StartingAnim (type name)
Animation to play when the monster spawns. The monster will continuously loop this animation until it sees a player. Alertness will be reduced.
TeamTag (type name)
Which team does this monster belongs to. If bIsTeamLeader = false, then the monster will attempt to find its leader. It'll follow and protect the leader if found. Minions share leader's reaction to players. (Minion hates players if leader hates players)
CreatureFactory
AddedCoopCapacity (type int)
This is primarily used in parent class (Creature Factory). MonsterSpawning->RecalcExtraLives property replaced AddedCoopCapacity for the DWMonsterSpawner.
AlarmTag (type name)
Tag for alarm point this creature should be aware about.
bAutoRespawn (type boolean)
If true, then the monster spawner will immediately spawn a new monster every time one of its existing monsters died.
bDelayedPatrol (type boolean)
If true, then the monster will not start patroling until it is triggered.
GoodieDrop (type dynamic array[class<Pickups>])
The creature will drop all of these items when it dies.
MonsterLoot (type enumerator)
Types of items that may be dropped through the monster loot mutator. The mutator is not running in Monster Evolution. However, this may be enabled in the future if the demand for monster loot is high enough.
MonsterLootChanceMultiplier (type float)
Multiplied chance of dropping an item through the monster loot mutator. 0.5 => half as likely to drop an item. 2.0 => twice as likely to drop an item.
MonsterLootRange (type Range of floats)
Each monster will randomly have a MonsterLoot type from Min to Max.
0 = None
1 = Any
2 = Basic Pickups
3 = Minor Pickups
4 = Handy Pickups
5 = Valuable Pickups
6 = Major Pickups
7 = Healing Pickups
8 = Ammo Pickups
9 = Adrenaline Pickups
10 = Misc Powerups
11 = Experience Shards
Orders (type name)
Initial state for the monster. The monster will resume to initial orders when it lost or defeated its enemy.
Waiting (default): Monster simply roams around spawn area.
Guarding: Monster will stand still at spawn area (no moving until it sees an enemy).
Ambushing: Travel to an AmbushPoint and wait for an enemy, then attacks
Patroling: Continuously walks to PatrolPoints until encountered an enemy.
OrderTag (type name)
Associated actor tag for the monster's orders. Ex: the tag for the first patrol point if the monster is Patroling. Or the tag of AmbushPoint if it's Ambushing.
MonsterAttacks
This category is still underdeveloped (it's new). This is where the mapper may customize attacks. Currently this only works on SkaarjPack monsters. More details on this category will be displayed when the beta test is over.
MonsterEvents
bHateWhenTriggered (type boolean)
If true, then the monster will attack the instigator whom triggered the event. This is the aggro.
bKillMonsterWhenTriggered (type boolean)
If true, then the monster will immediately die when triggered.
bToggleInvlunerability (type boolean)
If true, then the monster will toggle its bPlayerCanDamage boolean every time it's triggered.
KilledEvent (type name)
Event that'll trigger when this monster dies.
Note: This property sets bAutoRespawn to false. You'll have to rely on timed (ThingFactory->Interval) or triggered (ThingFactory->bStoppable) spawning if you want to spawn replacements.
MonsterTag (type name)
The monster's tag. If an event that triggers matches this monster's tag, then the monster will do something (specified by the boolean properties above).
SpawnEvent (type name)
Event that'll trigger when this monster spawns. Note: This will trigger every time for every monster that spawns.
MonsterResistances
You can customize the monster's resistances through this category. Leaving the default values at -0.000001 => the monster will use the monster class's default resistances. Anything other than that value will overwrite the monster's resistances.
2.0 => 200% resistances. 1.0 => 100% resistances. 0.55 => 55% resistances. 0 => 0% resistances. -0.75 => -75% resistances.
SneakAttackDamageScale (type float)
This is the damage multiplier if the player damages an unaware monster. 2.0 => double damage. 0.5 => half damage. -1 => Heal the monster.
MonsterSounds
bMonsterFullVolume (type boolean)
If true, then the monster's volume will be maxed.
bPitchedBasedSize (type boolean)
If true, then the monster's pitch will vary on the monster's size. Larger monsters will have lower pitches than smaller monsters.
ChallengeSounds (type Array[4] of Sounds)
You can overwrite the monster's challenge sounds. Challenge sounds is played when a monster sees a player.
DeathSounds (type Array[4] of sounds)
You can overwrite the monster's death sounds. These are played when the monster dies.
HitSounds (type Array[4] of sounds)
You can overwrite the monster's hit sounds. These are played when the monster takes damage.
SoundVolumeMultiplier (type float)
Adjust the sound volume through this multiplier. 2.0 => twice as loud. 0.5 => half as loud. Note: UT sounds has its limits. You can't expect the monster will make deafining sounds if the value is 10X or so.
ThingFactory
bCovert (type boolean)
If true, then the monster will only spawn where players are not looking.
bFalling (type boolean)
If true, then the monster's physics is set to falling. By default flying monsters will fly. Setting this to true, will make them fall.
bOnlyPlayerTouched (type boolean)
If true then a human player must activate this spawner when entering its collision cylinder. Note: Player Monsters are still human controlled. Your map can be easily glitched if you set this to true. Use caution.
bStoppable (type boolean)
If true, then the spawner will only spawn monster(s) every time it's triggered. The number of monsters per trigger may be set through MonsterSpawning -> MonstersPerTrigger property.
Capacity (type int)
This property is replaced by Lives. Use Lives instead.
Interval (type float)
If bStoppable is false, then the monster spawner will spawn a new monster every x many seconds. 0 => instantaneously spawn all of its monsters. 2 => 1 monster for every 2 seconds. The timer will not start until it is triggered.
ItemTag (type name)
If Prototype is not none, then the tag of that object is equal to this property.
MaxDistToNearestPlayer (type int)
Extra conditional checks before picking a spawn for the monster.
If > 0: The spawn point must be at least this far (in unreal units) to the nearest player to be accepted.
If < 0: The spawn point must be at most this close (in absolute form) to the nearest player to spawn there.
If 0: then distance to nearest player is ignored.
Player monsters are excluded from calculations.
MaxItems (type int)
How many monsters should be alive at once. If you have 8 lives, but only MaxItems = 4 then only 4 monsters will exist at once. The factory will spawn replacements until it's out of lives.
MonsterSpawnerID (type int)
This is a tricky property. Check out this link for details.
Prototype (type class<Actor>)
Extra actor to spawn for every monster spawn. Here you may apply any special FX, custom actors, pickups, etc... to all monsters that spawn from this factory. An example this is used is at the end of AS-Wangara where there's a Shock Combo FX every time a monster spawns.
TimeDistribution (type enumerator)
Type if time interval for the property: Interval.
DIST_Constant : Constant interval (always equal to Interval)
DIST_Uniform : Uniform interval (random time between 0 and 2 x interval)
DIST_Gaussian : Gaussian distribution, with mean = Interval
Unique
AttachedEmitter (type class<Emitter>)
Attach an emitter to this monster.
bHasRangedAttack (type boolean)
For Dinotopia monsters: If true, then the dinosaurs will shoot their ranged attacks if they have a ranged attack.
bPlayDeathAnimation (type boolean)
If false, then the monster will immediately be destroyed when it dies. The DeathEmitter will still spawn before the monster disappears.
bRidable (type boolean)
For Dragons: If true, then the dragons are ridable if the player press their Use key near it.
bWallWalk (type boolean)
For Xenomorphs: If true, then the Xenomorph will walk on walls.
bWearAltSkin (type boolean)
If the monster has an alternative appearance (such as brown:green Mole or Tan:Green Mancubus) then this will use the monster's alternative appearance. This also activates Zombie dinosaurs.
DeathEmitter (type class<Emitter>)
Emitter to spawn when the monster dies.
DinosaurGender (type enumerator)
For Dinotopia and Raptor: what gender is this dinosaur? The NoneUsingMyOwnCustomSkin option informs the spawner that you are attaching custom skins to this dinosaur.
DoombArchvileCanResurrect (type boolean)
For Archvile: If true, then the Archvile can resurrect nearby slain monsters.
DoombArchvileCanSummon (type boolean)
For Archvile: If true, then the Archvile can summon new minions.
DoombFatZombieThrowBarrel (type boolean)
For FatZombie: If true, then the zombie may throw explosive barrels at players.
DoombMaledictCanSummon (type boolean)
For Maledict: If true, then the Maledict may summon Lost Souls.
DoombSawyerDecapitateEnemy (type boolean)
For Sawyer: If the chainsaw hits the player's head, then the player is instantly killed.
MiniBossProjectiles1-3 (type StaticMesh)
For MechTitan: This determines the appearance and collision radius for its projectiles.
MiniBossProjectileSnds1-3 (type sound)
For MechTitan: These are the soundFX for the projectiles when it hits the world.
NaliFighter_MonsterWeaponInventory (type enumerator)
For weapon holding monsters such as Nali Fighter, Stormtroopers, and Marines: What kind of weapons this monster should hold? Default = Bio, Link, and Rockets.
SpecificFillOutLowerProperty allows the mapper to specify which weapon these monsters should only carry.
NaliFighter_SpecificWeapon (type string)
If the NaliFighter_MonsterWeaponInventory = SpecificFillOutLowerProperty then this is the property where you would specify the weapon class. For an example, if you want Shock Rifles only, you'll type in XWeapons.ShockRifle
OSMbBruteTurret (type boolean)
For Brutes: If true, then the brute will be stationary and will not charge towards enemy.
OSMbKrallDicePlayer (type boolean)
For Krall: If true, then the Krall will play dice with its team (assigned in AI->TeamTag). Remember that you must have strictly only one leader krall to spawn the dice. The leader may be assigned to the Krall with the same TeamTag and AI->bIsLeader=true.
OSMbKrallSleeping (type boolean)
For Krall: If true, then the Krall is asleep. You also have to set the AI->StartingAnim equal to one of these three: Sleep1, Sleep2, or Sleep3.
OSMbSkaarjButtonPusher (type boolean)
For Skaarj: If true, then the Skaarj will loop through various button pushing animations.
OSMbSkaarjFeignDeath (type boolean)
For Skaarj: If true, then the skaarj will be on the ground. It'll emerge when a player aggros it.
OSMbWarlordhasMutilatingGib (type boolean)
For Warlords: If true, then the Warlord will kick, eat, and punch a gib.
OSMbWarlordTacticalTeleporting (type boolean)
For Warlords: If true, then the warlord may teleport by will.
OSMbWarlordTeleportWhenHurt (type boolean)
For Warlords: If true, then the Warlord will teleport away when it's low on health.
OSMKrallMinDuckTime (type float)
For Krall: Minimum time the Krall should duck when it does duck.
OSMNaliCowHasBaby (type boolean)
For Nali Cow: If true, then the Nali Cow will have babies.
QueenScreamEvent (type name)
For Queens: Event to trigger when the Queen screams.
I understand that I left this tutorial unfinished. Time constraints are preventing me from completing this task.
- To spawn a Monster
- Setup
- Triggering
- Picking a Monster Class
- Basic Monster Spawner
- Events
- Monster Attributes
- Monster Spawning
- Advanced Monster Spawner
- AI Properties
- Creature Factory
- Monster Attacks
- Monster Events
- Monster Resistances
- Monster Sounds
- Thing Factory
- Unique
- Scripted Actions
-Nuking
-Calculating Extra Lives
-Complex Random Spawning Sequences - Misc topics
-Max Monsters at Once
-Killed Event Conflicts
-Naming Conventions
Setup
You'll need the following packages to be able to run the game mod:
- DWAssaultMapperTools.u (this has the monster spawner)
- DWMonsterAssault (this contains the game rules)
- MonsterAssaultRPG (this contains RPG info)
- OSMT (holds parent classes for Monster Spawner and monsters)
- SmartMonsterPackSample (monster info)
Go to the Actor Class browser and open the DWAssaultMapperTools.u file. To find the monster spawner, go to Keypoint -> Thing Factory -> Creature Factory -> DWMonsterSpawner -> BasicMonsterSpawner. Place this actor somewhere in your map where you may find it.
To place a spawn point, return to the actor class browser. Go to NavigationPoint -> SpawnPoint. Place a spawn point to where you want your monster to potentially spawn. If there's multiple spawn points for the monster spawner, then the monster spawner will pick a random spawn point the monster can fit in every time it attempts to spawn a monster.
Triggering
We need a way to tell the monster spawner when to spawn its monsters. Once the monster spawner heard its signal, it'll spawn its monster(s).
The easiest way in doing this is by positioning the monster spawner, itself. by adjusting the monster spawner's collision properties (collision -> collision radius and collision height), and setting Misc -> Player Collision Trigger equal to true, the monster spawner will not spawn a monster until a character runs into its collision radius. Be mindful that players, vehicles, any monster, and redeemer warheads may trigger this spawner.
The recommended way (for more control, cleaner, and grouping) is by associating the spawner to an event. A way you may do this is by placing a proximity trigger (found in the actor class browser: triggers->trigger). With the trigger, you may associate with volumes, apply a class constraint, assign retrigger properties, etc.. To make this trigger detect on foot attackers only, set the trigger's class constraint property equal to AssaultxPawn. You also need to link up the monster spawner to the trigger. To do this, set the monster spawner's tag property equal to the trigger's event property. Both of these properties may be found in the events category for both actors.
The monster spawner also needs to be linked to the spawn point(s). To do this, set the spawn point(s) tag equal to the monster spawner's SpawnPointTag (in the events category). A monster spawner may support up to 16 spawn points.
Picking a Monster Class
See DWMonsterRoster for a list of monsters, and their associated index numbers.
There are two ways to pick a monster class. the easiest way is by typing the monster's name in the Monster Spawner -> MonsterSpawning -> MonsterName property. You must spell the monster's name correctly for the monster spawner to find the monster. If the monster is not found, you'll be given an error message in the UT2004.log (in system directory), and a Krall will spawn instead. If you're picky about performance, and you hate linear searching, you can narrow down the search by selecting a package name. For an example: you'll want the package name to be Doom Monsters if you're going to spawn a Sentry. The monster spawner will not even search in the Skaarj Pack or the Dragons to look for a match in "Sentry". The default value 'IDontKnowSearchEntireTable' is safest since that'll tell the monster spawner to search through all monsters.
The other option in picking a monster class is by index. Although, you'll have to look up the correspinding number to every monster you wish to spawn, this still has advantages over the other option. With by indexes option, you may have the monster spawner spawn a range of monsters. The monster roster is sorted by package, then relevance then difficulty. Since related monsters are grouped together, the mapper may spawn a variety of monsters that are similar and still slighty fluxuate the difficulty randomly. For an example, you want to set the index range from 8 to 9 if you want the monster spawner to randomly select either a Krall or Elite Krall every time it spawns a monster. Also since it searches in constant time (much faster than linear), you don't even have to worry about selecting a package since that has no affect when picking a monster class by index.
Another thing to note, if you are mapping with only the SmartMonsterPackSample then you'll only face SkaarjPack monster during offline testing. Because of the DWMonsterRoster.ini in your UT2004/system folder, the Satore, WOS, Bio, Doom, Dragons, Dinosaurs, Xenomorphs, Unreal Classic, Misc, and Boss monsters will be substituted by OSM (SkaarjPack) monsters. However when your map goes live, they will respawn as their intended class.
Basic Monster Spawner
These are the necessary properties you'll need to know to properly utilize the Basic Monster Spawner.
Misc category
bCollisionTriggered (type boolean)
If true, then the monster spawner will spawn its monsters when any pawn (vehicle, character, monster) enters within its collision cylinder.
CreatureFactoryID (type integer)
See this part in document for use of this.
MaxMonstersAtOnce (type integer)
How many monsters should be alive at first. The monster spawner will spawn monsters up to this number. Should one of the factory's monsters die, then it will continue spawning monsters until it's either out of lives or number of monsters reaches to this number again.
Monster Attributes
bIsBoss (type boolean)
If true, then this monster will gain additional properties. The player adjustment formula is much more dynamically adjusted than a standard monster. More aggression. Less knockback anim from taking damage. Improved AI behavior. etc...
bMonsterVariesOnPlayers (type boolean)
If true, then the monster's health and score will dynamically be adjusted based on number of players.
bVaryMonsterAttributesOnSize (type boolean)
If you have a scaleSize range, then the monster attributes will be adjusted relative to the scale Size's range. Setting the scale Size range = to 2 will not adjust the monster's strength. However the monster will adjust if the range is from 1.5 - 2. Where the monster at scale 2 will be 1.071428... times stronger than a monster at scale size 1.75. This is useful if you are using varied size creatures of the same species (such as dinosaurs). Typically the larger creature should be stronger than the smaller ones. Setting this to false will make the monster spawner ignore the dynamically adjusted strength based on its relative scale size.
ChanceToReflectProjectiles (type float)
If value is greater than zero, then the monster will reflect projectiles as if it was a metal monster or something. 0 => don't reflect at all. 0.5 => reflect half the energetic projectiles. 1 => always reflect energetic projectiles. Leaving it negative will let the monster's default properties take over. Monsters like the Gold Angus will reflect projectiles by default.
DamageModifier (type float)
This is the damage multiplier for the monster. 2.0 => twice the damage. 0.5 => half damage.
Health Modifier (type float)
This is the health multiplier for the monster. 2.0 => twice the default health. 0.5 => half health. This is multiplied before the dynamically adjusted values are calculated. Score Value is also adjusted based on monster's health to keep the exp per damage ratio consistent for this monster.
MonsterGibType (type class<xPawnGibGroup>)
If this value is not none, then the monster's gib type will switch to this class. This is useful if you want to make a robotic creature or an organic creature from a monster class that doesn't fit that criteria.
MonsterNetSkins[8] (type Array<Material>)
This is the skin you can attach to the monster. Just like skinning any mesh, a creature may have multiple layers of skins.
ScaleSize (type Range of floats)
The monster's scale, prepivot, and collision will be adjusted randomly based on the range specified here. Defaults 1 - 1 will keep the creature at normal size.
Score Multiplier (type float)
This is the experience multiplier received when players damage this monster. 2.0 => twice the exp. 0.5 => Half the exp. This property will be closely monitored.
You want this value to be from 0 - 0.1 for infinite monsters. Only set this above 1 for monsters that have damage scaling above 1. Remember that the health multiplier already adds to the monster's scoring value. No need to adjust the score based on your HealthModifier property.
Speed Modifier (type float)
This adjusts the monster's ground, swim, and flying speed. 0 => stationary monster. 0.5 => half speed. 2.0 => twice as fast.
Monster Spawning
bAnyEventMayTrigger (type boolean)
If true, then the monster spawner will always spawn its monsters regardless who triggered the event.
bEmitTeleportationEmitter (type boolean)
If true, then it'll spawn a particle emitter where the monsters spawn. The class is determined via EmitSpawningEmitter.
bInfiniteLives (type boolean)
If true, then the monster spawner will have infinite lives.
bToggleInfLives (type boolean)
If true, then the spawner will toggle its InfLives property every time it's triggered. Make sure bInfiniteLives = false if you want infinite monsters the first time it's triggered. Even first trigger will toggle bInfiniteLives.
Warning: Monsters will trigger this factory every time a monster dies. Make sure bAutoRespawn is false (in advanced Monster Spawner)
ChanceToSpawn (type float)
This is the percent chance that this factory will appear in game. 0.1 => 10% chance that the factory will exists. 0.5 => 50% chance that the factory will exist. 1.0 => the factory will be in every game.
EmitSpawningemitter (type class<Emitter>)
Emitter that'll spawn at every monster spawn.
Lives (type int)
How many monsters this factory should spawn.
MonsterName (type name)
Monster class that should spawn
MonsterNumber Max & Min (type int)
Monster class (specified by monster class's associate index number to the MonsterTable) that should spawn. The factory will randomly pick the monsters from Min - Max. These properties are ignored if MonsterName is not None or blank.
MonsterPackage (Type enumerator)
Narrows scope for monster class searching (ignored if MonsterName is None or blank).
MonstersPerTrigger (type Range)
If you're using the Advanced Monster Spawner you can set bStoppable to true. bStoppable will only spawn monster(s) every time it's triggered. If you're using this method, then this property specifies how many monsters should spawn every time this is triggered. It randomly picks a value from Min - Max after each trigger. By default bStoppable is false. This property useless for BasicMonsterSpawner.
RandomExtraLivesMax (type int)
Randomly generates extra monsters to add onto lives.
Real Num Lives = Lives + Random from 0 - RandomExtraLives;
RecalcExtraLives (type Struct)
bIncludedDeadPlayers (type boolean)
If true, then dead players are also included when calculating extra lives.
bUseAutoRecalcExtraLives (type boolean)
If true, then the random extra lives are recalculated upon the first trigger.
bWeighted (type boolean)
If true, then the RandomExtraLivesMax property will be influenced based on number of players. More players => greater chance to spawn monsters. It will always stay under Max limit.
MaxMultiFactorPerPlayer (type float)
This will add extra lives based on number of players. 0.5 => One extra monster for every two players. 2.0 => 2 extra monsters for every player. This property is ignored if bWeighted is true. This stacks on the RandomExtraLivesMax.
Formula: RandomExtraLivesMax = Rand(RandomExtraLivesMax + 1) + Round(NumberOfPlayers * MaxMultiFactorPerPlayer);
Advanced Monster Spawner
The advanced monster spawner is the parent class of the BasicMonsterSpawner (DWMonsterSpawner). The Basic Monster Spawner simply conceals many properties from the DWMonsterSpawner, and it initializes several properties for easy use. The DWMonsterSpawner, although more complicated, enables you to setup some unique monster setups. Going over the properties for the DWMonsterSpawner
AI
AIScriptTag (type name)
Associate this monster with a ScriptedSequence
Alertness (type float)
Sets the monster's awareness to environment. This also applies the monster's reaction time when seeing a pawn. Range is from -1 to 1.
AttitudeToPlayer (type enumerator)
Monster's behavior towards players. Note: monsters have different reactions based on the monster's species type and current situation.
Fear-attempts to run away from player. Attacks if the monster has little hope in escaping.
Hate-attacks players (default)
Frenzy-The pawn acts a bit less concentrated with less accuracy. The pawn will fight to the end and never flees.
Threaten-Will make hostile motions but will wait for the player to initiate combat.
Ignore-Ignores players
Friendly-Monster is friendly to towards player. Will fight for the players. Will turn hostile if player attacks monster.
Follow-Not yet implemented (use Max instead)
Max-Max always friendly to player. Will follow and fight for the player.
bCanUse (type boolean)
If true, then the monster may interact with buttons (UseTriggers).
bCrouchingAnimation (type boolean)
If your starting animation has the creature laying down or crouch, set this to true to recalculate its collision cylinder.
bFriendlyFire (type boolean)
If true, the monsters on the same alignment may damage this monster.
bIsTeamLeader (type boolean)
Is this the leader for the squad of monsters that matches the TeamTag? Set this to true for one of the Dice Krall. This Krall will spawn the dice.
bNoCrushVehicle (type boolean)
If false, then the players may easily crush this monster in vehicles.
bPlayerCanDamage (type boolean)
If false, then the monster will ignore damage from players.
bQuiet (type boolean)
If true, then the monster will not make extraneous sound (such as roaring from Doom Monsters).
EndingAnimation (type name)
Animation to play after seeing a player (it's the transition from StartingAnim to normal fighting)
HearingThreshold (type float)
Distance the monster can hear from sound FX such as shooting.
SightRadius (type float)
How far the monster can see.
StartingAnim (type name)
Animation to play when the monster spawns. The monster will continuously loop this animation until it sees a player. Alertness will be reduced.
TeamTag (type name)
Which team does this monster belongs to. If bIsTeamLeader = false, then the monster will attempt to find its leader. It'll follow and protect the leader if found. Minions share leader's reaction to players. (Minion hates players if leader hates players)
CreatureFactory
AddedCoopCapacity (type int)
This is primarily used in parent class (Creature Factory). MonsterSpawning->RecalcExtraLives property replaced AddedCoopCapacity for the DWMonsterSpawner.
AlarmTag (type name)
Tag for alarm point this creature should be aware about.
bAutoRespawn (type boolean)
If true, then the monster spawner will immediately spawn a new monster every time one of its existing monsters died.
bDelayedPatrol (type boolean)
If true, then the monster will not start patroling until it is triggered.
GoodieDrop (type dynamic array[class<Pickups>])
The creature will drop all of these items when it dies.
MonsterLoot (type enumerator)
Types of items that may be dropped through the monster loot mutator. The mutator is not running in Monster Evolution. However, this may be enabled in the future if the demand for monster loot is high enough.
MonsterLootChanceMultiplier (type float)
Multiplied chance of dropping an item through the monster loot mutator. 0.5 => half as likely to drop an item. 2.0 => twice as likely to drop an item.
MonsterLootRange (type Range of floats)
Each monster will randomly have a MonsterLoot type from Min to Max.
0 = None
1 = Any
2 = Basic Pickups
3 = Minor Pickups
4 = Handy Pickups
5 = Valuable Pickups
6 = Major Pickups
7 = Healing Pickups
8 = Ammo Pickups
9 = Adrenaline Pickups
10 = Misc Powerups
11 = Experience Shards
Orders (type name)
Initial state for the monster. The monster will resume to initial orders when it lost or defeated its enemy.
Waiting (default): Monster simply roams around spawn area.
Guarding: Monster will stand still at spawn area (no moving until it sees an enemy).
Ambushing: Travel to an AmbushPoint and wait for an enemy, then attacks
Patroling: Continuously walks to PatrolPoints until encountered an enemy.
OrderTag (type name)
Associated actor tag for the monster's orders. Ex: the tag for the first patrol point if the monster is Patroling. Or the tag of AmbushPoint if it's Ambushing.
MonsterAttacks
This category is still underdeveloped (it's new). This is where the mapper may customize attacks. Currently this only works on SkaarjPack monsters. More details on this category will be displayed when the beta test is over.
MonsterEvents
bHateWhenTriggered (type boolean)
If true, then the monster will attack the instigator whom triggered the event. This is the aggro.
bKillMonsterWhenTriggered (type boolean)
If true, then the monster will immediately die when triggered.
bToggleInvlunerability (type boolean)
If true, then the monster will toggle its bPlayerCanDamage boolean every time it's triggered.
KilledEvent (type name)
Event that'll trigger when this monster dies.
Note: This property sets bAutoRespawn to false. You'll have to rely on timed (ThingFactory->Interval) or triggered (ThingFactory->bStoppable) spawning if you want to spawn replacements.
MonsterTag (type name)
The monster's tag. If an event that triggers matches this monster's tag, then the monster will do something (specified by the boolean properties above).
SpawnEvent (type name)
Event that'll trigger when this monster spawns. Note: This will trigger every time for every monster that spawns.
MonsterResistances
You can customize the monster's resistances through this category. Leaving the default values at -0.000001 => the monster will use the monster class's default resistances. Anything other than that value will overwrite the monster's resistances.
2.0 => 200% resistances. 1.0 => 100% resistances. 0.55 => 55% resistances. 0 => 0% resistances. -0.75 => -75% resistances.
SneakAttackDamageScale (type float)
This is the damage multiplier if the player damages an unaware monster. 2.0 => double damage. 0.5 => half damage. -1 => Heal the monster.
MonsterSounds
bMonsterFullVolume (type boolean)
If true, then the monster's volume will be maxed.
bPitchedBasedSize (type boolean)
If true, then the monster's pitch will vary on the monster's size. Larger monsters will have lower pitches than smaller monsters.
ChallengeSounds (type Array[4] of Sounds)
You can overwrite the monster's challenge sounds. Challenge sounds is played when a monster sees a player.
DeathSounds (type Array[4] of sounds)
You can overwrite the monster's death sounds. These are played when the monster dies.
HitSounds (type Array[4] of sounds)
You can overwrite the monster's hit sounds. These are played when the monster takes damage.
SoundVolumeMultiplier (type float)
Adjust the sound volume through this multiplier. 2.0 => twice as loud. 0.5 => half as loud. Note: UT sounds has its limits. You can't expect the monster will make deafining sounds if the value is 10X or so.
ThingFactory
bCovert (type boolean)
If true, then the monster will only spawn where players are not looking.
bFalling (type boolean)
If true, then the monster's physics is set to falling. By default flying monsters will fly. Setting this to true, will make them fall.
bOnlyPlayerTouched (type boolean)
If true then a human player must activate this spawner when entering its collision cylinder. Note: Player Monsters are still human controlled. Your map can be easily glitched if you set this to true. Use caution.
bStoppable (type boolean)
If true, then the spawner will only spawn monster(s) every time it's triggered. The number of monsters per trigger may be set through MonsterSpawning -> MonstersPerTrigger property.
Capacity (type int)
This property is replaced by Lives. Use Lives instead.
Interval (type float)
If bStoppable is false, then the monster spawner will spawn a new monster every x many seconds. 0 => instantaneously spawn all of its monsters. 2 => 1 monster for every 2 seconds. The timer will not start until it is triggered.
ItemTag (type name)
If Prototype is not none, then the tag of that object is equal to this property.
MaxDistToNearestPlayer (type int)
Extra conditional checks before picking a spawn for the monster.
If > 0: The spawn point must be at least this far (in unreal units) to the nearest player to be accepted.
If < 0: The spawn point must be at most this close (in absolute form) to the nearest player to spawn there.
If 0: then distance to nearest player is ignored.
Player monsters are excluded from calculations.
MaxItems (type int)
How many monsters should be alive at once. If you have 8 lives, but only MaxItems = 4 then only 4 monsters will exist at once. The factory will spawn replacements until it's out of lives.
MonsterSpawnerID (type int)
This is a tricky property. Check out this link for details.
Prototype (type class<Actor>)
Extra actor to spawn for every monster spawn. Here you may apply any special FX, custom actors, pickups, etc... to all monsters that spawn from this factory. An example this is used is at the end of AS-Wangara where there's a Shock Combo FX every time a monster spawns.
TimeDistribution (type enumerator)
Type if time interval for the property: Interval.
DIST_Constant : Constant interval (always equal to Interval)
DIST_Uniform : Uniform interval (random time between 0 and 2 x interval)
DIST_Gaussian : Gaussian distribution, with mean = Interval
Unique
AttachedEmitter (type class<Emitter>)
Attach an emitter to this monster.
bHasRangedAttack (type boolean)
For Dinotopia monsters: If true, then the dinosaurs will shoot their ranged attacks if they have a ranged attack.
bPlayDeathAnimation (type boolean)
If false, then the monster will immediately be destroyed when it dies. The DeathEmitter will still spawn before the monster disappears.
bRidable (type boolean)
For Dragons: If true, then the dragons are ridable if the player press their Use key near it.
bWallWalk (type boolean)
For Xenomorphs: If true, then the Xenomorph will walk on walls.
bWearAltSkin (type boolean)
If the monster has an alternative appearance (such as brown:green Mole or Tan:Green Mancubus) then this will use the monster's alternative appearance. This also activates Zombie dinosaurs.
DeathEmitter (type class<Emitter>)
Emitter to spawn when the monster dies.
DinosaurGender (type enumerator)
For Dinotopia and Raptor: what gender is this dinosaur? The NoneUsingMyOwnCustomSkin option informs the spawner that you are attaching custom skins to this dinosaur.
DoombArchvileCanResurrect (type boolean)
For Archvile: If true, then the Archvile can resurrect nearby slain monsters.
DoombArchvileCanSummon (type boolean)
For Archvile: If true, then the Archvile can summon new minions.
DoombFatZombieThrowBarrel (type boolean)
For FatZombie: If true, then the zombie may throw explosive barrels at players.
DoombMaledictCanSummon (type boolean)
For Maledict: If true, then the Maledict may summon Lost Souls.
DoombSawyerDecapitateEnemy (type boolean)
For Sawyer: If the chainsaw hits the player's head, then the player is instantly killed.
MiniBossProjectiles1-3 (type StaticMesh)
For MechTitan: This determines the appearance and collision radius for its projectiles.
MiniBossProjectileSnds1-3 (type sound)
For MechTitan: These are the soundFX for the projectiles when it hits the world.
NaliFighter_MonsterWeaponInventory (type enumerator)
For weapon holding monsters such as Nali Fighter, Stormtroopers, and Marines: What kind of weapons this monster should hold? Default = Bio, Link, and Rockets.
SpecificFillOutLowerProperty allows the mapper to specify which weapon these monsters should only carry.
NaliFighter_SpecificWeapon (type string)
If the NaliFighter_MonsterWeaponInventory = SpecificFillOutLowerProperty then this is the property where you would specify the weapon class. For an example, if you want Shock Rifles only, you'll type in XWeapons.ShockRifle
OSMbBruteTurret (type boolean)
For Brutes: If true, then the brute will be stationary and will not charge towards enemy.
OSMbKrallDicePlayer (type boolean)
For Krall: If true, then the Krall will play dice with its team (assigned in AI->TeamTag). Remember that you must have strictly only one leader krall to spawn the dice. The leader may be assigned to the Krall with the same TeamTag and AI->bIsLeader=true.
OSMbKrallSleeping (type boolean)
For Krall: If true, then the Krall is asleep. You also have to set the AI->StartingAnim equal to one of these three: Sleep1, Sleep2, or Sleep3.
OSMbSkaarjButtonPusher (type boolean)
For Skaarj: If true, then the Skaarj will loop through various button pushing animations.
OSMbSkaarjFeignDeath (type boolean)
For Skaarj: If true, then the skaarj will be on the ground. It'll emerge when a player aggros it.
OSMbWarlordhasMutilatingGib (type boolean)
For Warlords: If true, then the Warlord will kick, eat, and punch a gib.
OSMbWarlordTacticalTeleporting (type boolean)
For Warlords: If true, then the warlord may teleport by will.
OSMbWarlordTeleportWhenHurt (type boolean)
For Warlords: If true, then the Warlord will teleport away when it's low on health.
OSMKrallMinDuckTime (type float)
For Krall: Minimum time the Krall should duck when it does duck.
OSMNaliCowHasBaby (type boolean)
For Nali Cow: If true, then the Nali Cow will have babies.
QueenScreamEvent (type name)
For Queens: Event to trigger when the Queen screams.
I understand that I left this tutorial unfinished. Time constraints are preventing me from completing this task.