An Info is typically used in order to facilitate a manager. Unless otherwise explicitly stated, you should never place more than 1 of these infos in any map.
M.A.C. (Master's Anti-Cheat) is a simple place-and-forget anti-cheat for Shrek 2 (PC) that protects against various common cheats. When a cheat is suspected to currently be in use, M.A.C. will reverse the cheat and then an optional punishment can be run. M.A.C. is not meant to be intrusive; most cheat checks aren't overly enforced. This likely shouldn't be used for maps that implement their own custom gamerules, as M.A.C. treats every map like an original KnowWonder map.
When a punishment is ran, you can have M.A.C. react in multiple ways:
Do not react
React by running console commands
React by doing SetProps
React by triggering an event
React by announcing the cheat used on the screen (typically used for debugging)
To stop M.A.C., you can do any of the 3:
If the current player is using a MasterController, simply run the console command AntiAntiCheat or AAC (doing this is permanent)
Use MACTION_ManageAntiCheat to temporarily turn it off
Use the console command Set MAntiCheat bDeleteMe True (doing this is permanent)
Enforcement features:
No cheat console commands
No god mode
No ghosting (or flying)
No debug mode
No speed cheats
No jump cheats
No fall damage cheats
No acceleration rate cheats
No minimum floor angle cheats
No modified air control
No SloMo modification
No modified gravity
No screen fade cheats
M.A.C. does not protect against:
Teleporting/Warping (reason why: cutscenes would cause issues, as well as saves and loads. Due to there being too many exceptions, this won't ever be implemented)
Any other minute or very small cheats
Important notice:
If your level features PIB and you play as PIB later in the level (meaning you didn't start as him), a cheat flag will go off for using jump cheats (v5). Now the reason behind this being cheat-flagged is actually pretty interesting; it's actually a bug in the stock game. When doing this normally, PIB's jump distance scalar will actually be incorrectly calculated by default, but this anti-cheat fixes this bug at the cost of saying a cheat was used. Keep this in mind, when you consider adding a punishing system for cheating.
Variables
bEnforceSteedsModifiedJumpHeight - If true, enforces Steed's jump height to the default modified value it should be at
bEnforcePIBsFactoryFallDamage - If true, enforces PIB's fall damage to the default modified value it would be at if it was in FGM PIB
PunishType - What punishment to use when the player cheats
ConsoleCommands - If PunishType=PT_ConsoleCommand, which console commands to run. Notice: these are player console commands
SetProps.ActorClass - What actor class to locate
SetProps.ActorTag - What actor tag to locate
SetProps.Variable - What actor variable to locate
SetProps.Value - What actor value to locate
AnnouncementSettings.fAnnTime - The announcement time
AnnouncementSettings.AnnColor - The text color for the announcement
Before using this info, go into the game's System folder and add a new folder named MPak. This folder will contain the log created by this info.
Allows you to run a performance benchmark on a map in real-time. Simply send an event to this info to begin your test (the CauseEvent console command makes it easy to do), and then send another event when you've concluded your test. The test results will be shown in the log. Test results show and rank your average, peak and worst FPS, as well as its general stability throughout the test. A test with this benchmarker will give you a general ballpark as to whether or not the current map you're testing on is optimized.
Variables
b60FPS - Set this to true if the game is capped to 60 FPS during testing
A manager that starts random conversations based on the configuration given. The general formula for this actor is for a random amount of time to pass, then to start a random conversation. A conversation is considered to be multiple dialogs fired one after another in succession. This actor is essential for when you don't want to manually script this all out. This isn't a dialog-only deal! This supports all sounds, meaning it's not just for dialogs; you could make a sort of scripted set of ambient sounds, for example.
To make a conversation, first, make a new Conversations. Each conversation consists of a list of dialogs that are run in order. To add a dialog, you are required to specify 3 different things. First, you must specify the sound file that will be played (Conversations.DialogsInOrder). Then, you must specify the pawn class to locate, and the pawn tag to locate (Conversations.PawnsInOrder and Conversations.PawnTagsInOrder). These 3 variables make up the first dialog that can be made in the conversation. To add another dialog into the conversation, simply add another dialog, pawn class, and pawn tag. When it's all said and done, you'll have a functioning conversation manager!
Notice: multiple of these infos can be placed, but bEnabled must be disabled for all conversation managers, except for 1.
Variables
Conversations.DialogsInOrder - What sound files should be gone through in order
Conversations.SubtitlesInOrder - What subtitles should be shown on screen in order
Conversations.PawnsInOrder - Which pawns should be speaking when said dialog plays
Conversations.PawnTagsInOrder - Which pawn tags should be speaking when said dialog plays
ConversationDelay - How long we should wait before attempting to start a conversation
DialogDelay - How long we should wait in between each dialog being said
fVolume - What volume should every sound play at
bAllowRepeats - If true, the same conversation can play right after playing. If there's only 1 conversation in Conversations, this does nothing
LocalizeSoundVars.fRadius - How far should you be able to hear the sound
LocalizeSoundVars.fPitch - What pitch should the sound play at
bPlaySound3D - If true, localizes the sound onto Conversations.PawnTagsInOrder that aligns with the current Conversations.DialogsInOrder
bShowSubtitles - If true, shows custom subtitles provided via Conversations.SubtitlesInOrder
bEnabled - If true, this conversation manager is currently active. If a conversation is happening and this is set to false, then the conversation will end
Before using this, you must learn CutScript. You can get started here. Once you've finished that, you should understand how to use this pretty well, but without having to remember what to type out, since it's a point-and-click when you use this creator for CutScripts.
Allows you to create your own cutscenes from within the editor. Has all of the original functionality, but with an easier-to-understand interface. To activate the cutscene, fire to the event CCActions.CutsceneName from any actor. If you are having issues with this event call not activating the cutscene, then try to fire to the event CUT__<CCActions.CutsceneName>.
This cutscene creator works by generating a CutScript file in real-time, and you can check what cutscene file it made by looking in the game's Cutscenes folder after loading a level with this cutscene creator inside it. The name of the cutscene file will be the same as CCActions.CutsceneName, but with an _ in front of it, which is there to signify that it is a temporary CutScript file. Changes made directly to the .int will only temporarily work. Once you re-open the map file, the cutscene files will be overwritten.
To get started, create a new CCActions. Each one of these are considered their own entire CutScript. From this point, simply create a CutScript like you normally would.
Notice: you do not need to add a CutFactory into your map if you're using this.
Variables
CCActions.CutsceneName - The name of the cutscene that is unique to the current map
CCActions.PropertyTypesToUse - The properties to apply to the cutscene, if any
CCActions.Sequences.PawnTag - (For a sequence) What pawn tag to locate
CCActions.Sequences.Actions - The list of Actions to go through
CCActions.OnExit.PawnTag - (For an OnExit sequence) What pawn tag to locate
CCActions.OnExit.OnExitType - The type of OnExit action to use
CCActions.OnExit.OptionalTagOrEvent - If needed, which tags or events should be used as arguments
Stores local data inside of itself. This info should be used in conjunction with MACTION_SetProp (TransferProp) to save and load local data.
Notice: multiple of these infos can be placed.
Variables
3 Booleans
3 Ints
3 Floats
3 Strings
An extension of MData that contains more variables.
Notice: multiple of these infos can be placed.
Variables
6 Booleans
6 Ints
6 Floats
6 Strings
6 Vectors
6 Rotators
A variant of MData that contains a lot of string variables. This should only be used when you actually need a lot of strings.
Notice: multiple of these infos can be placed.
Variables
24 Strings
If this info is placed in the level before being loaded, the variable fLevelLoadTime will reflect how long it took the player to load into the level. For this to work, the current player must be using a controller derived from SHHeroController. However, this should always be the case, unless the game is heavily modified.
Variables
fLevelLoadTime - The amount of time it took for a level to initially load. There's no reason to manually assign a value to this variable
Before using this info, go into the game's System folder and add a new folder named MPak. This folder will contain the log created by this info.
This map checker checks an entire map to see if any warnings or errors are found that the editor doesn't keep track of. Should only be used when developing maps, by mappers. Once a map is opened up with this info being in it, MMapChecker will diagnose the current map and log its results.
The warning reports this can make:
If a Trigger has no events to fire to. - Typically a trigger fires an event to an actor, but not in every case. Sometimes a trigger is hard-coded to do something that doesn't involve firing an event, so if this is the case, then this warning will still be triggered.
If a Trigger might be a floating trigger with collision. - This isn't always 100% accurate, and is especially bad when dealing with outdoor maps at the moment.
If an Actor has an event assigned that initially links to nothing. - Just like with the Trigger, this isn't always an issue, but it's important to be aware of.
If a dynamic light exists. - Dynamic lights cause major performance impacts, so you should always be aware of these existing in a map.
If a BounceSheet isn't linked to a BouncePad. - This means you did not properly link up a BounceSheet with a BouncePad, and you need to make sure these are linked up with Events, as shown in the stock maps. An example of a BounceSheet are golden lily pads, or big spider webs.
If a StaticMeshActor is too densely packed with other StaticMeshActor's. - You have put too many StaticMeshActor's close to each other, which will cause moderate performance issues due to too many actors overlapping each other.
The error reports this can make:
If an actor needs bCollideActors=true. - While this isn't initially a problem, if you modify said actor in almost any way, then try to save the map file, the whole level editor will crash. If you need to turn off the collision of an actor, use the individual collision flag variables below bCollideActors instead.
If a brush needs its Location or PrePivot rounded. - You need to locate the object logged with the actor searching tool (in the level editor), open its properties window, then round the variable so that the values don't go into the decimals. Example: X=0.007142 should be changed to X=0.0. Doing this will improve the map's performance in most cases.
If Shrek doesn't exist. - Shrek should always exist, especially since there's a significant amount of internal code that relies on him existing in every map.
If a PhysicsVolume has bDestructive=true. - You need to locate the object logged with the actor searching tool (in the level editor), open its properties window, then set bDestructive=false. You should never set this to true, due to how Shrek 2 handles its damage system, and due to how many new bugs are introduced from this. Use a DamagePlayerVolume to damage the player instead.
This movie manager is capable of playing a string of movies back-to-back. Simply fire an event to this movie manager when you want the movies to play, and it will handle the rest for you. After every movie has finished playing, it will fire an event to nEventToFireWhenFinished (if provided).
Movie name formatting is completely overhauled/simplified for your convenience and flexibility! The original movie name formatting was strict and literal; before you always had to provide each file name manually. This new system interprets a movie name as the following: <Name>$<ResX>x<RexY>. With this formatting in mind, when asked to provide the name of a movie, do NOT provide the full filename, rather provide the name specified at the beginning of the filename.
What's the advantage of this, you may ask? The main advantage is that this movie manager automatically looks up whether or not your current game resolution matches the resolution of a movie provided with the same resolution. If it does not have one, it will use a fallback method, where it will (by default) playback the movie at 640x480p. A low resolution is typically advantageous, because otherwise the movie has a higher chance of being invisible when being played back (the movie will fail to render on the game screen if the movie's resolution is higher than the game's resolution).
When formatting the movie names, make sure it follows the following syntax, with the real movie resolution provided within the filename itself: <Name>$<ResX>x<RexY>. If you do not provide a name with this exact syntax, the movie will fail to play.
Example:
Filename: DW_Logo$1920x1080.bik
Movie name: DW_Logo
Movie resolution: 1920x1080 -- Will only play if the game's resolution is 1920x1080
Variables
MovieList - The list of movies to play in order. This list expects movie names, not filenames. See above for expected formatting
vFallbackResolution - If the game is playing at an unsupported resolution, which movie resolution exists. The safest practice is to provide the lowest-possible movie resolution to most-likely ensure the player can at least see the movie. If the movie is too big, it will fail to render, as explained above
nEventToFireWhenFinished - When every movie has finished playing, the event to fire to
bStopMusicDuringMovies - If true, all music will be temporarily paused during the playback of the movie(s)
bPickRandom - If true, a single movie is randomly picked from the movie list, and only that movie will play
bKeepHUDHiddenAfterMovies - By default, the movie manager disables the player's HUD during movie playback (for various reasons). If you're using this movie manager in a cutscene map, it's typically safe to assume this should be set to true
fMusicFadeTime - If relevant, how long should it take for the music to fade in and out during movie playback
A music manager that allows you to easily make a global dynamic music script.
To make a script, you need to add a music event. Assign it the event type and song you want, as those are the 2 most important variables to assign. The event type variable is the variable that dictates the condition of which event must occur for that music event to trigger (see below to learn how you can use these event types). When a level is loaded, the music manager will constantly check every condition to see if any are true. Music events that are at the top of the MusicEvents array have the highest priority for being played. Due to this, it's typical to have the final music event have an event type of none, since this will essentially make that event the default background music, unless an event is happening.
Notice: multiple of these infos can be placed, but bEnabled must be disabled for all music managers, except for 1.
Event Types:
None - A music event with no condition. If every event type's condition returns false, then the first music event in MusicEvents will be run
Condition Tag X Enabled - Returns true if a TriggeredCondition with the tag X is bEnabled=true
Cutscene Playing - Returns true if a cutscene is currently playing
Movie Playing - Returns true if a movie is currently playing
Below X Health - Returns true if the current player is below X health
Below X Percent Health - Returns true if the current player is below X percent health (Format: 0.5 = 50%)
X Or More Coins - Returns true if the current player has X or more coins
Fighting X Enemies - Returns true if the current player is fighting X or more enemies
Fighting Boss - Returns true if the current player is fighting a boss
Within X Distance From Enemies - Returns true if the current player is X units in range of any enemy
Within X Distance From Shamrock - Returns true if the current player is X units in range of any shamrock
Touching Class X Actor - Returns true if the current player is touching an actor with the class X (Format: SHGame.Shrek)
Elapsed Level Time Higher Than X - Returns true if the current level's elapsed time exceeds or is equal to a value of X
Variables
MusicEvents.EventType - What type of music event should this be (which condition to use)
MusicEvents.sSong - The name of the song
MusicEvents.fFadeTime - How long it should take to fade to song MusicEvents.sSong in seconds
MusicEvents.fLullPeriod - Once this music event starts, how long should it take in seconds before the music event can change
MusicEvents.bInvertEventCondition - If true, inverts the condition set by MusicEvents.EventType
MusicEvents.OptionalVar - The value of X (depends on MusicEvents.EventType)
MusicEvents.nEventToFire - If this music event is triggered, which event to fire to
bEnabled - If true, this music manager is enabled
Fires an event depending upon said game event being fired to. This can be used to create custom events upon a save game or a load game, which is very helpful in some scenarios.
Notice: Pre means before the action happens and Post means after the action has happened.
Variables
OnPreSaveGameEvent - On event PreSaveGame(), what event to fire to. PreSaveGame() is fired to when a save begins
OnPostSaveGameEvent - On event PostSaveGame(), what event to fire to. PostSaveGame() is fired to when a save has finished
OnPostLoadGameEvent - On event PostLoadGame(), what event to fire to. PostLoadGame() is fired to when a load has finished
Contains many patches that can be injected into any map. Simply enable which patches you want to enable and they will be automatically injected into the map on each map load.
List of patches available:
Potion Pushing - PressureVolume's with a specific tag will push potions.
Shimmyable Meshes - StaticMeshActor's with a specific tag can be shimmyed across. MStaticMeshActor makes this irrelevant due to the variable needed for adjustment being exposed from within a MStaticMeshActor.
Fog Enforcement - ZoneInfo's can use occluding fog. Normally you cannot add occluding fog to ZoneInfo's, but with this patch, you can.
Steed Double Jump Fix - Steed's double jump is matched to that of the one seen in Prison Steed.
PIB Factory Fall Damage - Makes PIB take the same amount of fall damage seen in FGM PIB.
GameState Exclusions Destroy Actors - If an actor is excluded via a GameState, the actor will fully be destroyed, instead of being made invisible.
Swinging Ball Hitbox Fix - Makes the collision of all swinging balls a cylindrical hitbox instead of a huge and in-accurate box hitbox. This does come at the cost of being able to jump through the collision of the swinging ball.
Projector Break Fix - Fixes a bug in the game where loading a save in a level with projectors would cause all projectors to stop working.
Default Emitter Opacity Fix - Fixes the opacity values of all emitters so that they appear as normal. The editor view will still show the broken opacity values, but not in-game.
Assign Default Material Types For Materials - Allows you to manually assign material types to materials. Example: making grass act like water. This patch is permanent until either the game is reset or a level is loaded with MPatcher with this patch disabled.
Mover With Tag Uses Spring Glide Type - Mover's with a specific tag will use the spring glide type, meaning the mover will spring when it reaches its final key.
Assign Level ID - Allows the mapper to assign the map a specific ID. This is typically used for beanstalk world identification.
List of cosmetic patches available:
Disable Persistent Store - Disables the persistent store. The persistent store is what causes "random" objects to disappear across level loads. This only takes place after the level is loaded, so if the patch wasn't enabled in the previous level, the bug will persist until the level is reset or until the next level is loaded.
Cheat Manager Fix - Fixes a bug where the current player loses access to cheat protected console commands after loading a save.
Fix Health Persistence - Fixes a bug where saves do not properly remember how much health all playable characters have.
Add Pickup Shading - Forces all pickups to have shading, resulting in a better visual appearance at the cost of very little performance. This is advantageous to use especially if your level is using MPickup's since they have shading by default. This patch in particular is permanent until either the game is reset or a level is loaded with MPatcher with this patch disabled.
Variables
PatchesToApply - Which patches to apply. See list of patches above. OptionalOptions are only applicable based on the enabled patches
OptionalOptions.PressureVolumeTag - The tag of each PressureVolume to affect
OptionalOptions.ShimmyPipeTag - The tag of each shimmy pipe to affect
OptionalOptions.FogActions.ZoneInfoTag - What ZoneInfo tag to locate
OptionalOptions.FogActions.DistanceFogColor - What color should the fog be
OptionalOptions.FogActions.DistanceFogStart - When should the fog start in units
OptionalOptions.FogActions.DistanceFogEnd - When should the fog end in units
OptionalOptions.bDefaultMaterialTypes - If true, defaults the material type of all main materials in the game (ones used in all stock levels)
OptionalOptions.MaterialActions.Material - What Material to modify
OptionalOptions.MaterialActions.MaterialType - What MaterialType to assign to Material
OptionalOptions.sNewLevelID - What the new level ID should be. If the new level ID is exactly equal to Beanstalk (starting from the left of the text, case-sensitive, and any text can be added after the phrase Beanstalk), then the game will identify the current level as a beanstalk world. When this occurs, the player that was played in the last map will be who is played in the map loaded with the Beanstalk ID, of course provided that the map contains a pawn with the tag of the last played pawn. This can not only be helpful for custom beanstalk worlds, but it can also allow for open-world-type maps. It's very important to mention that the current player's tag will be overwritten to equal 'MainPlayer' by default, which is important to keep in mind for any sort of scripts which may rely on locating a pawn with a specific tag
SpringGlideTypeMoverTags - The tag of each Mover to affect
Allows you to override collision flags across a specific type of static mesh model type. Example: you could provide a bush model and then have all bushes get their collision turned off when the map loads, but NOT in the editor, which allows for having shadows for the bush, even when the bush has no collision enabled for it in game.
You can also make exceptions that are tag-based, so if you want a whole type of static mesh to have no collision, except for a specific group of them, you can give them all the same exception tag and they won't have their collisions modified.
Variables
CollisionsToChange.StaticMeshTypeToUse - What StaticMesh to locate
CollisionsToChange.bCollideActors - The new value of bCollideActors
CollisionsToChange.bCollideWorld - The new value of bCollideWorld
CollisionsToChange.bBlockActors - The new value of bBlockActors
CollisionsToChange.bBlockPlayers - The new value of bBlockPlayers
CollisionsToChange.bBlockZeroExtentTraces - The new value of bBlockZeroExtentTraces
CollisionsToChange.bBlockNonZeroExtentTraces - The new value of bBlockNonZeroExtentTraces
CollisionsToChange.bBlocksCamera - The new value of bBlocksCamera
CollisionsToChange.nTagException - If the tag of a located StaticMeshActor matches this variable's tag, no collision changes will be made
A timer that starts upon spawning into a level. This is helpful for when you need to run a local timer or when you need the total amount of time a level has been running for. The variable fTimeElapsed contains how much time has passed.
Variables
fTimerEndTime - What time the timer should end at
fTimeElapsed - How much time has passed since this info has spawned in
TimerEndEvent - What event should be fired to upon the timer ending
bUnlimitedTimer - If true, the timer will never stop counting up, and can act as a sort of level timer that can be tracked via certain methods