> For the complete documentation index, see [llms.txt](https://axiomemu.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://axiomemu.gitbook.io/docs/data/item/itempageeffects.md).

# ItemPageEffects

Per-mesh-page glow, scale, spin/bob animation, and cloth-cape overrides for custom item models

Fine-grained visual overrides for individual mesh pages of a custom item model. This is a sparse layer on top of the per-item `BlendMesh` value in [CustomItemVisual.xml](/docs/data/plugins/customitemvisual.md): use it only for the edge-case items (in practice, specific wings and weapons with animated effect meshes) where one `BlendMesh` value cannot express what you want - for example page 1 glowing blue and scrolling, page 2 a smaller static white glow, and every other page solid. Pages can also carry geometric animation: a continuous spin and/or a back-and-forth bob, for effect meshes that rotate in place on the original model (a bow-tip orb, a floating crystal).

The file is optional. If it is absent or malformed, no page overrides are applied and the server keeps running. The server sends the whole table to the client at login; the client does the rendering.

## File Location

```
Data/Item/ItemPageEffects.xml
```

Loaded once at GameServer startup.

## Dependencies

* Layers on top of the `BlendMesh` attribute in [CustomItemVisual.xml](/docs/data/plugins/customitemvisual.md). See the layering rules below.
* `Type` / `Index` identify the item, matching [Item.xml](/docs/data/item/item.md).
* Delivered to the client at login. A player who is already online needs to re-login to receive changes.

## Configuration

One `<Page>` row configures one mesh page of one item.

{% hint style="info" %}
To find the right `Page` index and inspect a model's pages and animations, open the item's `.bmd` in the [MU Online BMD Viewer](https://github.com/xulek/muonline-bmd-viewer). It lists mesh pages in the same order the game uses.
{% endhint %}

```xml
<ItemPageEffects>
    <Page Type="12" Index="267" Page="1" R="40" G="90" B="255" Scale="1.0" Animate="1" Speed="0.5" />
    <Page Type="4" Index="34" Page="2" R="60" G="140" B="255" Animate="1"
          SpinAxis="Z" SpinSpeed="180" OscAxis="Y" OscAmp="5" OscHz="0.8" />
    <Page Type="12" Index="267" Page="0" Cloth="1" ClothBone="19" ClothFlags="Curved|ShortShoulder|Heavy" />
</ItemPageEffects>
```

### Glow attributes

| Attribute       | Type   | Range              | Default | Effect                                                                                                                                    |
| --------------- | ------ | ------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `Type`          | int    | 0-15               | -       | Item category. Wings = 12                                                                                                                 |
| `Index`         | int    | 0-511              | -       | Sub-index within the category (the item)                                                                                                  |
| `Page`          | int    | 0+                 | 0       | Mesh page index inside the item's model (0, 1, 2, ...). This is the page the row affects                                                  |
| `R` / `G` / `B` | int    | 0-255              | 255     | Additive color tint of the glow. `255/255/255` = untinted, `40/90/255` = blue glow                                                        |
| `Scale`         | float  | 0+                 | 1.0     | Per-page geometry scale around the page origin. `1.0` = unchanged, `0.5` = half size, `2.0` = double. Use for pages that import too large |
| `Animate`       | int    | 0-1                | 1       | `1` = the additive glow scrolls, `0` = static additive glow                                                                               |
| `Speed`         | float  | 0+                 | 0       | Scroll speed multiplier when `Animate="1"`. `1.0` = original speed, `0.25` = slower. `0` = fall back to the item's `EffectSpeed` default  |
| `UVMode`        | string | `V` / `U` / `Both` | `V`     | Which texture axes the `Animate` scroll moves along. `V` = vertical (the classic glow scroll), `U` = horizontal, `Both` = diagonal        |

### Geometric animation attributes

Optional per page: spin the page continuously and/or bob it back and forth. Both motions happen around the page's own centre, in the **item's local frame** (the X/Y/Z of the model itself, not world axes), so the effect stays glued to the weapon through every character animation. Combine freely with the glow attributes - a spinning page can still be tinted and scroll its texture.

{% hint style="info" %}
There is no universal rule for which local axis is "along the bow" for a given model - if the spin plane looks wrong, just try each of `X` / `Y` / `Z`.
{% endhint %}

| Attribute   | Type   | Range           | Default | Effect                                                                                                                            |
| ----------- | ------ | --------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `SpinAxis`  | string | `X` / `Y` / `Z` | *(off)* | Axis the page rotates around, in the item's local frame. Omit for no spin                                                         |
| `SpinSpeed` | float  | any             | 0       | Rotation speed in degrees per second. `180` = half turn per second, `360` = one full turn per second. Negative reverses direction |
| `OscAxis`   | string | `X` / `Y` / `Z` | *(off)* | Axis the page bobs (oscillates) along, in the item's local frame. Omit for no bob                                                 |
| `OscAmp`    | float  | 0+              | 0       | Bob distance in model units - the peak offset from the rest position, so total travel is twice this                               |
| `OscHz`     | float  | 0+              | 1.0     | Bob speed in full cycles per second. `0.5` = one full back-and-forth every 2 seconds                                              |
| `OscPhase`  | float  | 0-360           | 0       | Phase offset in degrees. Give two bobbing pages different phases so they do not move in lockstep                                  |

### Cloth-cape attributes (wings only)

{% hint style="info" %}
For a full decorated cape — simulated drape **plus** side banners **plus** rigid ornament pieces that track the body — use `RenderAs="cape_cloth"` with the per-mesh role attributes in [CustomItemVisual.xml](/docs/data/plugins/customitemvisual.md#custom-capes-cape_cloth) instead. The `Cloth` page here converts one page to cloth but leaves the remaining pages rendered in the model's own space, which makes imported ornaments float out of place.
{% endhint %}

Setting `Cloth="1"` replaces that page with a draping cape sheet instead of rigid geometry. The page is rendered as a procedural cloth sheet - the same simulator every vanilla Dark Lord and Rage Fighter cape uses - hung from the player's back and wearing that page's texture. The other pages of the wing keep rendering solid. It is not the page's exact geometry, it is a simulated sheet carrying the page's texture, which is what actually reads as a cape.

| Attribute    | Type   | Default   | Effect                                                                                                                                                                  |
| ------------ | ------ | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Cloth`      | int    | 0         | `1` = render this page as a draping cape sheet. A cloth page ignores `R` / `G` / `B` / `Animate` / `Scale`                                                              |
| `ClothBone`  | int    | 0         | Player back bone the cape hangs from. `19` is the standard cape bone and is used when this is left `0` or `-1`. Try `17` / `18` / `20` to raise or lower the attachment |
| `ClothFlags` | string | *(empty)* | Physics and look tuning, pipe-separated tokens (see below). Empty applies the client's default cloth tuning                                                             |

`ClothFlags` tokens (combine one from each group with `|`):

| Group   | Tokens                                     | Notes                                                                                      |
| ------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ |
| Shape   | `Flat`, `Curved`, `Sticked`                | Overall drape shape                                                                        |
| Spread  | `ShapeNormal`, `ShortShoulder`, `Cylinder` | Width across the shoulders                                                                 |
| Elastic | `Cotton`, `Rubber`, `Rubber2`              | `Rubber` / `Rubber2` add more wind sway                                                    |
| Weight  | `NormalThickness`, `Heavy`                 | `Heavy` hangs lower                                                                        |
| Draw    | `MaskAlpha`, `MaskBlend`, `MaskLight`      | `MaskAlpha` if the texture has transparency; `MaskLight` draws the sheet as additive light |

Collision is automatic (standard cape collision spheres).

## Important Behavior

* **Layering with `BlendMesh`.** An item with no `<Page>` rows here keeps using its `CustomItemVisual.xml` `BlendMesh` value (the majority of items - leave them alone). An item with one or more `<Page>` rows here: those rows become authoritative for that item. Each listed page renders additive with its own tint, scroll, and scale; every page not listed renders solid; the item's `BlendMesh` is ignored.
* **BMD path only.** Page overrides go through the normal model render path, so they only affect items drawn as a regular model. They do not apply to capes on the `RenderAs="cape_cloth"` procedural-cloth path in CustomItemVisual.xml.
* **Geometric animation follows the item.** Spin and bob run in the item's local frame around the page's own centre, so the motion tracks the weapon through walking, attacking, and mounting. The animation is time-based and frame-rate independent; every player sees the same phase.
* **Finding the page.** Count the mesh pages in the item's model to find the right `Page`; the glow page is usually the last one.
* **Optional file.** A missing or malformed file syncs nothing and does not raise an error.

## Common Issues

* **A page override does nothing** - the item has a `<Page>` row, but not for the page you expected. Remember that once any row exists for an item, unlisted pages render solid and `BlendMesh` is ignored.
* **Whole item went solid after adding one row** - that is the layering rule. List every page you want additive, not just the new one.
* **The page spins in the wrong plane** - the axes are the model's local frame and differ per asset. Cycle `SpinAxis` through `X` / `Y` / `Z`; same for `OscAxis`.
* **The whole page orbits instead of spinning in place** - the row is probably targeting the wrong `Page`; the rotation pivot is the centre of the page you configured, so a row aimed at a large combined page swings everything around its combined centre.
* **Cloth page shows no cape** - `Cloth` only works on wing items rendered as a regular model, not on items using `RenderAs="cape_cloth"`. Check the page index and the texture on that page.
* **Cloth cape sits too high or too low** - adjust `ClothBone` (`17` / `18` / `20`) rather than the flags.
* **Change not visible in game** - the table is sent at login; re-login to pick it up.
