Repository navigation
CustomMaps ObjectTables
Two tables decide what the objects of a world do on their own: which particle effects
hang off them, and how their animations play and follow one another. Both are per
world, and both live inside the client's Data\Lang.mpr:
Data\Lang.mpr
EffectInfo\EffectInfo<n>.txt effects attached to objects
MapObjectAnimationInfo\MapObjectAnimationInfo<n>.txt animation behaviour of objects
Values that refer to each other carry the same mark: 🟦 object type, 🟩 animation, 🟧 bone - see How the two files link.
<n> is the world folder number, not the map number - the same convention as
Data\World<n>\:
| Map number | World folder | Tables |
|---|---|---|
| 63 | Data\World64\ |
EffectInfo64.txt, MapObjectAnimationInfo64.txt
|
| 138 | Data\World139\ |
EffectInfo139.txt, MapObjectAnimationInfo139.txt
|
Both files are optional; a world without one simply has no entries. Custom maps are read too, up to map 199.
The tables are looked up by world number, so a copied world's objects keep their types
but lose everything the tables gave them. A world copied from World64 needs
EffectInfo64.txt and MapObjectAnimationInfo64.txt copied to EffectInfo<n>.txt and
MapObjectAnimationInfo<n>.txt under its own number.
Plain text, one row per line, values separated by a single TAB, no header row.
Two TABs in a row make an empty value and shift every later column by one. The row still loads, with its scale, bone and the rest in the wrong places.
Each row hangs one particle effect off every object of one type.
| Column | Value | Meaning |
|---|---|---|
| 1 | 🟦 object type | the type as placed in EncTerrain<n>.obj
|
| 2 | effect | Data\Effect\<name>.ein |
| 3 4 5 | offset X Y Z | from the attachment point |
| 6 7 8 | rotation X Y Z | in degrees |
| 9 | scale | multiplied by the object's own scale |
| 10 | 🟧 bone |
-1 for the object's origin, otherwise a bone of its model |
| 11 | follow rotation |
1 the effect turns with the bone, 0 it follows only its position and scale |
| 12 | object colour |
1 the effect takes its colour from the object |
| 13 | 🟩 animation | the object animation it runs in; -1 for every animation |
| 14 | start frame | the frame of that animation it starts at |
From EffectInfo64.txt:
71 Data\Effect\fire02-red03.ein 15 -20 0 -90 0 0 50 43 1 0 1 0
Every object of type 71 burns at bone 43, offset 15 / -20 / 0, turned -90 degrees around X, at scale 50, turning with the bone - and only while the object plays animation 1.
Write 11 values or 14, never 12 or 13. Columns 12 to 14 are read as soon as a row has a 12th value, with no further check, so a row of 12 or 13 is read past its end. A row of 11 runs in every animation, but its colour and start frame are never set and hold whatever was left in memory - write all 14 whenever either matters.
A row with the same 🟦 object type, the same .ein and the same 🟧 bone as an earlier
one does not add a second effect: its 🟩 animation joins the earlier row's animations,
and everything else in it is ignored. Repeat the row with another animation to run
one effect in several. EffectInfo139.txt puts one twister on object 177 - the gate
further down - in animations 0, 1 and 3:
| Type | Effect | Offset | Rotation | Scale | Bone | Follow | Colour | Anim | Start |
|---|---|---|---|---|---|---|---|---|---|
| 🟦 177 | Data\Effect\twister19-yellow01.ein |
0 0 45 | 0 0 0 | 285 | 🟧 17 | 1 | 0 | 🟩 0 | 0 |
| 🟦 177 | Data\Effect\twister19-yellow01.ein |
0 0 45 | 0 0 0 | 285 | 🟧 17 | 1 | 0 | 🟩 1 | 0 |
| 🟦 177 | Data\Effect\twister19-yellow01.ein |
0 0 45 | 0 0 0 | 285 | 🟧 17 | 1 | 0 | 🟩 3 | 0 |
Those are three of the gate's four states - closed, opening and closing - so the twister shows everywhere except while the gate stands open.
A row with -1 in column 13 is never merged - it always adds a new effect.
Each row is one state: while objects of this type play animation A, play it at this speed and move on by this rule. The rows of one object type chain into a small state machine.
| Column | Value | Meaning |
|---|---|---|
| 1 | 🟦 object type | the type as placed in EncTerrain<n>.obj; below 1000
|
| 2 | 🟩 animation | the animation this row describes |
| 3 | speed | playback speed; map objects start at 0.16
|
| 4 | behaviour |
0 to 8, below |
| 5 | distance | player distance, used by behaviours 5 and 7 only |
| 6 and on | parameters | depend on the behaviour |
The type has to stay below 1000 because the client folds type and animation into one
key, 1000 x animation + type - type 1000 in animation 0 is the same entry as type 0
in animation 1. Keep one row per type and animation.
A row needs at least five values. The client only checks that it is not empty before reading the first five.
| Behaviour | Parameters | |
|---|---|---|
0 |
loops the animation | none |
1 |
when the animation ends, switches | 6: 🟩 next animation |
2 |
repeats a random number of times, then switches | 6: fewest, 7: most, 8: 🟩 next animation |
3 |
as 2, but picks the next animation at random |
6: fewest, 7: most, 8 and on: 🟩 animations to pick from |
4 |
follows a game-wide state instead of the player | 6: condition, last: 🟩 next animation |
5 |
reacts to the player's distance | 6: condition, 7: 🟩 next animation |
6 |
as 4, once per change |
6: condition, last: 🟩 next animation |
7 |
as 5, once until the player leaves the range |
6: condition, 7: 🟩 next animation |
8 |
fades the object while it hides the player | 6-8: box size, 9-11: box offset, 12: fade rate |
For 5 and 7 the condition is 0 the player comes closer than column 5, 2 the
player moves farther than column 5, 1 or 3 the animation ends. Four rows of
MapObjectAnimationInfo139.txt make a gate - each row's next animation is the
animation of the row after it:
| Type | Anim | Speed | Behaviour | Distance | Condition | Next |
|---|---|---|---|---|---|---|
| 🟦 177 | 🟩 0 | 0.16 | 5 | 300 | 0 | 🟩 1 |
| 🟦 177 | 🟩 1 | 0.30 | 5 | 300 | 1 | 🟩 2 |
| 🟦 177 | 🟩 2 | 0.16 | 5 | 300 | 2 | 🟩 3 |
| 🟦 177 | 🟩 3 | 0.26 | 5 | 300 | 3 | 🟩 0 |
Closed 0 → the player comes within 300 → opening 1 → it ends → open 2 → the player
leaves → closing 3 → it ends → closed again.
4 and 6 watch a state of the game that has not been identified; stay with 5 and
7 for your own objects.
8 never changes the animation. It builds a box around the object and, while the box
stands between the camera and the player, fades the object towards 10% opacity; it
returns to full once the view is clear.
| Column | Value | Meaning |
|---|---|---|
| 5 | distance | not used by 8 - the client's own files write 300 |
| 6 7 8 | box size X Y Z | multiplied by the object's scale |
| 9 10 11 | box offset X Y Z | from the object's origin |
| 12 | fade rate | x 0.01 - the fraction of the way the object moves each frame; without it the rate stays what the object had |
From MapObjectAnimationInfo146.txt:
| Type | Anim | Speed | Behaviour | Distance | Size | Offset | Rate |
|---|---|---|---|---|---|---|---|
| 🟦 17 | 🟩 0 | 0.16 | 8 | 300 | 250 250 700 | 0 0 0 | 7 |
| 🟦 13 | 🟩 0 | 0.16 | 8 | 300 | 610 100 345 | 0 0 150 | 7 |
Custom maps read their own table like any other world, so a behaviour 8 row works on them unchanged. To open a roof by where the player stands rather than by the camera, or a building of several pieces as one, use a map script - see Fading roofs.
| Value | Where it appears | What it must match | |
|---|---|---|---|
| 🟦 | object type | EffectInfo column 1, MapObjectAnimationInfo column 1 | the type of the object in EncTerrain<n>.obj
|
| 🟩 | animation | MapObjectAnimationInfo column 2 and its next-animation parameters, EffectInfo column 13 | an animation the object's model has |
| 🟧 | bone | EffectInfo column 10 | a bone of the object's model |
🟩 is what ties the files together: an effect whose column 13 says animation 1 shows only while the object's state machine is in its animation-1 row.
In World64, object 69 idles in animation 0, every few loops plays animation 1 once,
and a spark shows at bone 44 from frame 9 of it.
MapObjectAnimationInfo64.txt:
| Type | Anim | Speed | Behaviour | Distance | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|
| 🟦 69 | 🟩 0 | 0.16 | 2 | 0 | 2 fewest | 5 most | 🟩 1 next |
| 🟦 69 | 🟩 1 | 0.16 | 1 | 0 | 🟩 0 next |
EffectInfo64.txt:
| Type | Effect | Offset | Rotation | Scale | Bone | Follow | Colour | Anim | Start |
|---|---|---|---|---|---|---|---|---|---|
| 🟦 69 | Data\Effect\sparkle29-yellow01.ein |
0 50 70 | 80 0 0 | 20 | 🟧 44 | 1 | 0 | 🟩 1 | 9 |
- Adding a map - copying a world, and its tables with it
- Map scripts - effects and animation a table cannot express
-
Objects and the sandbox -
o:SetActionand spawning from Lua - Fading roofs - behaviour 8 next to the map-script fades
MuLua Scripting Plugin | Home
🖼️ Lua UI
- File map
- Creating windows
- Client and server
- Designing a window
- Protocol
- Scrolling and scrollbars
- Controls
- Custom text
- Text input
- Debug console
- Bitmap Slicer
- Encrypting scripts
Maps
Monsters
Shared
Version 1.14 | 2026-09-09